尽管协程处于活动状态,但仍被检测为非活动状态
本文关键字:活动状态 检测 程处于 | 更新日期: 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;
}
StartCoroutine
是MonoBehaviour
的一种方法。因此,实际使用StartCoroutine
的脚本实际上是需要激活的对象。
你可以试试oldAnimal.StartCoroutine(oldAnimal.Flash());