我搜索了使用WaitforSeconds并按原样使用(使用返回类型的IEnumeration并使用协程而不是更新)。但它不起作用。最初它显示Waitfor Seconds和IEnumerator不在当前上下文中出现"。我不得不重新安装统一来修复它,但这个问题仍然存在。以下是我的代码。我是否以正确的方式使用WaitforSeconds?这是'如果'破坏我完整工作的代码块(我的意思是我在错误的地方使用过它)?
using UnityEngine;
using System.Collections;
public class EnemyCreeator : MonoBehaviour
{
public float xmin,xmax,zmin,zmax;
public GameObject enemy;
public float spawnWait,StartWait,waveWait;
public int turretCount;
public int enemyCount;
int i=0;
void Update()
{
StartCoroutine (TurretWaves());
}
IEnumerator TurretWaves()
{
while (true)
{
Vector3 pos=new Vector3(Random.Range (xmin,xmax),0.5f,Random.Range(zmin,zmax));
yield return new WaitForSeconds(StartWait);
while(i<turretCount)
{
//Debug.Log ("The vaue of game time in spawnwaiting is: "+Time.time);
Instantiate (enemy, pos, Quaternion.identity);
enemyCount++;
i++;
//Debug.Log ("value of i in loop is: "+i);
//Debug.Log ("The vaue of game time is: "+Time.time);
yield return new WaitForSeconds (spawnWait);
}
//Debug.Log("cHECKing Before WAVE WAIT(value of time )is: "+Time.time);
yield return new WaitForSeconds(waveWait);
if(i>=turretCount)
{
i=0;
}
//Debug.Log("cHECKing AFTER WAVE WAIT and value of time is: "+Time.time);
//Debug.Log ("value of i outside the while loop is: "+i);
}
}
}
代码需要等到spawnWait才产生每个炮塔并等到wavewait生成下一个wave。即使Startwait工作正常,我仍然无法找到其他人的问题......
提前致谢。
答案 0 :(得分:2)
您的代码是正确的,但
除外df_attachment['Duplicate'] = df_attachment.duplicated('LowerFileName', keep=False)
通过这样做,您将在每一帧中创建一个新的协同程序。因此,在 Startwait 秒之后,每个运行的协同程序将在以下帧中生成一个敌人,使整个脚本无法正常工作。但事实上,每个协程都按预期工作。
要解决您的问题,请更改
void Update()
{
StartCoroutine (TurretWaves());
}
到
void Update()
或
void Awake()
这样只启动了一个协程。它应该按预期工作。
编辑#1:
我认为你误解了协同程序中的协同程序是如何工作的,因为你似乎正在使用void Start()
逐帧手动执行协程内的代码。
当Update
启动协程时,将在Unity内部注册“任务”。这个任务就像另一个线程(除了它仍然在主线程中)。 Unity将自动执行此任务中的代码。当它遇到StartCoroutine
语句时,它会暂停并等待语句结束。 (在内部,它会持续检查状态并确定何时应该恢复。)例如,yield
将使Unity暂时停止在协程内执行代码yield return new WaitForSeconds(n)
秒。之后,它会继续下去。
任务将被取消注册,直到不再执行代码(在您的情况下,由于while循环它永远不会结束),或者启动协程的游戏对象被销毁或停用。