首先需要在 Unity 中搭建一个小场景,这里用了几个胶囊和盒子作为演示,盒子做成了一个预制件,将其标记为了 MovingBox,该对象有一个刚体和一个盒子碰撞器。

如果要实现该推动功能,则需要使用 OnControllerColliderHit() 函数,这个伪代码解释了推动盒子的逻辑。
private void onControllercolliderHit(ControllercolliderHit hit)
{
// 检查移动的箱子
// 确认它是否有刚体
// 计算方向推
// 推(推的方向和推的力量)
}
在播放器脚本中,声明了一个名为 _pushForce 的新变量,它将添加到盒子被推动时的方向。
在 OnControllerColliderHit 函数中,创建了另一个变量来获取盒子的刚体。
然后检查了 MovingBox 标签并添加了另外 2 个条件。
如果刚体为 null 或 kinematic,那么什么也不做,如果 hit.moveDirection.y 小于 -0.3f,则意味着对象在玩家下方,将退出该函数。
最后,创建 pushDirection 向量并将其分配给刚体速度乘以推力。
private float _pushForce = 2.0f;
// ...
private void OnControllerColliderHit(ControllerColliderHit hit)
{
Rigidbody body = hit.collider.attachedRigidbody;
if (hit.transform.tag =="MovingBox" )
{
if ( body == null ll body.isKinematic)
{
return;
}
if (hit.moveDirection.y < -0.3f)
{
return;}
Vector3 pushDirection = new Vector3(hit.moveDirection.x,0,0);
body.velocity = pushDirection * _pushForce;
}
// 更多与推框无关的代码
}
到这里, 现在就可以在场景中操纵已推动盒子向左还是向右了。
