Unity-使对象消失一段时间并再次显示

我想制作可以消失一段时间的游戏对象。我写了这段代码,但是根本不起作用。

这是我的代码:

public class Fire : MonoBehaviour
{
    [SerializeField] int decreaseHealth;

    [SerializeField] GameObject handlerObject;

    GameHandler handler;

    void Start()
    {
        decreaseHealth = 10;

        handler = handlerObject.getcomponent<GameHandler>();
    }

    void OnTriggerEnter2D(Collider2D col)
    {
        if (col.gameObject.tag == "Player")
        {
            StartCoroutine(ShowAndHide(this.gameObject,2.0f)); // 2 second
            // Decrease Health
            handler.decreaseHealth(decreaseHealth);
        }
    }

    IEnumerator ShowAndHide(GameObject go,float delay)
    {
        go.Setactive(true);
        yield return new WaitForSeconds(delay);
        go.Setactive(false);
    }
}

有人可以帮我弄清楚吗?

wspanwb 回答:Unity-使对象消失一段时间并再次显示

通常,从您的描述来看,您似乎想先SetActive(false),然后再延迟SetActive(true)!目前,您正相反。


在这里我使用协程,因为它会阻碍您完全停用该对象。由于您停用了该对象,因此协程不再运行。


请使用Invoke,它也适用于已停用的对象。

顺便说一句,宁愿使用CompareTag而不是使用==直接比较字符串。速度稍快,但更重要的是,CompareTag如果给定的标记名拼写错误或根本不存在,则会引发异常。使用==会隐藏此“错误”,并花费您大量的开发时间和神经;)

private void OnTriggerEnter2D(Collider2D col)
{
    if (col.CompareTag("Player"))
    {
        HideAndShow(2.0f); // 2 second
        // Decrease Health
        handler.decreaseHealth(decreaseHealth);
    }
}

private void HideAndShow(float delay)
{
    gameObject.SetActive(false);

    // Call Show after delay seconds
    Invoke(nameof(Show),delay);
}

private void Show ()
{
    gameObject.SetActive(true);
}
,
    StartCoroutine(ShowAndHide(this.gameObject,2.0f)); // 2 second
    //Decrese Health
    handler.decreaseHealth(decreaseHealth);
    Destroy(this.gameObject); // <- this

您在隐藏和显示的游戏对象中销毁了它。

协程与其他代码异步运行,因此,如果要在隐藏自身后销毁它,请改为在协程中进行操作,如下所示:

IEnumerator ShowAndHide(GameObject go,float delay)
{
    go.SetActive(true);
    yield return new WaitForSeconds(delay);
    go.SetActive(false);
    Destroy(go); // Destroy after it has hidden itself.
}
本文链接:https://www.f2er.com/3130683.html

大家都在问