【问题标题】:Unity - Make Object disappear for a while and show againUnity - 使对象消失一段时间并再次显示
【发布时间】:2019-11-10 21:22:55
【问题描述】:

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

这是我的代码:

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

有人可以帮我弄清楚吗?

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    总的来说,从您的描述看来,您宁愿先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);
    }
    

    【讨论】:

      【解决方案2】:
          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.
      }
      

      【讨论】:

      • 但是当按下我玩游戏时,它不会循环播放。我希望输出隐藏,等一下,取消隐藏
      • @RakaAryaPratama it doesn't looping 是什么意思?另外,如果您希望它先隐藏,请先使用.SetActive(false);,然后将其设置为true,以便稍后显示。
      • @Kaynn 如果你这样做,虽然协程将停止运行,因此对象永远不会重新激活。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-04
      • 1970-01-01
      相关资源
      最近更新 更多