当前位置: 首页 > 编程语言 > C#

如何使脚本以统一的简单方式等待-睡眠分享

时间:2023-04-11 01:29:35 C#

C#学习教程:如何让脚本统一简单的wait/sleep...在每个短语之间等待3秒的睡眠功能?公共文本猜测UI;公共文本TextUI;[...截断...]TextUI.text="欢迎使用数字向导!";TextUI.text=("你可以选择的最大数字是"+max);TextUI.text=("你可以选择的最小数字是"+min);我尝试了各种方法,但没有任何效果,例如:TextUI.text="WelcometoNumberWizard!";yieldWaitForSeconds(3);TextUI.text=("你可以选择的最大数字是"+max);yieldWaitForSeconds(3);TextUI.text=("你可以选择的最小数字是"+min);在bash中将是:echo“WelcometoNumberWizard!”sleep3echo"Thehighestnumberyoucanpickis1000"sleep3.....但我想不通我是如何在Unity中用C#做的在Unity中等待有很多方法。这很简单,但我认为值得涵盖大多数方法:1.使用协程和WaitForSeconds。这是迄今为止最简单的方法。把所有需要的代码都放在协程函数中等待一段时间,然后WaitForSeconds。请注意,在协程函数中,可以使用StartCoroutine(yourFunction)调用该函数。下面的示例将旋转90度,等待4秒,旋转40度并等待2秒,最后旋转20度。voidStart(){StartCoroutine(waiter());}IEnumeratorwaiter(){//旋转90度transform.Rotate(newVector3(90,0,0),Space.World);//等待4秒yieldreturnnewWaitForSeconds(4);//旋转40度transform.Rotate(newVector3(40,0,0),Space.World);//等待2秒yieldreturnnewWaitForSeconds(2);//旋转20度transform.Rotate(newVector3(20,0,0),Space.World);}2.使用协程和WaitForSecondsRealtime。WaitForSeconds和WaitForSecondsRealtime之间的唯一区别是WaitForSecondsRealtime使用的是未缩放的等待时间,这意味着当使用Time.timeScale暂停游戏时,WaitForSecondsRealtime函数不受影响,但WaitForSeconds会。voidStart(){StartCoroutine(waiter());}IEnumeratorwaiter(){//旋转90度transform.Rotate(newVector3(90,0,0),Space.World);//等待4秒yieldreturnnewWaitForSecondsRealtime(4);//旋转40度transform.Rotate(newVector3(40,0,0),Space.World);//等待2秒yieldreturnnewWaitForSecondsRealtime(2);//旋转20度transform.Rotate(newVector3(20,0,0),Space.World);}等等,还是看你等了多久:3.使用协程,使用Time.deltaTime每帧递增一个变量。一个很好的例子是当你需要一个计时器来在屏幕上显示它已经等待了多长时间。基本上就像一个计时器。当您想用布尔变量中断等待/睡眠时,它也很好。这是产量突破;可以使用。布尔退出=假;voidStart(){StartCoroutine(waiter());}IEnumeratorwaiter(){floatcounter=0;//旋转90度transform.Rotate(newVector3(90,0,0),Space.World);//等待4秒floatwaitTime=4;while(counter=waitTimecounter+=Time.deltaTime;Debug.Log("Wehavewaitedfor:"+counter+"seconds");//等待一个帧,这样Unity就不会冻结//检查我们是否需要退出这个函数if(quit){//退出函数yieldbreak;}yieldreturnnull;}//旋转40度transform.Rotate(newVector3(40,0,0),Space.World);//等待2secondswaitTime=2;//重置计数器counter=0;while(counter=waitTimecounter+=Time.deltaTime;Debug.Log("Wehavewaitedfor:"+counter+"seconds");//检查我们是否wanttoquitthisfunctionif(quit){//Quitfunctionyieldbreak;}//等待一帧,这样Unity就不会冻结yieldreturnnull;}//旋转20度transform.Rotate(newVector3(20,0,0),Space.World);}您仍然可以通过将while循环移动到另一个协程函数并使其生成并且仍然能够看到它计数甚至中断计数器以简化此boolquit=false;voidStart(){StartCoroutine(waiter());}IEnumeratorwaiter(){//旋转90度transform.Rotate(newVector3(90,0,0),Space.World);//等待4秒floatwaitTime=4;收益返回等待(waitTime);//旋转40度变换。旋转(新Vector3(40、0、0)、Space.World);//等待2秒waitTime=2;收益返回等待(waitTime);//旋转20度transform.Rotate(newVector3(20,0,0),Space.World);}IEnumeratorwait(floatwaitTime){floatcounter=0;while(counter=waitTimecounter+=Time.deltaTime;Debug.Log("Wehavewaitedfor:"+counter+"seconds");if(quit){//退出函数yieldbreak;}//等待一帧以便Unity不会冻结yieldreturnnull;}}等待/睡眠直到变量改变或等于另一个值:4.使用协程程序和WaitUntil函数:等待直到条件变为真。一个例子是等待玩家的函数得分100,然后加载下一个级别。floatplayerScore=0;intnextScene=0;voidStart(){StartCoroutine(sceneLoader());}IEnumeratorsceneLoader(){调试。Log("等待玩家得分>=100");yieldreturnnewWaitUntil(()=>playerScore>=10);Debug.Log("玩家得分>=100。正在加载下一关");//增加并加载下一个场景nextScene++;SceneManager.LoadScene(nextScene);}5、具有协程和WaitWhile功能。等待条件为真。例如,当你想在按下退出键时退出应用程序。voidStart(){StartCoroutine(inputWaiter());}IEnumeratorinputWaiter(){Debug.Log("等待退出按钮被按下");yieldreturnnewWaitWhile(()=>!Input.GetKeyDown(KeyCode.Escape));Debug.Log("退出按钮已被按下。离开应用程序");//退出程序Quit();}voidQuit(){#ifUNITY_EDITORUnityEditor.EditorApplication.isPlaying=false;#elseApplication.Quit();#endif}6.使用Invokefunction:你可以调用告诉Unity以后调用该函数。当您调用Invoke函数时,您可以在调用该函数之前将等待时间传递给它的第二个参数。以下示例将在Invoke5秒后调用feedDog()函数。voidStart(){调用("feedDog",5);Debug.Log("5秒后喂狗");}voidfeedDog(){Debug.Log("现在喂狗");}7.使用Update()函数和Time.deltaTime。就像#3一样,它不使用协程。它使用更新功能。这样做的问题是它需要太多的变量,以至于它不会每次都运行,而是在等待后定时器到期时只运行一次。浮动计时器=0;booltimerReached=false;voidUpdate(){if(!timerReached)timer+=Time.deltaTime;if(!timerReached&&timer>5){Debug.Log("完成等待");喂狗();//设置为false这样我们就不会再次运行它timerReached=true;}}voidfeedDog(){Debug.Log("现在喂狗");}在Unity中还有其他等待的方法,但是你上面提到的这些应该清楚知道,这样在Unity中制作游戏会更容易。何时使用取决于具体情况。对于您的具体问题,这里是解决方案:IEnumeratorshowTextFuntion(){TextUI.text="WelcometoNumberWizard!";yieldreturnnewWaitForSeconds(3f);TextUI.text=("你可以选择的最大数字是"+max);yieldreturnnewWaitForSeconds(3f);TextUI.text=("你可以选择的最小数字是"+min);要从启动或更新函数中调用/启动协程函数,您可以使用它来调用它StartCoroutine(showTextFuntion());您使用WaitForSeconds是正确的。但我怀疑您正在尝试在没有协程的情况下使用它。工作原理:以上就是C#学习教程的全部内容:如何统一简单的让脚本等待/休眠SomeMethod(){StartCoroutine(SomeCoroutine());}privateIEnumeratorSomeCoroutine(){TextUI.text="WelcometoNumberWizard!";收益回报WaitForSeconds(3);TextUI.text=("你可以选择的最大数字是"+max);收益回报WaitForSeconds(3);TextUI.text=("你可以选择的最小数字是"+min);}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: