c# - Unity - 让对象消失一段时间然后再次显示

标签 c# unity-game-engine

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

这是我的代码:

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);
    }
}

谁能帮我解答一下吗?

最佳答案

总的来说,从您的描述来看,您似乎更想先SetActive(false),然后在延迟后SetActive(true)!目前你的情况正好相反。


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


而是使用Invoke这也适用于停用的对象。

顺便说一句,也宁愿使用 CompareTag而不是使用 == 直接比较字符串。它的速度稍快一些,但更重要的是,如果给定的标签名称拼写错误或根本不存在,CompareTag 会引发异常。使用 == 会隐藏这个“bug”并花费您的开发时间和精力;)

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);
}

关于c# - Unity - 让对象消失一段时间然后再次显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58785119/

相关文章:

c# - Unity 3d 启用鼠标指针作为事件触发器的指针进入/退出

c# - 循环中的 WPF 应用程序,如何不让整个应用程序卡住?

android - play-games-plugin-for-unity - 显示特定排行榜

c# - 动态调用者给出错误 MissingMethodException : Method 'Clock.TEST' not found

unity-game-engine - Unity3d中如何去除地形上的线条?

c# - 预加载多对多 - EF Core

c# - 如何编写 nUnit/Moq 来测试通用扩展方法?

c# - 哪些开源 ASP.Net 项目值得学习?

ios - 是否可以有多个入口点来显示 1 个 iTunes 应用内购买?

android 应用程序在 unity3d 中无法正常工作