A lightweight Scriptable Object event system for Unity.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Collections.Generic; | |
using UnityEngine; | |
public abstract class BaseGameEvent : ScriptableObject | |
{ | |
#if UNITY_EDITOR | |
[TextArea] public string developerDescription = ""; | |
#endif | |
private readonly List<Action> listeners = new (); | |
public void Raise() | |
{ | |
for (var i = listeners.Count - 1; i >= 0; i--) | |
{ | |
listeners[i].Invoke(); | |
} | |
} | |
public void RegisterListener(Action listener) | |
{ | |
if (!listeners.Contains(listener)) { listeners.Add(listener); } | |
} | |
public void UnregisterListener(Action listener) | |
{ | |
if (listeners.Contains(listener)) { listeners.Remove(listener); } | |
} | |
} | |
public abstract class BaseGameEvent<T1> : BaseGameEvent | |
{ | |
private readonly List<Action<T1>> listeners = new (); | |
public void Raise(T1 t1) | |
{ | |
for (var i = listeners.Count - 1; i >= 0; i--) | |
{ | |
listeners[i].Invoke(t1); | |
} | |
} | |
public void RegisterListener(Action<T1> listener) | |
{ | |
if (!listeners.Contains(listener)) { listeners.Add(listener); } | |
} | |
public void UnregisterListener(Action<T1> listener) | |
{ | |
if (listeners.Contains(listener)) { listeners.Remove(listener); } | |
} | |
} | |
public abstract class BaseGameEvent<T1,T2> : BaseGameEvent | |
{ | |
private readonly List<Action<T1,T2>> listeners = new (); | |
public void Raise(T1 t1, T2 t2) | |
{ | |
for (var i = listeners.Count - 1; i >= 0; i--) | |
{ | |
listeners[i].Invoke(t1, t2); | |
} | |
} | |
public void RegisterListener(Action<T1,T2> listener) | |
{ | |
if (!listeners.Contains(listener)) { listeners.Add(listener); } | |
} | |
public void UnregisterListener(Action<T1,T2> listener) | |
{ | |
if (listeners.Contains(listener)) { listeners.Remove(listener); } | |
} | |
} | |
/* USE: | |
************* | |
[CreateAssetMenu()] | |
public class GameEvent : BaseGameEvent {} | |
public class IntGameEvent : BaseGameEvent<int> {} | |
public class IntStringGameEvent : BaseGameEvent<int,string> {} | |
************** | |
*/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/// | |
/// examples of the three components required to utilize the system: | |
/// | |
// the Scriptable Object Event definition | |
[CreateAssetMenu] | |
public class CoinGameEvent : BaseGameEvent<int> | |
{} | |
// the MonoBehaviour on each Coin to collect | |
public class Coin : MonoBehaviour | |
{ | |
// the Scriptable Object Event we created via the Create Asset menu | |
[SerializeField] private CoinGameEvent coinEvent; | |
// raise our coin event whenever the user picks up a coin | |
void OnTriggerEnter2D(Collider2D other) | |
{ | |
coinEvent.Raise(1); | |
Destroy(gameobject); | |
} | |
} | |
// this can also be a ScriptableObject since they still have OnEnable() and OnDisable() methods | |
public class CoinManager : MonoBehaviour | |
{ | |
int coins; | |
// register to Listen for the Coin Event | |
void OnEnable() => coinEvent.RegisterListener(AddCoins); | |
void OnDisable() => coinEvent.UnregisterListener(AddCoins); | |
// add the number of coins in the Event to our total | |
void AddCoins(int value) => coins += value; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment