You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Unity 3D平台游戏:实现角色速度随摇杆输入量动态调整

根据摇杆输入幅度调整角色移动速度的解决方案

嘿,很高兴你已经做出满意的控制器啦!这个根据摇杆幅度切换行走/奔跑速度的需求其实挺容易实现的,我来给你一步步拆解~

核心思路

摇杆的输入通常会返回一个Vector2类型的值(比如Unity里的Input.GetAxis),我们可以通过它的**模长(magnitude)**获取输入的幅度(范围0到1),再把这个幅度映射到「行走速度」到「奔跑速度」之间,就能实现输入越大、速度越快的效果啦。

代码实现(以Unity C#为例)

首先定义基础参数:

// 角色行走时的速度
public float walkSpeed = 3f;
// 角色奔跑时的最大速度
public float runSpeed = 6f;
// 摇杆死区:输入幅度小于这个值时不触发移动,防止摇杆漂移误触
public float deadZone = 0.1f;

然后在移动逻辑里加入幅度判断:

void FixedUpdate()
{
    // 获取摇杆的水平/垂直输入
    Vector2 rawInput = new Vector2(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"));
    
    // 计算当前输入的幅度
    float inputMagnitude = rawInput.magnitude;

    // 处理死区:如果输入幅度太小,直接停止移动
    if (inputMagnitude < deadZone)
    {
        GetComponent<Rigidbody2D>().velocity = Vector2.zero; // 2D平台游戏用这个
        // GetComponent<Rigidbody>().velocity = Vector3.zero; // 3D游戏用这个
        return;
    }

    // 把输入幅度从[deadZone, 1]归一化到[0, 1],保证死区以上的输入能平滑映射速度
    float normalizedInput = Mathf.InverseLerp(deadZone, 1f, inputMagnitude);

    // 根据归一化后的输入幅度,插值得到当前速度
    float currentMoveSpeed = Mathf.Lerp(walkSpeed, runSpeed, normalizedInput);

    // 获取归一化的移动方向(避免斜向移动速度过快)
    Vector2 moveDirection = rawInput.normalized;

    // 应用移动速度到角色
    GetComponent<Rigidbody2D>().velocity = moveDirection * currentMoveSpeed;
}

关键细节解释

  • 死区处理:摇杆可能存在微小的硬件漂移,设置deadZone可以避免角色在未操作摇杆时出现意外移动。
  • 输入归一化:用Mathf.InverseLerp把超过死区的输入范围转换成0到1的区间,这样当输入刚好达到死区时,角色以行走速度移动;输入拉满时,以奔跑速度移动。
  • 方向归一化:如果直接使用原始输入向量,斜向移动的幅度会大于1(比如x和y都为1时,模长是√2≈1.414),导致斜向移动比单方向快。将输入向量归一化后,各个方向的移动速度会保持一致。

如果你的现有代码已经有移动逻辑,只需要把原来固定的速度值替换成这里计算的currentMoveSpeed就可以啦!

内容的提问来源于stack exchange,提问作者ReignBeaux

火山引擎 最新活动