赞
踩
using Cysharp.Threading.Tasks;
using Cysharp.Threading.Tasks.Linq;
//绑定到Update中去执行
await foreach (var _ in UniTaskAsyncEnumerable.EveryUpdate())
{
//todo 你的处理逻辑
//结束循环的条件
if(condition)
{
//todo ....
break;
}
}
/// <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; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。