【问题标题】:Need to add a 3 second delay before scene switch on trigger collision场景切换触发碰撞前需要添加 3 秒延迟
【发布时间】:2019-08-31 17:23:05
【问题描述】:

好的,一旦玩家满足条件,玩家就会进入 npc 的触发对撞机,并触发对话和场​​景切换,以便他可以进入 2 级。我需要给玩家时间阅读对话(4 秒)所以我需要在场景切换之前添加一个延迟。我将如何做到这一点? (我只是一个初学者,所以要清楚)。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class SceneChanger : MonoBehaviour
{
    public int sceneNumber;
    public Text counter;
    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.CompareTag("player") && counter.text == "X 3")
        {
            SceneManager.LoadScene (sceneNumber);
        }
    }
}

【问题讨论】:

    标签: c# unity3d game-engine


    【解决方案1】:

    您可以使用协程添加延迟

    文档:https://docs.unity3d.com/Manual/Coroutines.html

    private void OnTriggerEnter2D(Collider2D collision)
    {
    
        if (collision.CompareTag("player") && counter.text == "X 3")
        {
    
            StartCoroutine(SceneLoadWithDelay(sceneNumber, 4));
    
        }
    }
    
    IEnumerator SceneLoadWithDelay(int sceneNum, int numSeconds)
    {
        yield return new WaitForSeconds(numSeconds);
    
        SceneManager.LoadScene (sceneNum);
    }
    

    【讨论】:

    • 我不是 100% 确定 OnTriggerEnter2D 但它可能是一个开箱即用的协程,只需让它返回 IEnumerator,无需调用 StartCoroutine(我知道它适用于3D 版本,如 OnTriggerEnter)
    【解决方案2】:

    你可以使用协程。

     IEnumerator LoadSceneWithDelay()
    {
       yield return new WaitForSeconds(4);
       SceneManager.LoadScene (sceneNumber);
    }
    

    然后调用:

    StartCoroutine(LoadSceneWithDelay);
    

    https://forum.unity.com/threads/delay-before-loading-a-new-scene.512121/

    【讨论】:

      【解决方案3】:

      如前所述,您可以使用Coroutine,但实际上OnTriggerEnter2D 本身可以直接成为协程,而不需要StartCorotine 之类的

      private IEnumerator OnTriggerEnter2D(Collider2D collision)
      {
          // for IEnumerators "yield break" equals a "return" for void
          if (!collision.CompareTag("player") || !string.Equals(counter.text, "X 3")) yield break;
      
          // yield allows to interupt the routine here, render this frame
          // and continue from hier in the next frame
          // WaitForSeconds is a special IEnumerator provided by Unity for doing 
          // exactly that: yield until the given time has passed - then it allows to continue
          yield return new WaitForSeconds(4f);    
      
          SceneManager.LoadScene (sceneNumber);
      }
      

      或者,在延迟的简单情况下,您也可以使用Invoke

      private void OnTriggerEnter2D(Collider2D collision)
      {
          if (!collision.CompareTag("player") || !string.Equals(counter.text, "X 3")) return;
      
          Invoke("SwitchScene", 4f);  
      }
      
      private void SwitchScene()
      {
          SceneManager.LoadScene(sceneNumber);
      }
      

      【讨论】:

        猜你喜欢
        • 2019-07-18
        • 2018-11-07
        • 1970-01-01
        • 1970-01-01
        • 2023-03-06
        • 2011-11-28
        • 2017-03-20
        • 1970-01-01
        • 2022-06-11
        相关资源
        最近更新 更多