如何为Unity中往返运动的对象添加转向延迟?
解决Unity往返运动转向前添加延迟的问题
你原来用Mathf.Sin实现的往返是连续平滑的,没有明确的转向节点,直接插协程会和Update的实时位置计算冲突——要么延迟效果被覆盖,要么协程写法错误导致游戏卡顿。下面是可行的解决方案:
把运动逻辑完全放到协程里,分阶段控制移动和延迟,替代原来的Update逻辑:
public class PushPlayer : MonoBehaviour { public float moveAmount = 3.3f; public float speed = 1.1f; public float turnDelay = 1.0f; // 转向延迟时间 private Vector3 startPos; private Vector3 targetPos; void Start() { startPos = transform.position; // 计算往返的目标位置(Z轴偏移设定值) targetPos = startPos + new Vector3(0, 0, moveAmount); // 启动协程控制往返运动 StartCoroutine(MoveBackAndForth()); } IEnumerator MoveBackAndForth() { while (true) { // 阶段1:从起点移动到目标点 while (Vector3.Distance(transform.position, targetPos) > 0.01f) { transform.position = Vector3.MoveTowards(transform.position, targetPos, speed * Time.deltaTime); yield return null; // 等待下一帧,保证移动平滑 } // 强制精准到位,避免误差累积 transform.position = targetPos; // 到达目标后延迟1秒再转向 yield return new WaitForSeconds(turnDelay); // 阶段2:从目标点移动回起点 while (Vector3.Distance(transform.position, startPos) > 0.01f) { transform.position = Vector3.MoveTowards(transform.position, startPos, speed * Time.deltaTime); yield return null; } transform.position = startPos; // 到达起点后延迟1秒再转向 yield return new WaitForSeconds(turnDelay); } } // 必须删掉或注释原来的Update方法,否则会和协程的位置更新冲突 // void Update() // { // Vector3 v = startPos; // v.z += moveAmount * Mathf.Sin(Time.time * speed); // transform.position = v; // } }
为什么你之前的尝试没用?
- 协程没效果:因为原来的Update一直在用Sin实时计算位置,协程延迟期间位置被持续覆盖,根本看不到停顿
- 游戏冻结:大概率是协程里写了无
yield return的死循环(比如while(true)里没加等待),直接卡死主线程
内容的提问来源于stack exchange,提问作者thehelaeper67
相关产品推荐
相关产品推荐

