我有这段代码,以实例化一个精灵

AppleSpawner.cs

public class appleSpawner : MonoBehaviour
{
  private int isRunning = 1;
  private readonly int[] positions = { -10, -5, 0, 5, 10 };
  public int NumberOfSeconds;
  System.Random rand = new System.Random();

  private void Update()
  {
      if (isRunning == 1) StartCoroutine(Wait());
  }

  public IEnumerator Wait()
  {
      int randomX = rand.Next(5);
      isRunning = 0;
      yield return new WaitForSeconds(NumberOfSeconds);
      Instantiate(this, new Vector3(randomX, 5, 0), transform.rotation);

  }
}


问题1:这是在实例化新副本之间等待X秒的最佳/最简便方法吗?

我也有一个角色,发生oncollision事件,如果它与副本之一发生冲突,则应该销毁它。这可以正常工作,问题是,如果我与最后生成的副本冲突,它将销毁它,然后副本停止生成。

character.cs

private void OnCollisionEnter2D(Collision2D collision)
{
  if (collision.gameObject.tag == "apple")
    {
        Destroy(collision.gameObject);
        points++;
        text.text = "points: " + pont;
    }
}

最佳答案

首先,创建一个新的空游戏对象,称为“ Applespawner”。将Applespawner.cs放入其中。

改变这个

private void Update()
{
    if (isRunning == 1) StartCoroutine(Wait());
}




private void Start()
{
    if (isRunning == 1) StartCoroutine(Wait());
}


您在isRunning中将Awake()设置为0,在Update函数中调用IEnumerator是没有意义的。

您应该将此行添加到Applespawner.cs public GameObject Apple = null;

并将您的Apple预制件附加到编辑器中Applespawner.cs的Apple插槽中。如果您不知道如何制作预制件,请用谷歌搜索。

我认为有两种最好的方法可以每隔X秒启动游戏对象。


第一种方式

public IEnumerator Wait()
{
    while(true){
        yield return new Waitforseconds(X seconds);
        Instantiate an object.
    }
 }

第二种方式

float spawnRate = 1f;
float nextTimeToSpawn = 0;

private void Update()
{
    if (Time.time >= nextTimeToSpawn){

        nextTimeToSpawn = Time.time + 1f / spawnRate;
        //Spawn something
    }
}



我个人更喜欢第二种方式。希望这可以帮助。

10-05 17:55