Unity中按空格键让角色从A点移动到B点的代码问题排查
代码问题排查与修复方案
核心问题点
- 连续调用MoveTowards抵消移动:同一帧内先执行向目标点的移动,紧接着又执行返回原位置的移动,两次操作直接抵消,角色位置几乎无变化。
- 移动状态标记逻辑失效:
isMove在方法开头设为false,结尾立刻设为true,完全无法反映真实的移动状态,不管移动是否开始或结束,变量都会瞬间重置。 - 向量类型混用:用
Vector2接收transform.position(Vector3类型),虽支持隐式转换,但易引发坐标混淆或丢失(如Z轴),应统一使用Vector3。 - 调用逻辑错误:若
Move方法仅在按下空格时调用一次,MoveTowards只会计算单帧移动量,角色无法到达目标点;若在Update中持续调用,又会因两次移动操作抵消导致角色不动。
修复方案(单方向移动到B点)
如果需求是按下空格键后,角色从当前位置(A点)移动到上方1.5单位的B点,改用逐帧更新+状态控制的逻辑:
private bool isMoving = false; private Vector3 targetPos; public float moveSpeed = 2f; void Update() { // 按下空格且未在移动时,触发移动逻辑 if (Input.GetKeyDown(KeyCode.Space) && !isMoving) { isMoving = true; // 设置B点坐标:当前位置Y轴+1.5 targetPos = new Vector3(transform.position.x, transform.position.y + 1.5f, transform.position.z); } // 逐帧向目标点移动 if (isMoving) { transform.position = Vector3.MoveTowards(transform.position, targetPos, Time.deltaTime * moveSpeed); // 检测是否到达目标点(误差小于0.01时视为到达) if (Vector3.Distance(transform.position, targetPos) < 0.01f) { transform.position = targetPos; // 修正到精确坐标 isMoving = false; // 结束移动状态 } } }
扩展方案(A→B→A往返移动)
如果需求是按下空格后角色先到B点再返回A点,可扩展状态机逻辑:
private bool isMoving = false; private bool isReturning = false; private Vector3 originalPos; private Vector3 targetPos; public float moveSpeed = 2f; void Update() { if (Input.GetKeyDown(KeyCode.Space) && !isMoving) { isMoving = true; originalPos = transform.position; targetPos = new Vector3(transform.position.x, transform.position.y + 1.5f, transform.position.z); } if (isMoving) { if (!isReturning) { // 移动到B点 transform.position = Vector3.MoveTowards(transform.position, targetPos, Time.deltaTime * moveSpeed); if (Vector3.Distance(transform.position, targetPos) < 0.01f) { transform.position = targetPos; isReturning = true; // 切换到返回状态 } } else { // 返回A点 transform.position = Vector3.MoveTowards(transform.position, originalPos, Time.deltaTime * moveSpeed); if (Vector3.Distance(transform.position, originalPos) < 0.01f) { transform.position = originalPos; isMoving = false; isReturning = false; // 重置状态 } } } }
内容的提问来源于stack exchange,提问作者LeiksGamez
相关产品推荐
相关产品推荐

