using System; using System.Collections.Generic; using UnityEngine; namespace Syntriax.Modules.Trigger { public abstract class ColliderTriggerAreaBase : MonoBehaviour, IColliderTriggerArea where T : Component { [SerializeField] private LayerMask colliderMask = ~0; protected T[] nonAllocResults = new T[32]; protected int previousTriggerCount = 0; public LayerMask ColliderMask { get => colliderMask; set => colliderMask = value; } public Action> OnTriggeredTransformsUpdated { get; set; } = null; public List TriggeredTransforms { get; protected set; } = new List(32); protected abstract int TriggerCount { get; } public virtual bool Check() { int triggerCount = TriggerCount; if (!IsArrayAndListIdentical(triggerCount)) { TriggeredTransforms.Clear(); for (int i = 0; i < triggerCount; i++) TriggeredTransforms.Add(nonAllocResults[i].transform); OnTriggeredTransformsUpdated?.Invoke(TriggeredTransforms); } previousTriggerCount = triggerCount; return triggerCount > 0; } private bool IsArrayAndListIdentical(int triggerCount) { if (previousTriggerCount != triggerCount) return false; for (int i = 0; i < triggerCount; i++) if (!TriggeredTransforms.Contains(nonAllocResults[i].transform)) return false; return true; } #if UNITY_EDITOR private State.IStateEnable _stateEnable = null; public State.IStateEnable StateEnable { get { _stateEnable = _stateEnable ?? GetComponent() ?? gameObject.AddComponent(); return _stateEnable; } } #endif } }