如何使用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
相关产品推荐
相关产品推荐

