using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; using System.Linq; using PixelCrushers; using System; namespace Beyond { public class ColliderEventTrigger : Saver { public ColliderEventTriggerHolder events; public class SaveData { public bool reEntry; public bool reExit; public bool reEnable; public bool reDisable; } [Header("Settings")] public bool reEnable; public bool reDisable; public bool reEntry; public bool reExit; [Header("Detection")] public LayerMask collisionLayer = 1<<8;//LayerMask.NameToLayer("Player"); public TagMask tagMask = new TagMask(); [Header("Debug")] public bool drawGizmos; public bool drawWire; public Color color = Color.white; public Color colorWire = Color.white; private new Collider collider; private bool _reEnable; private bool _reDisable; private bool _reEntry; private bool _reExit; //This doesn't work! it has valu 0 when debuggin //private readonly int triggerLayer = 11; private void Awake() { collider = GetComponent(); if (collider != null) { collider.isTrigger = true; } //gameObject.layer = triggerLayer; gameObject.layer = 11; } private IEnumerator TriggerEventOnEnableIE() { yield return new WaitForSeconds(events.onEnableDelay); if (reEnable || !_reEnable) { _reEnable = true; events.onEnable?.Invoke(); //Debug.Log("ColliderEventTrigger OnEnable"); } } public void TriggerEventOnEnable() { StartCoroutine(TriggerEventOnEnableIE()); } public void TriggerEventOnDisable() { if (reDisable || !_reDisable) { _reDisable = true; events.onDisable?.Invoke(); //Debug.Log("ColliderEventTrigger OnDisable"); } } public void TriggerEventOnEnter() { if (reEntry || !_reEntry) { events.onEnter?.Invoke(); _reEntry = true; //Debug.Log("ColliderEventTrigger OnEnter"); } } public void TriggerEventOnExit() { if (reExit || !_reExit) { events.onExit?.Invoke(); _reExit = true; Debug.Log("ColliderEventTrigger OnExit"); } } public override void OnEnable() { base.OnEnable(); StartCoroutine(TriggerEventOnEnableIE()); } public override void OnDisable() { base.OnDisable(); TriggerEventOnDisable(); } public override string RecordData() { SaveData data = new SaveData(); data.reEntry = _reEntry; data.reExit = _reExit; data.reDisable = _reDisable; data.reEnable = _reEnable; return SaveSystem.Serialize(data); } public override void ApplyData(string s) { var data = SaveSystem.Deserialize(s); if (data == null) data = new SaveData(); _reEntry = data.reEntry; _reExit = data.reExit; _reDisable = data.reDisable; _reEnable = data.reEnable; } private void OnTriggerEnter(Collider other) { if ((collisionLayer & 1 << other.gameObject.layer) != 0) { if (tagMask.IsInTagMask(other.tag)) { TriggerEventOnEnter(); } } } private void OnTriggerExit(Collider other) { if ((collisionLayer & 1 << other.gameObject.layer) != 0) { if (tagMask.IsInTagMask(other.tag)) { TriggerEventOnExit(); } } } public void Test(string text) { Debug.Log(text); } private void OnDrawGizmos() { if (drawGizmos) { collider = GetComponent(); if (collider != null) { Gizmos.color = color; BoxCollider boxCollider = collider.GetComponent(); if (boxCollider) { Vector3 size = new Vector3(boxCollider.size.x * transform.localScale.x, boxCollider.size.y * transform.localScale.y, boxCollider.size.z * transform.localScale.z); GizmosExtensions.DrawCube(transform.position + boxCollider.center, size, transform.rotation); } SphereCollider sphereCollider = collider.GetComponent(); if (sphereCollider) { Gizmos.DrawSphere(transform.position + sphereCollider.center, sphereCollider.radius * Mathf.Max(transform.localScale.x, transform.localScale.y, transform.localScale.z)); } } } if (drawWire) { collider = GetComponent(); if (collider != null) { Gizmos.color = colorWire; BoxCollider boxCollider = collider.GetComponent(); if (boxCollider) { Vector3 size = new Vector3(boxCollider.size.x * transform.localScale.x, boxCollider.size.y * transform.localScale.y, boxCollider.size.z * transform.localScale.z); GizmosExtensions.DrawWireCube(transform.position + boxCollider.center, size, transform.rotation); } SphereCollider sphereCollider = collider.GetComponent(); if (sphereCollider) { Gizmos.DrawWireSphere(transform.position + sphereCollider.center, sphereCollider.radius * Mathf.Max(transform.localScale.x, transform.localScale.y, transform.localScale.z)); } } } } [Serializable] public class ColliderEventTriggerHolder { public float onEnableDelay; public UnityEvent onEnable; public UnityEvent onDisable; public UnityEvent onEnter; public UnityEvent onExit; } } }