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

本文关键字:活动状态 检测 程处于 | 更新日期: 2023-09-27 17:54:19

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

"无法启动协程,因为游戏对象'Sheep'处于非活动状态!"

使这尤其令人困惑的是,我已经检查了保存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;
}

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

StartCoroutineMonoBehaviour的一种方法。因此,实际使用StartCoroutine的脚本实际上是需要激活的对象。

你可以试试oldAnimal.StartCoroutine(oldAnimal.Flash());