如何以统一的简单方式使脚本等待/休眠

如何在之间放置一个睡眠功能TextUI.text = ....,以在每个短语之间等待3秒?

public Text GuessUI;

public Text TextUI;

[...truncated...]

TextUI.text = "Welcome to Number Wizard!";

TextUI.text = ("The highest number you can pick is " + max);

TextUI.text = ("The lowest number you can pick is " + min);

我已经尝试过各种方法,但是都没有用,例如:

TextUI.text = "Welcome to Number Wizard!";

yield WaitForSeconds (3);

TextUI.text = ("The highest number you can pick is " + max);

yield WaitForSeconds (3);

TextUI.text = ("The lowest number you can pick is " + min);

用bash表示:

echo "Welcome to Number Wizard!"

sleep 3

echo "The highest number you can pick is 1000"

sleep 3

.....

但是我不知道如何在Unity中使用C#做到这一点

回答:

在Unity中有多种等待方式。这确实很简单,但我认为值得涵盖执行这些操作的大多数方法:

用协程和WaitForSeconds

到目前为止,这是最简单的方法。将需要等待一段时间的所有代码放入协程函数中,然后可以使用WaitForSeconds。请注意,在协程函数中,您可以使用调用该函数StartCoroutine(yourFunction)

下面的示例将旋转90度,等待4秒钟,旋转40度,等待2秒钟,然后最终旋转20度。

void Start()

{

StartCoroutine(waiter());

}

IEnumerator waiter()

{

//Rotate 90 deg

transform.Rotate(new Vector3(90, 0, 0), Space.World);

//Wait for 4 seconds

yield return new WaitForSeconds(4);

//Rotate 40 deg

transform.Rotate(new Vector3(40, 0, 0), Space.World);

//Wait for 2 seconds

yield return new WaitForSeconds(2);

//Rotate 20 deg

transform.Rotate(new Vector3(20, 0, 0), Space.World);

}

用协程和WaitForSecondsRealtime

之间唯一的区别WaitForSecondsWaitForSecondsRealtimeWaitForSecondsRealtime为使用非标度的时间来等待,这意味着暂停了比赛的时候Time.timeScale,该WaitForSecondsRealtime功能将不会受到影响,但

WaitForSeconds会。

void Start()

{

StartCoroutine(waiter());

}

IEnumerator waiter()

{

//Rotate 90 deg

transform.Rotate(new Vector3(90, 0, 0), Space.World);

//Wait for 4 seconds

yield return new WaitForSecondsRealtime(4);

//Rotate 40 deg

transform.Rotate(new Vector3(40, 0, 0), Space.World);

//Wait for 2 seconds

yield return new WaitForSecondsRealtime(2);

//Rotate 20 deg

transform.Rotate(new Vector3(20, 0, 0), Space.World);

}


使用协程,并使用每帧增加一个变量Time.deltaTime

一个很好的例子是,当您需要计时器在屏幕上显示它等待了多少时间时。基本上像一个计时器。

当您希望使用boolean真变量来中断等待/睡眠时,这也很好。这是yield break;可以使用的地方。

bool quit = false;

void Start()

{

StartCoroutine(waiter());

}

IEnumerator waiter()

{

float counter = 0;

//Rotate 90 deg

transform.Rotate(new Vector3(90, 0, 0), Space.World);

//Wait for 4 seconds

float waitTime = 4;

while (counter < waitTime)

{

//Increment Timer until counter >= waitTime

counter += Time.deltaTime;

Debug.Log("We have waited for: " + counter + " seconds");

//Wait for a frame so that Unity doesn't freeze

//Check if we want to quit this function

if (quit)

{

//Quit function

yield break;

}

yield return null;

}

//Rotate 40 deg

transform.Rotate(new Vector3(40, 0, 0), Space.World);

//Wait for 2 seconds

waitTime = 2;

//Reset counter

counter = 0;

while (counter < waitTime)

{

//Increment Timer until counter >= waitTime

counter += Time.deltaTime;

Debug.Log("We have waited for: " + counter + " seconds");

//Check if we want to quit this function

if (quit)

{

//Quit function

yield break;

}

//Wait for a frame so that Unity doesn't freeze

yield return null;

}

//Rotate 20 deg

transform.Rotate(new Vector3(20, 0, 0), Space.World);

}

您仍然可以通过将while循环移到另一个协程函数并产生它来简化此过程,并且仍然可以看到它的计数甚至中断计数器。

bool quit = false;

void Start()

{

StartCoroutine(waiter());

}

IEnumerator waiter()

{

//Rotate 90 deg

transform.Rotate(new Vector3(90, 0, 0), Space.World);

//Wait for 4 seconds

float waitTime = 4;

yield return wait(waitTime);

//Rotate 40 deg

transform.Rotate(new Vector3(40, 0, 0), Space.World);

//Wait for 2 seconds

waitTime = 2;

yield return wait(waitTime);

//Rotate 20 deg

transform.Rotate(new Vector3(20, 0, 0), Space.World);

}

IEnumerator wait(float waitTime)

{

float counter = 0;

while (counter < waitTime)

{

//Increment Timer until counter >= waitTime

counter += Time.deltaTime;

Debug.Log("We have waited for: " + counter + " seconds");

if (quit)

{

//Quit function

yield break;

}

//Wait for a frame so that Unity doesn't freeze

yield return null;

}

}


具有协程和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 Leve");

//Increment and Load next scene

nextScene++;

SceneManager.LoadScene(nextScene);

}

具有协程和WaitWhile功能。

等待条件成立true。例如,当您想按退出键退出应用程序时。

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

//Exit program

Quit();

}

void Quit()

{

#if UNITY_EDITOR

UnityEditor.EditorApplication.isPlaying = false;

#else

Application.Quit();

#endif

}


Invoke具有功能:

您将来可以调用告诉Unity来调用函数。调用该Invoke函数时,您可以传递时间等待将该函数调用为其第二个参数。下面的示例将feedDog()5Invoke被调用后调用该函数。

void Start()

{

Invoke("feedDog", 5);

Debug.Log("Will feed dog after 5 seconds");

}

void feedDog()

{

Debug.Log("Now feeding Dog");

}

Update()具有和功能Time.deltaTime

就像 除了不使用协程。它使用该Update功能。

问题在于它需要太多的变量,因此它不会每次都运行,而是在等待后计时器结束时仅运行一次。

float timer = 0;

bool timerReached = false;

void Update()

{

if (!timerReached)

timer += Time.deltaTime;

if (!timerReached && timer > 5)

{

Debug.Log("Done waiting");

feedDog();

//Set to false so that We don't run this again

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

}

要从启动或更新功能调用/启动协程函数,请使用

StartCoroutine (showTextFuntion());

以上是 如何以统一的简单方式使脚本等待/休眠 的全部内容, 来源链接: utcz.com/qa/400608.html

回到顶部