Unity 6.3
0 онлайн 66 гостей 3 в системе
Вход

Physics.ContactModifyEvent

Параметры

Параметр Описание
значение Представитель для вызова.

Описание

Подпишитесь на это событие, чтобы настроить ответ на столкновение для пар контактов.

Каждый подписчик на это событие вызван с физической сценой и нативным массивом пар контактов для обработки. Каждая пара контактов имеет изменяемые данные, такие как импульсы и контактные нормы, которые могут быть изменены для настройки поведения отскока.

Только пары, содержащие Коллайдеры, которые имели 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); } } }