diff options
author | chai <215380520@qq.com> | 2024-03-13 11:00:58 +0800 |
---|---|---|
committer | chai <215380520@qq.com> | 2024-03-13 11:00:58 +0800 |
commit | 6ce8b9e22fc13be34b442c7b6af48b42cd44275a (patch) | |
tree | b38119d2acf0a982cb67e381f146924b9bfc3b3f /ResolveHoleCollisionMultiple.cs |
+init
Diffstat (limited to 'ResolveHoleCollisionMultiple.cs')
-rw-r--r-- | ResolveHoleCollisionMultiple.cs | 110 |
1 files changed, 110 insertions, 0 deletions
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<Rigidbody>(); + 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); + } + } + } + } + } +} |