我在Unity中制作了一个2d游戏,我正在使用此代码实例化敌人
void Update()
{
StartCoroutine("EnemyInstance");
}
IEnumerator EnemyInstance()
{
float positionRandoming = Random.Range(1f, 2f);
if (positionRandoming < 1.5f)
{
Instantiate(enemyPrefeb, new Vector3(-4.3f, -1.45f, 1f), position1.rotation, transform.parent);
enemyScript.pos = 1;
}
if (positionRandoming >= 1.5f)
{
Instantiate(enemyPrefeb, new Vector3(3.6f, -1.45f, 1f), position2.rotation, transform.parent);
enemyScript.pos = 2;
}
yield return new WaitForSeconds(2.4f);
}
在这段代码中,IENumator方法正在执行它们的工作,但没有产生返回新的WaitFor秒。意味着如果我在Unity中运行它,敌人会在每一帧中实例化。我该怎么解决呢?
我不是Unity开发者,但我相信有两个问题:
Update
调用它-所以每次,您都再次启动协程我怀疑您想从Start
而不是Update
调用它,并在方法中加入一个循环:
IEnumerator EnemyInstance()
{
while (true)
{
float positionRandoming = Random.Range(1f, 2f);
if (positionRandoming < 1.5f)
{
Instantiate(enemyPrefeb, new Vector3(-4.3f, -1.45f, 1f), position1.rotation, transform.parent);
enemyScript.pos = 1;
}
if (positionRandoming >= 1.5f)
{
Instantiate(enemyPrefeb, new Vector3(3.6f, -1.45f, 1f), position2.rotation, transform.parent);
enemyScript.pos = 2;
}
yield return new WaitForSeconds(2.4f);
}
}
每次调用update函数都会启动一个新的协同程序。
您可以添加bool值来检查协同程序当前是否正在运行。
private bool spawningEnemy = false;
void Update()
{
if(!spawningEnemy) {
spawningEnemy = true;
StartCoroutine("EnemyInstance");
}
}
IEnumerator EnemyInstance()
{
float positionRandoming = Random.Range(1f, 2f);
if (positionRandoming < 1.5f)
{
Instantiate(enemyPrefeb, new Vector3(-4.3f, -1.45f, 1f), position1.rotation, transform.parent);
enemyScript.pos = 1;
}
if (positionRandoming >= 1.5f)
{
Instantiate(enemyPrefeb, new Vector3(3.6f, -1.45f, 1f), position2.rotation, transform.parent);
enemyScript.pos = 2;
}
yield return new WaitForSeconds(2.4f);
spawningEnemy = false;
}
你想每2.4秒繁殖一次你的敌人吗?
上面的代码返回新的WaitForSeconds(2.4f)
在每一帧立即运行,无需任何等待,下面的代码等待2.4秒,在您的情况下为空。把你的代码放在下面,你就可以开始了。
void Update()
{
StartCoroutine("EnemyInstance");
}
IEnumerator EnemyInstance()
{
yield return new WaitForSeconds(2.4f);
float positionRandoming = Random.Range(1f, 2f);
if (positionRandoming < 1.5f)
{
Instantiate(enemyPrefeb, new Vector3(-4.3f, -1.45f, 1f), position1.rotation, transform.parent);
enemyScript.pos = 1;
}
if (positionRandoming >= 1.5f)
{
Instantiate(enemyPrefeb, new Vector3(3.6f, -1.45f, 1f), position2.rotation, transform.parent);
enemyScript.pos = 2;
}
}