问题描述
我正在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,position2.rotation,transform.parent);
enemyScript.pos = 2;
}
yield return new WaitForSeconds(2.4f);
}
在此代码中,IEnumerator方法正在执行其工作,但不会产生返回新的WaitForSeconds的操作。意味着如果我在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,position2.rotation,transform.parent);
enemyScript.pos = 2;
}
yield return new WaitForSeconds(2.4f);
}
}
,
每次调用更新函数都将启动一个新的协程。
您可以添加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,transform.parent);
enemyScript.pos = 1;
}
if (positionRandoming >= 1.5f)
{
Instantiate(enemyPrefeb,transform.parent);
enemyScript.pos = 2;
}
yield return new WaitForSeconds(2.4f);
spawningEnemy = false;
}
,
您想每2.4秒产生一个敌人吗?
yield return new 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,transform.parent);
enemyScript.pos = 1;
}
if (positionRandoming >= 1.5f)
{
Instantiate(enemyPrefeb,transform.parent);
enemyScript.pos = 2;
}
}