Unity - 如何与一系列协同程序和WaitForSeconds并行运行计时器

时间:2017-07-22 13:13:56

标签: unity3d unity5

在下面的代码中,我有一个出现和消失的敌人循环。

IEnumerator EnemyCycle()    {
while (isRepeating)
{

for (int j = 0; j < enemies.Length; j++) {

canStartUpdatingReset = true;
Enemy currentEnemy = enemies [j];
var _myMaterial = currentEnemy.GetComponent<Renderer>().material;
var _currentFade = StartCoroutine(FadeToForEnemy(_myMaterial, 0f, fTime, currentEnemy.gameObject, false));

coroutinesToStop.Add(_currentFade);

if (currentEnemy.hasWeapon) {
            weaponCycleCoroutines.Add(StartCoroutine(FadeToForWeapon(currentEnemy.weapon.GetComponent<Renderer>().material, 0f, fadeTime, currentEnemy.weapon, false)));

        }
}

yield return new WaitForSeconds (hideTime);

for (int j = 0; j < enemies.Length; j++) {

Enemy currentEnemy = enemies [j];
var _myMaterial = currentEnemy.GetComponent<Renderer>().material;
var _currentFade = StartCoroutine(FadeToForEnemy(_myMaterial, 1f, fTime, currentEnemy.gameObject, true));

 coroutinesToStop.Add(_currentFade);
 if (currentEnemy.hasWeapon) {
weaponCycleCoroutines.Add(StartCoroutine(FadeToForWeapon(currentEnemy.weapon.GetComponent<Renderer>().material, 1f, fadeTime, currentEnemy.weapon, true)));
}
yield return new WaitForSeconds (showTime);

        }
    }
}

我有一个enemyCycleDuration float

enemyCycleDuration = 60*(hideTime + fadeTime + showTime + fadeTime)

请注意,fadeTime来自FadeToForWeaponFadeToForEnemy。这里的想法是我希望enemyCycleDurationEnemyCycle()并行运行,以便在同时重置(请参阅下面的代码)

yield return new WaitForSeconds (showTime);
EnemyCycle()(方法结束)中达到

我将在更新方法中按以下方式重置enemyCycleDuration,但EnemyCycle()似乎在enemyCycleDuration之前,始终在enemyCycleDuration重置之前完成。如何让两者在时间上相互平行并同时完成?

if (canStartUpdatingReset)  {
timeElapsed +=1;
if(timeElapsed >= enemyCycleDuration) {

timeElapsed = 0;

Debug.Log ("Reset CycleDuration");
    }
}

1 个答案:

答案 0 :(得分:0)

当我需要类似于你要求的东西时,我不会使用协同程序。我用的是这样的东西:

int TimeBetweenAction1 = 3f;
int TimeBetweenAction2 = 3f;

void Update () {   
    if(Time.time > NextAction1){
        DoAction1();
    }

    if(Time.time > NextAction2){
        DoAction2();
    }

}

void DoAction1(){
    NextAction1 = Time.time + TimeBetweenActions1;
}

void DoAction2(){
    NextAction2 = Time.time + TimeBetweenActions2;
}

行动可能来自重生一种敌人或射击枪。你可以在gameObject中拥有所需的数量来管理重生的所有敌人,或者链接到场景中不同触发器的不同游戏对象......

我知道你确切地询问了协同程序,但这可能是一种更容易实现的方法。如果它对您的问题有用或者我需要澄清任何内容,请告诉我。