Files
2026-02-21 16:45:37 +08:00

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;
}
}
}
}