我知道你可以在两个物体上使用刚体来进行碰撞等等,我可以做得很好,但是我试图在我的玩家对象上不需要刚体。但是如果我有一个只使用角色控制器的玩家对象,当与其他对象碰撞时,有没有办法“推”它们?
nxagd54h1#
由于CharacterController继承自Collider,因此如果其他对象具有(运动学)Rigidbody-至少需要一个Rigidbody,以便检测碰撞本身(不确定这一点,可能没有,CharacterController是一个特例)-然后使用Physics.ComputePenetration来计算你必须移动你的玩家才能将它移出碰撞器的距离和方向=〉把它推开。
CharacterController
Collider
Rigidbody
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不是这些对象(尽管它有点像胶囊)。然而--只是提醒一下--一旦有多个推动物体参与,这可能会变得相当复杂!
tsm1rwdh2#
是的,当然不使用内建的碰撞器和刚体也是可以做到的,毕竟它们只是脚本。执行此操作的一种方法是查看播放器对象的某个外部边界是否在Vector3-radius和Vector3+radius范围内,然后向RigidBody施加力或移动播放器Vector3。有无数的可能性,如何做到这一点,但最简单的方法肯定是使用对撞机和刚体。
Vector3-radius
Vector3+radius
2条答案
按热度按时间nxagd54h1#
由于
CharacterController
继承自Collider
,因此如果其他对象具有(运动学)Rigidbody
-至少需要一个Rigidbody
,以便检测碰撞本身(不确定这一点,可能没有,CharacterController
是一个特例)-然后使用Physics.ComputePenetration
来计算你必须移动你的玩家才能将它移出碰撞器的距离和方向=〉把它推开。另请注意
其中一个碰撞器必须是BoxCollider、SphereCollider、CapsuleCollider或凸网格碰撞器。另一个可以是任何类型。
这限制了您可以用作推动对象的对象,因为
CharacterController
不是这些对象(尽管它有点像胶囊)。然而--只是提醒一下--一旦有多个推动物体参与,这可能会变得相当复杂!
tsm1rwdh2#
是的,当然不使用内建的碰撞器和刚体也是可以做到的,毕竟它们只是脚本。
执行此操作的一种方法是查看播放器对象的某个外部边界是否在
Vector3-radius
和Vector3+radius
范围内,然后向RigidBody施加力或移动播放器Vector3。有无数的可能性,如何做到这一点,但最简单的方法肯定是使用对撞机和刚体。