繁体   English   中英

Unity2D:玩家收集10点后如何使生成对象逐渐加快速度?

[英]Unity2D: How to make spawn object gradually go faster after the player collects 10 points?

所以我想知道是否有一种方法可以使玩家(您的用户)收集10点后使生成的物体逐渐移动/移动得更快。 并且当玩家再收集10点等等时更快吗?

这是我的运动脚本附加到生成的对象上的:

public class Movement : MonoBehaviour
  {
   public static int movespeed = 20;
   public Vector3 userDirection = Vector3.right;

public void Update()
 {
    transform.Translate(userDirection * movespeed * Time.deltaTime); 
 }
}

这是我附在播放器上的得分脚本

public int Score;
public Text ScoreText;

void Start ()
{
    Score = 0;
    SetScoreText ();
}

void OnTriggerEnter2D(Collider2D other)
{
    if (other.gameObject.CompareTag ("Pick Up")) 
    {
        other.gameObject.SetActive (false);
        Score = Score + 1;
        SetScoreText ();
    }
}

void SetScoreText ()
{
    ScoreText.text = "Score: " + Score.ToString ();
} 

这是我的generateEnemy脚本:

public GameOverManager gameOverManager = null;

[HideInInspector]
public float minBlobSpawnTime = 2;
[HideInInspector]
public float maxBlobSpawnTime = 5;
[HideInInspector]
public bool generateBlobs = true;
[HideInInspector]
public GameObject blobPrefab = null;
[HideInInspector]
public GameObject blobRoot = null;
[HideInInspector]
public float minimumYPosition = -0.425f;
[HideInInspector]
public float maximumYPosition = 0.35f;

[HideInInspector]
public float minDaggerSpawnTime = 2;
[HideInInspector]
public float maxDaggerSpawnTime = 5;
[HideInInspector]
public bool generateDaggers = true;
[HideInInspector]
public GameObject daggerPrefab = null;
[HideInInspector]
public GameObject daggerRoot;
[HideInInspector]
public float minimumXPosition = -11.5f;
[HideInInspector]
public float maximumXPosition = 11.5f;

public Camera camera = null;

// Use this for initialization
void Start ()
{
    generateBlobs = ((generateBlobs) && (blobPrefab != null) && (blobRoot != null));
    generateDaggers = ((generateDaggers) && (daggerPrefab != null) && (daggerRoot != null));

    if (camera == null)
    {
        Debug.LogError("GenerateEnemy: camera is not set in the inspector. Please set and try again.");
        camera = Camera.main;
    }

    if (gameOverManager == null)
    {
        Debug.LogError("GenerateEnemy: gameOverManager not set in the inspector. Please set and try again.");
    }

    if (generateBlobs)
    {
        StartCoroutine(GenerateRandomEnemy(true, blobPrefab, blobRoot, minBlobSpawnTime, maxBlobSpawnTime));
    }

    if (generateDaggers)
    {
        StartCoroutine(GenerateRandomEnemy(false, daggerPrefab, daggerRoot, minDaggerSpawnTime, maxDaggerSpawnTime));
    }
}

// Update is called once per frame
void Update ()
{
    DestroyOffScreenEnemies();
}

// Spawn an enemy
IEnumerator GenerateRandomEnemy(bool generateOnYAxis, GameObject prefab, GameObject root, float minSpawnTime, float maxSpawnTime)
{
    if ((prefab != null) && (gameOverManager != null))
    {
        if (!gameOverManager.GameIsPaused())
        {
            GameObject newEnemy = (GameObject) Instantiate(prefab);
            newEnemy.transform.SetParent(root.transform, true);

            // set this in the prefab instead
            // newEnemy.transform.position = new Vector3(newEnemy.transform.parent.position.x, 0.5f, newEnemy.transform.parent.position.z);

            // or if you want the y position to be random you need to do something like this
            if (generateOnYAxis)
            {
                newEnemy.transform.position = new Vector3(newEnemy.transform.parent.position.x, Random.Range(minimumYPosition, maximumYPosition), newEnemy.transform.parent.position.z);
            }
            else
            {
                newEnemy.transform.position = new Vector3(Random.Range(minimumXPosition, maximumXPosition), newEnemy.transform.parent.position.y, newEnemy.transform.parent.position.z);
            }
        }
    }
    yield return new WaitForSeconds(Random.Range(minSpawnTime, maxSpawnTime));

    StartCoroutine(GenerateRandomEnemy(generateOnYAxis, prefab, root, minSpawnTime, maxSpawnTime));
}

public void DestroyOffScreenEnemies()
{
    GameObject[] enemies = GameObject.FindGameObjectsWithTag("enemy");
    if ((enemies.Length > 0) && (camera != null))
    {
        for  (int i = (enemies.Length - 1); i >= 0; i--)
        {
            // just a precaution
            if ((enemies[i] != null) && ((camera.WorldToViewportPoint(enemies[i].transform.position).x > 1.03f) || 
                                         (enemies[i].transform.position.y < -6f)))
            {
                Destroy(enemies[i]);
            }
        }
    }
}

}

(此脚本具有一个引用它的generateEnemyCustomEditor脚本,以显示在检查器中)

谢谢 :)

首先,从public static int movespeed = 20;删除static关键字public static int movespeed = 20; 并使用GameObject.Find("ObjectMovementIsAttachedTo").GetComponent<Movement>(); 如果要从另一个脚本修改movespeed变量,则获取脚本实例。

并且当玩家再收集10点等等时更快吗?

解决方案是直接的。 采用

if (Score % 10 == 0){
  //Increement by number (4) movespeed from Movement script
    movement.movespeed += 4;
} 

检查Score是否增加10,然后在条件true情况下将movespeed增加任何所需的值。 将Score加1后,将其放在OnTriggerEnter2D函数中是OnTriggerEnter2D

您的新score脚本:

public class score : MonoBehaviour
{
    public int Score;
    public Text ScoreText;

    private int moveSpeed;

    void Start()
    {
        Score = 0;
        SetScoreText();
    }

    void OnTriggerEnter2D(Collider2D other)
    {
        if (other.gameObject.CompareTag("Pick Up"))
        {
            other.gameObject.SetActive(false);
            Score = Score + 1;
            if (Score % 10 == 0)
            {
                //Increement by number (4) movespeed from Movement script
                moveSpeed += 4;
            }
            SetScoreText();
        }
    }

    public int getMoveSpeed()
    {
        return moveSpeed;
    }

    void SetScoreText()
    {
        ScoreText.text = "Score: " + Score.ToString();
    }
}

由于您的Movement脚本将被实例化,当你实例化它,您发送的参考播放器脚本。

public class Movement : MonoBehaviour
{
    public int movespeed = 20;
    public Vector3 userDirection = Vector3.right;

    score mySpeed;

    void Start()
    {
        //Send Movement instance to the score script
        GameObject scoreGameObject = GameObject.Find("GameObjectScoreIsAttachedTo");
        mySpeed = scoreGameObject.GetComponent<score>();
    }

    public void Update()
    {
        transform.Translate(userDirection * mySpeed.getMoveSpeed() * Time.deltaTime);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM