value | 要调用的委托。 |
订阅此事件以能够自定义接触对的碰撞响应。
每个订阅此事件的用户都会被调用一个物理场景和一个原生接触对数组来处理。每个接触对都有可修改的数据,例如可修改的冲量和接触法线,以便自定义反弹行为。
只有包含启用了Collider.hasModifiableContacts的碰撞器的对才会在缓冲区中传递。
请注意,此事件是从任何线程调用的,因此建议保留处理数据所需的所有副本,因为只有部分 Unity API 在主线程之外可用。
此外,事件处理程序可以在每帧中被调用多次,因为物理系统将所有接触分配到线程中,并且每次调用只发送特定数量的接触。
注意:要获取由 CCD 求解器生成的接触对,请订阅Physics.ContactModifyEventCCD 事件。它们不包含在此事件中。
using Unity.Collections; using UnityEngine;
public class Test : MonoBehaviour { public float IgnoredRadius = 0.5f; public Vector3 SpawnAt = Vector3.up * 5f;
public void OnEnable() { var ball = GameObject.CreatePrimitive(PrimitiveType.Sphere); GameObject.CreatePrimitive(PrimitiveType.Plane);
ball.transform.position = SpawnAt; ball.AddComponent<Rigidbody>(); ball.GetComponent<SphereCollider>().hasModifiableContacts = true;
Physics.ContactModifyEvent += ModificationEvent; }
public void OnDisable() { Physics.ContactModifyEvent -= ModificationEvent; }
public void ModificationEvent(PhysicsScene scene, NativeArray<ModifiableContactPair> pairs) { // For each contact pair, ignore the contact points that are close to origin foreach (var pair in pairs) { for (int i = 0; i < pair.contactCount; ++i) if (Vector3.Distance(pair.GetPoint(i), Vector3.zero) < IgnoredRadius) pair.IgnoreContact(i); } } }