You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 11:50:45