unity3d 有没有办法得到一个可以推动/移动角色控制器的对象?

yxyvkwin  于 2023-01-09  发布在  其他
关注(0)|答案(2)|浏览(178)

我知道你可以在两个物体上使用刚体来进行碰撞等等,我可以做得很好,但是我试图在我的玩家对象上不需要刚体。
但是如果我有一个只使用角色控制器的玩家对象,当与其他对象碰撞时,有没有办法“推”它们?

nxagd54h

nxagd54h1#

由于CharacterController继承自Collider,因此如果其他对象具有(运动学)Rigidbody-至少需要一个Rigidbody,以便检测碰撞本身(不确定这一点,可能没有,CharacterController是一个特例)-然后使用Physics.ComputePenetration来计算你必须移动你的玩家才能将它移出碰撞器的距离和方向=〉把它推开。

[RequireComponent(typeof(Rigidbody))]
public class PushCharacter : MonoBehaviour
{
    [SerializeField] Collider ownCollider;

    void Awake ()
    {
        if(! ownCollider) ownCollider = GetComponentInChildren<Collider>();
    }

    void OnCollisionStay(Collision collision)
    {
        if(collision.collider is CharacterController character)
        {
            Physics.ComputePenetration(ownCollider, ownCollider.transform.position, ownCollider.transform.rotation, character, character.transform.position, character.transform.rotation, out var direction, out var distance);

            character.Move(direction * distance);
        }
    }
}

另请注意
其中一个碰撞器必须是BoxCollider、SphereCollider、CapsuleCollider或凸网格碰撞器。另一个可以是任何类型。
这限制了您可以用作推动对象的对象,因为CharacterController不是这些对象(尽管它有点像胶囊)。
然而--只是提醒一下--一旦有多个推动物体参与,这可能会变得相当复杂!

tsm1rwdh

tsm1rwdh2#

是的,当然不使用内建的碰撞器和刚体也是可以做到的,毕竟它们只是脚本。
执行此操作的一种方法是查看播放器对象的某个外部边界是否在Vector3-radiusVector3+radius范围内,然后向RigidBody施加力或移动播放器Vector3。
有无数的可能性,如何做到这一点,但最简单的方法肯定是使用对撞机和刚体。

相关问题