C# Unity 2D:WaitForSeconds()延迟不是';行不通

C# Unity 2D:WaitForSeconds()延迟不是';行不通,c#,unity3d,C#,Unity3d,我试图在player.healthDisplay.color=color.green和player.healthDisplay.color=color.white但此时返回新的WaitForSeconds(5)和 player.healthDisplay.color=color.white无效 这是我的密码: public void OnTriggerEnter2D(Collider2D other) { if (other.CompareTag("Player"))

我试图在
player.healthDisplay.color=color.green
player.healthDisplay.color=color.white
但此时
返回新的WaitForSeconds(5)
player.healthDisplay.color=color.white无效

这是我的密码:

public void OnTriggerEnter2D(Collider2D other)
{
    if (other.CompareTag("Player"))
    {
        StartCoroutine(ColorChange());           
    }
}

IEnumerator ColorChange()
{
    player.health++;
    Instantiate(effect, transform.position, Quaternion.identity);
    Destroy(gameObject);
    player.healthDisplay.color = Color.green;
    //until here code the code is working

    yield return new WaitForSeconds(5);
                         
    player.healthDisplay.color = Color.white;
}

如果您阅读了
monobhavior.startcroutine
文档,其中说明:

“当MonoBehavior被销毁或者MonoBehavior所连接的游戏对象被禁用时,协同程序也会停止。当MonoBehavior被禁用时,协同程序不会停止。”[]

因此,有一个简单的解决方法:

IEnumerator ColorChange()
{
    player.health++;
    Instantiate(effect, transform.position, Quaternion.identity);
    gameObject.SetActive(false);
    player.healthDisplay.color = Color.green;

    yield return new WaitForSeconds(5);
                     
    player.healthDisplay.color = Color.white;
    Destroy(gameObject);
}
如果您想知道为什么player.healthDisplay.color=color.green
仍然有效


“实际对象销毁始终延迟到当前更新循环之后,但始终在渲染之前完成。”[]

您正在销毁包含此脚本的游戏对象

Destroy(gameObject);
// color changing code, etc..
一旦游戏对象被销毁,该脚本将不再运行

您可以做的是(如果您需要立即销毁此游戏对象),将脚本添加到健康显示中,以处理颜色更改