C# 从OnTiggerXXX函数获取触点2D/触点法线
我试图迫使Unity在碰撞后不改变物体的速度和方向。我需要获得C# 从OnTiggerXXX函数获取触点2D/触点法线,c#,unity3d,game-physics,C#,Unity3d,Game Physics,我试图迫使Unity在碰撞后不改变物体的速度和方向。我需要获得OnCollisionInter2D事件,但我不需要Unity来自动改变速度和方向;我想手工做 我尝试使用此代码,但不起作用(自动碰撞仍然有效): 我被要求将我的游戏对象标记为isTrigger,并在我的问题中使用OnTriggerEnter2D,但它使用Collider2D而不是collison2d,我无法从中获得正常的接触 如何从OnTriggerEnter2D函数中的collizer2d获取ContactPoint2D或cont
OnCollisionInter2D
事件,但我不需要Unity来自动改变速度和方向;我想手工做
我尝试使用此代码,但不起作用(自动碰撞仍然有效):
我被要求将我的游戏对象标记为isTrigger
,并在我的问题中使用OnTriggerEnter2D
,但它使用Collider2D
而不是collison2d
,我无法从中获得正常的接触
如何从OnTriggerEnter2D
函数中的collizer2d
获取ContactPoint2D
或contact normal
编辑:
在阅读了下面的答案后,我在下面编写了这段代码,但是GetContacts()
在所有元素中返回(0.0,0.0),我做错了什么?两个碰撞对象IsTrigger=true。(Unity版本为5.6.0f3) 我不能使用OnTiggerInter2D-它没有要定义的Collision2D 接触正常 正常变量来自结构,您可以将
OnCollisionInter2D
代码转换为OnTriggerInter2D
,并且仍然能够使用函数检索该信息
您必须具有Unity 5.6及更高版本才能使用此功能。请不要说“它不工作”,如果你没有这个版本,因为它不应该。您需要更新才能获得此功能
发生碰撞时:
触发等价物:
确保首先将碰撞器标记为触发器,如我在回答中所述。函数中代码内部唯一需要更改的是fallNormalVector=collision.contacts[0]。normal代码>。
编辑/更新:
你不能再这样做了,或者做些改变。这篇文章是用Unity 5.6制作的,在测试的时候它就工作了。当时的Collider2D.GetContacts
没有说当collider被标记为isTrigger
时它将无法工作。最新的消息说这是不可能的
涉及设置为触发器的碰撞R2D的触点将永远不会被触发
在这里返回,因为触发器碰撞器没有接触点
这是在发布之前测试过的,它工作得很好,现在我怀疑当Collider被标记为isTrigger
时它工作时是一个bug。要使用Collider2D.GetContacts
,请确保您的碰撞器未标记为isTrigger
,我相信您的GetContacts代码运行正常,但是触发器不会生成接触点。如果要运行int count=other.GetContacts(contacts)
应将计数
变量设置为零。带isTrigger=true的碰撞器不返回接触点。到目前为止,似乎没有一种简单的方法可以在不编写自定义光线投射代码的情况下获得与普通碰撞器相同的接触点,而且对于非普通碰撞器形状很难做到这一点。您尝试过此代码吗?我所有的实验、谷歌搜索和Unity文档片段都指出,如果一个或两个碰撞器都是触发器,那么它就不会提供接触点collision.GetContacts()
然后返回0
@angularsen的计数。在发布之前,我对它进行了测试。在发布之前,我测试了我答案中99%的代码。有关详细信息,请参见我的编辑。
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;
}
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);
}
void OnCollisionEnter2D(Collision2D collision)
{
Vector2 normal = collision.contacts[0].normal;
Vector2 point = contacts[0].point;
}
//Variable to hold the contacts
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;
Vector2 point = contacts[0].point;
}