尽管处于活动状态,协同程序仍被检测为非活动状态

时间:2015-06-08 22:46:44

标签: c# unity3d

在我的游戏中,我希望敌人在攻击之前闪现。我创建了一个执行此操作的Flash()协程,但是当我尝试运行协程时,我收到以下错误:

“Coroutine无法启动,因为游戏对象'羊'不活跃!”

让我特别困惑的是,我检查了持有Animal.Flash()协程的对象是否处于活动状态,它是:

Animal oldAnimal = (GameObject.FindWithTag ("EnemyAnimal").GetComponent<Animal> ()) as Animal;

            Debug.Log("Active? " + oldAnimal.gameObject.activeInHierarchy);
            StartCoroutine(oldAnimal.Flash());

绵羊继承自动物,它是一种独行者。我对这里发生的事情感到茫然。

编辑:上面的Debug.Log()返回True。

Edit2:作为一种替代的闪烁方法,我通过oldAnimal测试了一个动画,它运行正常,表明协程是问题,而不是oldAnimal缺乏存在。太奇怪了。

Animator changeAnimation = (oldAnimal.GetComponentInChildren<Animator> ()) as Animator;
            changeAnimation.SetTrigger ("Attack"); // This works fine.

为了澄清,我不想这样做,因为它涉及为游戏中的每个生物创建动画,同时创建一个改变所选生物的精灵颜色的协程可以普遍应用。

这是协程:

public virtual IEnumerator Flash(){ 
    Color white; // Pure white.
    Color original; // Original color of animal sprite.
    color = GetComponent<SpriteRenderer> ().color; // Color of the animal.

    original = color;

    white.r = 255;
    white.b = 255;
    white.g = 255;
    white.a = 255;
    int i = 0;

    for (float f = 1f; f >= 0; f -= 0.008f) { // f -= controls the speed of the fade
        if (i == 0) {
            color = original;
            yield return null;
        }
        if (i == 1) {
            color = white;
            yield return null;
        }
    }
    color = original;
}

1 个答案:

答案 0 :(得分:1)

StartCoroutineMonoBehaviour的一种方法。因此,实际使用StartCoroutine的任何脚本实际上都是需要处于活动状态的对象。

您可以尝试oldAnimal.StartCoroutine(oldAnimal.Flash());

相关问题