在Unity中有许多等待的方法。它们非常简单,但我认为值得介绍最常用的几种方法:
1.使用协程和WaitForSeconds
。
这是最简单的方法。将需要等待一段时间的所有代码放入协程函数中,然后可以使用WaitForSeconds
进行等待。请注意,在协程函数中,您需要使用StartCoroutine(yourFunction)
调用函数。
以下示例将旋转90度,等待4秒钟,旋转40度并等待2秒钟,最后旋转20度。
void Start()
{
StartCoroutine(waiter());
}
IEnumerator waiter()
{
transform.Rotate(new Vector3(90, 0, 0), Space.World);
yield return new WaitForSeconds(4);
transform.Rotate(new Vector3(40, 0, 0), Space.World);
yield return new WaitForSeconds(2);
transform.Rotate(new Vector3(20, 0, 0), Space.World);
}
2.使用协程和WaitForSecondsRealtime
。
WaitForSeconds
和WaitForSecondsRealtime
之间唯一的区别是WaitForSecondsRealtime
使用未缩放时间进行等待,这意味着当使用Time.timeScale
暂停游戏时,WaitForSecondsRealtime
函数不会受到影响,但WaitForSeconds
会受到影响。
void Start()
{
StartCoroutine(waiter());
}
IEnumerator waiter()
{
transform.Rotate(new Vector3(90, 0, 0), Space.World);
yield return new WaitForSecondsRealtime(4);
transform.Rotate(new Vector3(40, 0, 0), Space.World);
yield return new WaitForSecondsRealtime(2);
transform.Rotate(new Vector3(20, 0, 0), Space.World);
}
等待并仍然能够看到已等待的时间:
3.使用协程并每帧使用Time.deltaTime
递增一个变量。
一个很好的例子是当你需要计时器在屏幕上显示已等待了多长时间。基本上像一个计时器。
当你想要使用一个boolean
变量来中断等待/休眠时,这也是很好的。这就是可以使用yield break;
的地方。
bool quit = false;
void Start()
{
StartCoroutine(waiter());
}
IEnumerator waiter()
{
float counter = 0;
transform.Rotate(new Vector3(90, 0, 0), Space.World);
float waitTime = 4;
while (counter < waitTime)
{
counter += Time.deltaTime;
Debug.Log("We have waited for: " + counter + " seconds");
if (quit)
{
yield break;
}
yield return null;
}
transform.Rotate(new Vector3(40, 0, 0), Space.World);
waitTime = 2;
counter = 0;
while (counter < waitTime)
{
counter += Time.deltaTime;
Debug.Log("We have waited for: " + counter + " seconds");
if (quit)
{
yield break;
}
yield return null;
}
transform.Rotate(new Vector3(20, 0, 0), Space.World);
}
你可以通过将
while
循环移动到另一个协程函数中并进行yield操作来简化此过程,同时仍然能够看到计数器的计数,甚至可以中断计数。
bool quit = false;
void Start()
{
StartCoroutine(waiter());
}
IEnumerator waiter()
{
transform.Rotate(new Vector3(90, 0, 0), Space.World);
float waitTime = 4;
yield return wait(waitTime);
transform.Rotate(new Vector3(40, 0, 0), Space.World);
waitTime = 2;
yield return wait(waitTime);
transform.Rotate(new Vector3(20, 0, 0), Space.World);
}
IEnumerator wait(float waitTime)
{
float counter = 0;
while (counter < waitTime)
{
counter += Time.deltaTime;
Debug.Log("We have waited for: " + counter + " seconds");
if (quit)
{
yield break;
}
yield return null;
}
}
等待/休眠直到变量改变或等于另一个值:
4.使用协程和WaitUntil
函数:
等待直到条件成为true
。例如,一个函数等待玩家的得分为100
,然后加载下一关卡。
float playerScore = 0;
int nextScene = 0;
void Start()
{
StartCoroutine(sceneLoader());
}
IEnumerator sceneLoader()
{
Debug.Log("Waiting for Player score to be >=100 ");
yield return new WaitUntil(() => playerScore >= 10);
Debug.Log("Player score is >=100. Loading next Level");
nextScene++;
SceneManager.LoadScene(nextScene);
}
5.使用协程和WaitWhile
函数。
在条件为true
时等待。例如,当您想要在按下escape键时退出应用程序时。
void Start()
{
StartCoroutine(inputWaiter());
}
IEnumerator inputWaiter()
{
Debug.Log("Waiting for the Exit button to be pressed");
yield return new WaitWhile(() => !Input.GetKeyDown(KeyCode.Escape));
Debug.Log("Exit button has been pressed. Leaving Application");
Quit();
}
void Quit()
{
#if UNITY_EDITOR
UnityEditor.EditorApplication.isPlaying = false;
#else
Application.Quit();
#endif
}
6.使用Invoke
函数:
您可以告诉Unity在将来调用函数。当您调用Invoke
函数时,可以将要调用的函数作为第一个参数传递给它,将要等待的时间作为第二个参数传递给它。下面的示例将在Invoke
被调用后的5
秒后调用feedDog()
函数。
void Start()
{
Invoke("feedDog", 5);
Debug.Log("Will feed dog after 5 seconds");
}
void feedDog()
{
Debug.Log("Now feeding Dog");
}
7.通过使用Update()
函数和Time.deltaTime
。
这个方法与#3类似,只是不使用协程,而是使用Update
函数。
这种方法的问题在于需要大量变量来确保计时器在等待结束后仅运行一次,而非每次都运行。
float timer = 0;
bool timerReached = false;
void Update()
{
if (!timerReached)
timer += Time.deltaTime;
if (!timerReached && timer > 5)
{
Debug.Log("Done waiting");
feedDog();
timerReached = true;
}
}
void feedDog()
{
Debug.Log("Now feeding Dog");
}
在Unity中,还有其他等待的方式,但你一定要知道上面提到的这些,因为这样可以更容易地制作Unity游戏。何时使用每种方式取决于具体情况。
针对您的特定问题,这是解决方案:
IEnumerator showTextFuntion()
{
TextUI.text = "Welcome to Number Wizard!";
yield return new WaitForSeconds(3f);
TextUI.text = ("The highest number you can pick is " + max);
yield return new WaitForSeconds(3f);
TextUI.text = ("The lowest number you can pick is " + min);
}
要从您的 start 或 Update 函数中调用/启动协程函数,您需要使用以下方式调用:
StartCoroutine (showTextFuntion())