273 lines
5.5 KiB
C#
273 lines
5.5 KiB
C#
using System;
|
|
using UnityEngine;
|
|
|
|
namespace EnergyBarToolkit
|
|
{
|
|
public class SimpleEvent : MonoBehaviour
|
|
{
|
|
[Serializable]
|
|
public class Action
|
|
{
|
|
public enum Type
|
|
{
|
|
IncreaseByValue = 0,
|
|
IncreaseByPercent = 1,
|
|
DecreaseByValue = 2,
|
|
DecreaseByPercent = 3,
|
|
SetToValue = 4,
|
|
SetToPercent = 5
|
|
}
|
|
|
|
internal SimpleEvent simpleEvent;
|
|
|
|
public bool changeBar;
|
|
|
|
public Type changeBarType;
|
|
|
|
public float changeBarValue;
|
|
|
|
public bool intervaled;
|
|
|
|
public float timeInterval = 1f;
|
|
|
|
private float timeIntervalAccum;
|
|
|
|
public bool sendMessage;
|
|
|
|
public Signal[] signals;
|
|
|
|
public void Invoke(GameObject collider)
|
|
{
|
|
if (intervaled)
|
|
{
|
|
timeIntervalAccum += Time.deltaTime;
|
|
while (timeIntervalAccum >= timeInterval)
|
|
{
|
|
timeIntervalAccum -= timeInterval;
|
|
InvokeActual(collider);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
InvokeActual(collider);
|
|
}
|
|
}
|
|
|
|
private void InvokeActual(GameObject collider)
|
|
{
|
|
EnergyBar energyBar = simpleEvent.energyBar;
|
|
if (changeBar)
|
|
{
|
|
if (energyBar != null)
|
|
{
|
|
switch (changeBarType)
|
|
{
|
|
case Type.IncreaseByValue:
|
|
energyBar.valueCurrent += (int)changeBarValue;
|
|
break;
|
|
case Type.IncreaseByPercent:
|
|
energyBar.ValueF += changeBarValue;
|
|
break;
|
|
case Type.DecreaseByValue:
|
|
energyBar.valueCurrent -= (int)changeBarValue;
|
|
break;
|
|
case Type.DecreaseByPercent:
|
|
energyBar.ValueF -= changeBarValue;
|
|
break;
|
|
case Type.SetToValue:
|
|
energyBar.valueCurrent = (int)changeBarValue;
|
|
break;
|
|
case Type.SetToPercent:
|
|
energyBar.ValueF = changeBarValue;
|
|
break;
|
|
default:
|
|
Debug.LogError("Unknown option: " + changeBarType);
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Debug.LogError("Energy bar not set for this event.", simpleEvent);
|
|
}
|
|
}
|
|
if (sendMessage)
|
|
{
|
|
Signal[] array = signals;
|
|
foreach (Signal signal in array)
|
|
{
|
|
signal.Invoke(simpleEvent, collider);
|
|
}
|
|
}
|
|
}
|
|
|
|
public void Reset()
|
|
{
|
|
timeIntervalAccum = 0f;
|
|
}
|
|
}
|
|
|
|
[Serializable]
|
|
public class Signal
|
|
{
|
|
public enum ReceiverType
|
|
{
|
|
Self = 0,
|
|
Collider = 1,
|
|
FixedGameObject = 2
|
|
}
|
|
|
|
public enum MessageArgument
|
|
{
|
|
Caller = 0,
|
|
BarValue = 1,
|
|
BarValuePercent = 2
|
|
}
|
|
|
|
public ReceiverType receiverType;
|
|
|
|
public GameObject receiver;
|
|
|
|
public string methodName;
|
|
|
|
public MessageArgument argument;
|
|
|
|
public void Invoke(SimpleEvent simpleEvent, GameObject collider)
|
|
{
|
|
GameObject gameObject;
|
|
switch (receiverType)
|
|
{
|
|
case ReceiverType.Self:
|
|
gameObject = simpleEvent.gameObject;
|
|
break;
|
|
case ReceiverType.Collider:
|
|
gameObject = collider;
|
|
break;
|
|
case ReceiverType.FixedGameObject:
|
|
gameObject = receiver;
|
|
break;
|
|
default:
|
|
Debug.LogError("Unknown option: " + receiverType);
|
|
gameObject = null;
|
|
break;
|
|
}
|
|
switch (argument)
|
|
{
|
|
case MessageArgument.Caller:
|
|
gameObject.SendMessage(methodName, simpleEvent.gameObject, SendMessageOptions.RequireReceiver);
|
|
break;
|
|
case MessageArgument.BarValue:
|
|
gameObject.SendMessage(methodName, simpleEvent.energyBar.valueCurrent, SendMessageOptions.RequireReceiver);
|
|
break;
|
|
case MessageArgument.BarValuePercent:
|
|
gameObject.SendMessage(methodName, simpleEvent.energyBar.ValueF, SendMessageOptions.RequireReceiver);
|
|
break;
|
|
default:
|
|
Debug.LogError("Unknown option: " + argument);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
public enum Target
|
|
{
|
|
GameObjects = 0,
|
|
Tags = 1
|
|
}
|
|
|
|
private enum TriggerType
|
|
{
|
|
Enter = 0,
|
|
Stay = 1,
|
|
Leave = 2
|
|
}
|
|
|
|
public EnergyBar energyBar;
|
|
|
|
public Target targetType;
|
|
|
|
public GameObject[] targetGameObjects;
|
|
|
|
public string[] targetTags;
|
|
|
|
public Action onTriggerEnterAction = new Action();
|
|
|
|
public Action onTriggerStayAction = new Action();
|
|
|
|
public Action onTriggerLeaveAction = new Action();
|
|
|
|
private void OnEnable()
|
|
{
|
|
onTriggerEnterAction.simpleEvent = this;
|
|
onTriggerStayAction.simpleEvent = this;
|
|
onTriggerLeaveAction.simpleEvent = this;
|
|
}
|
|
|
|
private void OnTriggerEnter(Collider other)
|
|
{
|
|
OnTrigger(other.gameObject, TriggerType.Enter);
|
|
}
|
|
|
|
private void OnTriggerStay(Collider other)
|
|
{
|
|
OnTrigger(other.gameObject, TriggerType.Stay);
|
|
}
|
|
|
|
private void OnTriggerLeave(Collider other)
|
|
{
|
|
OnTrigger(other.gameObject, TriggerType.Leave);
|
|
onTriggerLeaveAction.Reset();
|
|
}
|
|
|
|
private void OnTriggerEnter2D(Collider2D other)
|
|
{
|
|
OnTrigger(other.gameObject, TriggerType.Enter);
|
|
}
|
|
|
|
private void OnTriggerStay2D(Collider2D other)
|
|
{
|
|
OnTrigger(other.gameObject, TriggerType.Stay);
|
|
}
|
|
|
|
private void OnTriggerLeave2D(Collider2D other)
|
|
{
|
|
OnTrigger(other.gameObject, TriggerType.Leave);
|
|
onTriggerLeaveAction.Reset();
|
|
}
|
|
|
|
private void OnTrigger(GameObject other, TriggerType type)
|
|
{
|
|
if (IsReactingTo(other))
|
|
{
|
|
switch (type)
|
|
{
|
|
case TriggerType.Enter:
|
|
onTriggerEnterAction.Invoke(other);
|
|
break;
|
|
case TriggerType.Stay:
|
|
onTriggerStayAction.Invoke(other);
|
|
break;
|
|
case TriggerType.Leave:
|
|
onTriggerLeaveAction.Invoke(other);
|
|
break;
|
|
default:
|
|
Debug.LogError("Unknown option: " + type);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
private bool IsReactingTo(GameObject other)
|
|
{
|
|
switch (targetType)
|
|
{
|
|
case Target.GameObjects:
|
|
return Array.Exists(targetGameObjects, (GameObject go) => go == other);
|
|
case Target.Tags:
|
|
return Array.Exists(targetTags, (string tag) => tag == other.tag);
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
}
|