【发布时间】:2023-03-31 12:32:02
【问题描述】:
我试图强制 Unity 在碰撞后不改变物体的速度和方向。我需要得到OnCollisionEnter2D 事件,但不需要Unity 自动改变速度和方向;我想手动完成。
我尝试使用此代码,但不起作用(自动碰撞仍然有效):
private void OnCollisionEnter2D(Collision2D collision)
{
fallVector = GetRigidbody.velocity.normalized;
fallNormalVector = collision.contacts[0].normal;
var reflectedVelocity = Vector3.Reflect(fallVector, fallNormalVector).normalized;
GetRigidbody.velocity = reflectedVelocity * 3;
}
有人告诉我将我的 GameObject 标记为 isTrigger 并在我的 other 问题中使用 OnTriggerEnter2D,但它使用 Collider2D 而不是 Collision2D,因此我无法正常联系。
如何在OnTriggerEnter2D 函数中从Collider2D 获取ContactPoint2D 或正常联系方式?
编辑:
看完下面的答案,我在下面写了这段代码,但是GetContacts()在所有元素中返回(0.0, 0.0),我做错了什么?
碰撞的两个对象 IsTrigger = true。 (Unity版本为5.6.0f3)
ContactPoint2D[] contacts = new ContactPoint2D[2];
void OnTriggerEnter2D(Collider2D collision)
{
//Get all contact points and save to the contacts array variable
collision.GetContacts(contacts);
Vector3 normal = contacts[0].normal;
GetRigidbody.velocity = Vector3.Reflect(GetRigidbody.velocity, normal);
}
【问题讨论】:
-
isTrigger = true的碰撞器不返回接触点。到目前为止,似乎没有简单的方法可以在不编写一些自定义光线投射代码的情况下获得与普通碰撞器相同的接触点,而且对于非平凡的碰撞器形状很难做到这一点。
标签: c# unity3d game-physics