当前位置:   article > 正文

UniTask中如何await Update() —— 以相机移动为例说明_unitask 循环

unitask 循环

一、UniTask调用Update的方式

1.1 引用的包:

using Cysharp.Threading.Tasks;
using Cysharp.Threading.Tasks.Linq;
  • 1
  • 2

1.2 Update的await实现:

//绑定到Update中去执行
await foreach (var _ in UniTaskAsyncEnumerable.EveryUpdate()) 
{
		//todo 你的处理逻辑

		//结束循环的条件
		if(condition)
		{
			//todo ....
			break;
		}         
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

二、在一个方法体中实现相机的移动

2.1 用【异步/等待】实现的步骤如下:

  • 【1】移动前
    变量的定义和初始话
  • 【2】移动中
    每帧执行,Update()实现
  • 【3】移动后
    一些收尾工作

2.2 移动相机的附录代码

 /// <summary>
 /// 移动物体:在给定时间内,从【起始方位】移动到【结束方位】
 /// 实现原理:
 ///     用异步等待来实现,条理清晰,代码简洁
 ///     用到UniTask的Update方法         
 /// </summary>
 /// <param name="obj">要移动的物体</param>
 /// <param name="startObj">起始的方位</param>
 /// <param name="stopObj">结束的方位</param>
 /// <param name="timeToMove">给定的移动时间</param>
 public static async UniTask MoveTo(Transform obj, Transform startObj, Transform stopObj, float timeToMove)
 {        
     //【1】变量定义
     float startPoint;       //开始运动时间点
     float elapsedTime;      //运行耗用的时间
     bool isFlying = false;  //当为true的时候,Update里面每帧插值计算位置,设置物体的位置

     //【2】移动前
     startPoint = Time.realtimeSinceStartup;
     obj.position = startObj.position;   //初始方位
     obj.rotation = startObj.rotation;        
    
     //【3】移动中
     // Update的内容:Unity 2020.2, C# 8.0 
     Func<UniTask> UpdateLoop = async () =>
     {
         //绑定到Update中去执行
         await foreach (var _ in UniTaskAsyncEnumerable.EveryUpdate()) 
         {
             if (!isFlying) break;

             //用时间进度来插值计算中间的方位
             elapsedTime = Time.realtimeSinceStartup - startPoint;
             //Debug.Log($" {Time.realtimeSinceStartup}  {elapsedTime}/{timeToMove} = {elapsedTime / timeToMove}");
             obj.transform.position = Vector3.Lerp(startObj.position, stopObj.position, elapsedTime / timeToMove);
             obj.transform.rotation = Quaternion.Lerp(startObj.rotation, stopObj.rotation, elapsedTime / timeToMove);              
         }
         return;
     };
     isFlying = true;
     UpdateLoop();                                           //分叉并行执行:移动物体      

     //【4】移动后
     await UniTask.Delay(TimeSpan.FromSeconds(timeToMove));  //等待给定的时间完成
     isFlying = false;                                       //停止updateLoop里面的循环
     await UniTask.DelayFrame(1);                            //等待一帧,用于渲染
     obj.position = stopObj.position;                        //结束方位
     obj.rotation = stopObj.rotation;
 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/95529
推荐阅读
相关标签
  

闽ICP备14008679号