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

如何使用Rigidbody实现2D平台游戏玩家的逐渐减速效果?

Unity 2D平台跳跃角色松开按键减速实现方案

你当前直接对rb.velocity.x做赋值的写法,会在Horizontal输入归0(松开按键)时直接把x轴速度设为0,因此角色会瞬间停住,没有减速过渡。仅需要修改速度赋值逻辑,保留原有冲刺、朝向翻转的全部逻辑,即可实现缓慢减速效果。

第一步:新增可调参数

在你的脚本类里新增两个公共参数,后续可以直接在Inspector面板拖拽调整手感:

[Header("移动手感参数")]
public float accelerationRate = 15f; // 按键按下时的加速速度,值越大提速越快
public float decelerationRate = 7f; // 松开按键后的减速速度,值越小滑行距离越远

第二步:替换原有移动逻辑

把原来直接给rb.velocity赋值的代码段,替换为「计算目标速度-按速率过渡到目标速度」的逻辑,朝向翻转、冲刺判断的代码完全保留即可,修改后的完整代码段如下:

bool isSprinting =  Input.GetButton("Sprint");
float playerInput = Input.GetAxis("Horizontal");

// 计算当前状态下的目标移动速度
float targetXSpeed = isSprinting ? playerInput * runSpeed : playerInput * moveSpeed;
float currentXSpeed = rb.velocity.x;
// 根据是否有输入选择加/减速速率
float changeRate = Mathf.Abs(playerInput) > 0.01f ? accelerationRate : decelerationRate;
// 帧率无关的速度平滑过渡,不会出现速度过冲
currentXSpeed = Mathf.MoveTowards(currentXSpeed, targetXSpeed, changeRate * Time.deltaTime);
// 赋值计算后的速度
rb.velocity = new Vector2(currentXSpeed, rb.velocity.y);

// 原有朝向翻转逻辑完全保留
if(rb.velocity.x > 0)
{
    transform.localScale = Vector3.one;
}
else if(rb.velocity.x < 0)
{
    transform.localScale = new Vector3(-1f, 1f, 1f);
}

手感调整参考

  • 如果想要按下方向键时和原来一样瞬间达到最大速度,把accelerationRate调到50以上即可
  • decelerationRate推荐从6开始调试:数值<3会有冰面打滑的长距离滑行效果,数值在8~12之间接近普通人跑步停下的真实手感,数值>20就会接近瞬间停下的硬直感
  • 如果你后续把输入获取换成Input.GetAxisRaw(输入值只有-1、0、1没有自带缓动),可以适当把accelerationRate调低3~5个数值,避免提速太突兀
  • 如果想要更柔和的拖泥带水式减速,可以把Mathf.MoveTowards换成Mathf.Lerp,第三个参数保持changeRate * Time.deltaTime即可,对应速率参数需要调大2~3倍匹配手感

内容的提问来源于stack exchange,提问作者Jarne Van de Kerkhof

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 04:51:25