From 6ce8b9e22fc13be34b442c7b6af48b42cd44275a Mon Sep 17 00:00:00 2001 From: chai <215380520@qq.com> Date: Wed, 13 Mar 2024 11:00:58 +0800 Subject: +init --- ResolveHoleCollisionMultiple.cs | 110 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 ResolveHoleCollisionMultiple.cs (limited to 'ResolveHoleCollisionMultiple.cs') diff --git a/ResolveHoleCollisionMultiple.cs b/ResolveHoleCollisionMultiple.cs new file mode 100644 index 0000000..6d1990e --- /dev/null +++ b/ResolveHoleCollisionMultiple.cs @@ -0,0 +1,110 @@ +using UnityEngine; + +[AddComponentMenu("Relief Terrain/Helpers/Resolve Hole Collision for multiple child colliders")] +public class ResolveHoleCollisionMultiple : MonoBehaviour +{ + public Collider[] childColliders; + + public Collider[] entranceTriggers; + + public TerrainCollider[] terrainColliders; + + public float checkOffset = 1f; + + public bool StartBelowGroundSurface; + + private TerrainCollider terrainColliderForUpdate; + + private Rigidbody _rigidbody; + + private void Awake() + { + _rigidbody = GetComponent(); + for (int i = 0; i < entranceTriggers.Length; i++) + { + if (entranceTriggers[i] != null) + { + entranceTriggers[i].isTrigger = true; + } + } + if (!(_rigidbody != null) || !StartBelowGroundSurface) + { + return; + } + for (int j = 0; j < terrainColliders.Length; j++) + { + for (int k = 0; k < childColliders.Length; k++) + { + if (terrainColliders[j] != null && childColliders[k] != null) + { + Physics.IgnoreCollision(childColliders[k], terrainColliders[j], ignore: true); + } + } + } + } + + private void OnTriggerEnter(Collider other) + { + for (int i = 0; i < entranceTriggers.Length; i++) + { + if (!(entranceTriggers[i] == other)) + { + continue; + } + for (int j = 0; j < terrainColliders.Length; j++) + { + for (int k = 0; k < childColliders.Length; k++) + { + if (childColliders[k] != null && terrainColliders[j] != null) + { + Physics.IgnoreCollision(childColliders[k], terrainColliders[j], ignore: true); + } + } + } + } + } + + private void FixedUpdate() + { + if (!terrainColliderForUpdate) + { + return; + } + RaycastHit hitInfo = default(RaycastHit); + if (terrainColliderForUpdate.Raycast(new Ray(base.transform.position + Vector3.up * checkOffset, Vector3.down), out hitInfo, float.PositiveInfinity)) + { + for (int i = 0; i < terrainColliders.Length; i++) + { + for (int j = 0; j < childColliders.Length; j++) + { + if (childColliders[j] != null && terrainColliders[i] != null) + { + Physics.IgnoreCollision(childColliders[j], terrainColliders[i], ignore: false); + } + } + } + } + terrainColliderForUpdate = null; + } + + private void OnTriggerExit(Collider other) + { + for (int i = 0; i < entranceTriggers.Length; i++) + { + if (!(entranceTriggers[i] == other)) + { + continue; + } + for (int j = 0; j < terrainColliders.Length; j++) + { + for (int k = 0; k < childColliders.Length; k++) + { + if (childColliders[k] != null && terrainColliders[j] != null) + { + Physics.IgnoreCollision(childColliders[k], terrainColliders[j], ignore: false); + } + } + } + } + } +} -- cgit v1.1-26-g67d0