222 lines
6.7 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|