Files
beyond/Assets/Scripts/Triggers/ColliderEventTrigger.cs

222 lines
6.7 KiB
C#

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<Collider>();
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<SaveData>(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<Collider>();
if (collider != null)
{
Gizmos.color = color;
BoxCollider boxCollider = collider.GetComponent<BoxCollider>();
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<SphereCollider>();
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<Collider>();
if (collider != null)
{
Gizmos.color = colorWire;
BoxCollider boxCollider = collider.GetComponent<BoxCollider>();
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<SphereCollider>();
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;
}
}
}