协同程序

本文介绍了Unity3D中的协同程序,它允许在主程序运行时开启额外的逻辑处理。通过MonoBehaviour.StartCoroutine方法可以开启协同程序,使用字符串或IEnumerator参数有不同的控制方式。协同程序的终止可通过StopCoroutine或StopAllCoroutines实现。文中提供了代码示例以说明协同程序的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

欢迎来到unity学习unity培训unity企业培训教育专区,这里有很多U3D资源U3D培训视频,我们致力于打造业内unity3d培训学习第一品牌。


什么是协同程序


       协同程序,即在主程序运行时同时开启另一段逻辑处理,来协同当前程序的执行。换句话说,开启协同程序就是开启一个线程。

 

协同程序的开启与终止


       在Unity3D中,使用MonoBehaviour.StartCoroutine方法即可开启一个协同程序,也就是说该方法必须在MonoBehaviour或继承于MonoBehaviour的类中调用。


       在Unity3D中,使用StartCoroutine(string methodName)和StartCoroutine(IEnumerator routine)都可以开启一个线程。区别在于使用字符串作为参数可以开启线程并在线程结束前终止线程,相反使用IEnumerator 作为参数只能等待线程的结束而不能随时终止(除非使用StopAllCoroutines()方法);另外使用字符串作为参数时,开启线程时最多只能传递一个参数,并且性能消耗会更大一点,而使用IEnumerator 作为参数则没有这个限制。


        在Unity3D中,使用StopCoroutine(string methodName)来终止一个协同程序,使用StopAllCoroutines()来终止所有可以终止的协同程序,但这两个方法都只能终止该MonoBehaviour中的协同程序。


例:

          这个例子将执行Do,但是do函数之后的print指令会立刻执行.


  1. <span style="font-size:18px;">Do ();  
  2. Console.WriteLine("This is printed immediately");  
  3. IEnumerator  Do ()  
  4. {  
  5.     Console.WriteLine("Do now");  
  6.     yield return new WaitForSeconds  (2);        
  7.     Console.WriteLine("Do 2 seconds later");  
  8.   
    
         这个例子将执行Do,并等待,直到Do完成再执行其他语句.【注:这里的等待是把线程时间交给其他任务,而不是阻塞式等待】

  
  1. <span style="font-size:18px;">// 启动协程  
  2. yield return StartCoroutine("Do");  
  3. Console.WriteLine("Also after 2 seconds");  
  4. Console.WriteLine ("这个print将在Do协程执行完以后显示。");  
  5. IEnumerator  Do ()  
  6. {        
  7. Console.WriteLine("Do now");  
  8. yield return new WaitForSeconds  (2);  
  9. Console.WriteLine("Do 2 seconds later");  
  10. }  
  11.   


        注意你不能在Update或FixedUpdate函数内使用yield,但是你能使用 StartCoroutine  开始一个函数.


       查看 YieldInstruction , WaitForSeconds , WaitForFixedUpdate , Coroutine  and MonoBehaviour.StartCoroutine  可以获得更多使用yield的信息.
       yield return可以看做是一种特殊的return,会返回到父类继续执行,但是yield return后面的类型或方法会有一个执行条件,当条件满足时会回调包含yield的子函数,

     例:

  1. void Start () {  
  2.   
  3.   
  4.         print("Starting:" + Time.time);  
  5.   
  6.   
  7.         StartCoroutine(WaitAnPrint(2.0F));  
  8.   
  9.   
  10.         print("Before WaiAndPrint:" + Time.time);  
  11.   
  12.   
  13.     }  
  14.   
  15.   
  16. IEnumerator WaitAndPrint(float waitTime)  
  17.   
  18.   
  19.     {  
  20.   
  21.   
  22.         yield return new WaitForSeconds(waitTime);  
  23.   
  24.   
  25.         print("WaitAndPrint:" + Time.time);      
  26.   
  27.   
  28.     }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值