Unity MoveTowards无法停止致玩家卡住无法移动问题
问题根因
现有上楼梯强制移动逻辑未设置终止判定:只要entered == 1与klikw == 1两个条件同时成立,每帧都会执行MoveTowards将玩家拖拽向楼梯中点。玩家抵达目标位置后,相关触发状态未重置,也无到达终点的判断逻辑,因此会持续锁死玩家坐标,导致常规移动操作完全失效。
另外现有代码中MoveTowards的速度参数未乘以Time.deltaTime,移动速度会随设备帧率波动,属于附带逻辑隐患。
修复方案
按以下三点调整逻辑即可:
- 新增终点到达判定:计算玩家当前坐标与楼梯目标点的距离,当距离小于0.01f(浮点数计算存在精度误差,设置极小阈值避免永远无法判定坐标完全重合)时,认定上楼梯流程结束
- 流程结束后重置所有上楼梯相关状态:关闭触发碰撞体、重置
entered标识、将动画参数切回待机值,彻底退出强制移动分支,将移动控制权交还给常规移动逻辑 - 给
MoveTowards的速度参数乘以Time.deltaTime,保证移动速度不受帧率影响
修正后参考代码
if(entered == 1 && klikw == 1) { col.SetActive(true); Vector3 targetPos = location.position; // 到达目标点后重置状态,终止强制移动 if (Vector3.Distance(transform.position, targetPos) < 0.01f) { col.SetActive(false); entered = 0; klikw = 0; animator.SetFloat("whenhewalk", 0); return; } // 速度乘deltaTime保证不同帧率下移动速度一致 transform.position = Vector3.MoveTowards(transform.position, targetPos, speed * Time.deltaTime); animator.SetFloat("whenhewalk", 1); }
注意:如果你的
klikw是W键按下的持续状态标识而非一次性触发标识,可根据自身输入管理逻辑调整状态重置时机,核心原则是到达目标点后,上楼梯的if判断条件不再成立,停止执行强制移动逻辑即可。
内容的提问来源于stack exchange,提问作者Aco
相关产品推荐
相关产品推荐

