Unity中如何阻止角色通过transform.Translate进行斜向移动?
问题分析与修复方案
你的代码没法限制斜向移动的核心问题是:四个if是独立执行的,当同时按下水平和垂直方向键时,两个方向的移动代码都会被触发,最终角色还是会斜着走。另外代码里的moveHor、moveVer变量完全冗余——刚赋值就判断,毫无意义。
下面给两种可行的修复方案:
方案一:优先单方向输入(固定优先级)
先处理垂直方向输入,处理完直接跳过水平方向的判断;如果垂直方向没输入,再处理水平方向。这样同一帧只会执行一个方向的移动:
void Update() { // 先处理垂直方向 if (Input.GetKey("up")) { transform.Translate(Vector3.up * Time.deltaTime * speed); return; } if (Input.GetKey("down")) { transform.Translate(Vector3.down * Time.deltaTime * speed); return; } // 垂直方向无输入,再处理水平方向 if (Input.GetKey("right")) { transform.Translate(Vector3.right * Time.deltaTime * speed); } if (Input.GetKey("left")) { transform.Translate(Vector3.left * Time.deltaTime * speed); } }
方案二:基于输入轴的优先级判断
利用Unity的输入轴获取原始输入值,通过比较垂直和水平输入的绝对值,优先处理输入强度更高的方向,更贴合玩家的操作意图:
void Update() { float vertical = Input.GetAxisRaw("Vertical"); float horizontal = Input.GetAxisRaw("Horizontal"); // 优先处理输入强度更高的方向 if (Mathf.Abs(vertical) > Mathf.Abs(horizontal)) { if (vertical > 0) transform.Translate(Vector3.up * Time.deltaTime * speed); else if (vertical < 0) transform.Translate(Vector3.down * Time.deltaTime * speed); } else { if (horizontal > 0) transform.Translate(Vector3.right * Time.deltaTime * speed); else if (horizontal < 0) transform.Translate(Vector3.left * Time.deltaTime * speed); } }
内容的提问来源于stack exchange,提问作者jop frenken
相关产品推荐
相关产品推荐

