Unity中为Rigidbody添加速度时忽略当前速度的实现问题
解决Rigidbody叠加固定速度且不累积的问题
你的核心需求是:保留Rigidbody物理计算出的原有速度(比如盒子下滑的速度X),每帧叠加固定的速度Y,且Y不会随时间累积——也就是每帧最终速度都是「当前物理速度X」+「固定Y」,而不是上一帧的结果再加Y。
你原有代码的问题
你写的这段代码最终等价于直接把速度设为transform.forward * vertValue,完全覆盖了物理引擎计算出的下滑速度,所以盒子没法靠重力自行下滑:
Vector3 slideVelocity = rigidbody.velocity; Vector3 poleVelocity = transform.forward * vertValue - slideVelocity; rigidbody.velocity = slideVelocity + poleVelocity; // 化简后:rigidbody.velocity = transform.forward * vertValue
正确实现方案
要保留物理效果,同时叠加固定速度,直接基于每帧物理计算后的速度重新赋值即可:
// 获取物理引擎实时计算的当前速度(比如下滑的重力速度) Vector3 currentPhysicsSpeed = rigidbody.velocity; // 定义你要叠加的固定速度Y Vector3 fixedAddSpeed = transform.forward * vertValue; // 重新赋值:物理速度 + 固定叠加速度 rigidbody.velocity = currentPhysicsSpeed + fixedAddSpeed;
这样每帧都会以物理引擎计算出的最新速度为基础,加上固定的Y,既保留了盒子自行下滑的物理行为,又满足了“Y不累积”的需求——比如:
- Frame1:物理速度X=1,加Y=0.2 → 1.2
- Frame2:物理速度还是X=1(物理状态未变),加Y=0.2 → 1.2(不会变成1.4)
- Frame3:物理速度X=0.6,加Y=0.2 → 0.8
可选优化:仅在触发条件下叠加
如果Y是需要触发(比如按键时)才叠加,加个判断即可,非触发时保持物理速度不变:
Vector3 currentPhysicsSpeed = rigidbody.velocity; // 示例:按下W键时才叠加固定速度 if (Input.GetKey(KeyCode.W)) { Vector3 fixedAddSpeed = transform.forward * vertValue; rigidbody.velocity = currentPhysicsSpeed + fixedAddSpeed; }
内容的提问来源于stack exchange,提问作者GreanBean
相关产品推荐
相关产品推荐

