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 /ResolveHoleCollision.cs |
+init
Diffstat (limited to 'ResolveHoleCollision.cs')
-rw-r--r-- | ResolveHoleCollision.cs | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/ResolveHoleCollision.cs b/ResolveHoleCollision.cs new file mode 100644 index 0000000..7220bf4 --- /dev/null +++ b/ResolveHoleCollision.cs @@ -0,0 +1,97 @@ +using UnityEngine; + +[AddComponentMenu("Relief Terrain/Helpers/Resolve Hole Collision")] +[RequireComponent(typeof(Collider))] +public class ResolveHoleCollision : MonoBehaviour +{ + public Collider[] entranceTriggers; + + public TerrainCollider[] terrainColliders; + + public float checkOffset = 1f; + + public bool StartBelowGroundSurface; + + private TerrainCollider terrainColliderForUpdate; + + private Collider _collider; + + private Rigidbody _rigidbody; + + private void Awake() + { + _collider = GetComponent<Collider>(); + _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++) + { + if (terrainColliders[j] != null && _collider != null) + { + Physics.IgnoreCollision(_collider, terrainColliders[j], ignore: true); + } + } + } + + private void OnTriggerEnter(Collider other) + { + if (_collider == null) + { + return; + } + for (int i = 0; i < entranceTriggers.Length; i++) + { + if (entranceTriggers[i] == other) + { + for (int j = 0; j < terrainColliders.Length; j++) + { + Physics.IgnoreCollision(_collider, 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++) + { + Physics.IgnoreCollision(_collider, terrainColliders[i], ignore: false); + } + } + terrainColliderForUpdate = null; + } + + private void OnTriggerExit(Collider other) + { + if (_collider == null) + { + return; + } + for (int i = 0; i < entranceTriggers.Length; i++) + { + if (entranceTriggers[i] == other) + { + for (int j = 0; j < terrainColliders.Length; j++) + { + Physics.IgnoreCollision(_collider, terrainColliders[j], ignore: false); + } + } + } + } +} |