add game event scriptable object

This commit is contained in:
Cat Flynn 2021-02-23 09:52:00 +00:00
parent 9ef1d12a40
commit d945aea322
5 changed files with 139 additions and 0 deletions

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 63db837647a10954ea169d14e0ceedce
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,80 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endif
namespace Ktyl.Util
{
[CreateAssetMenu(menuName = "ktyl/Events/Game Event")]
public class GameEvent : ScriptableObject
{
[SerializeField] private bool _logRaised;
protected readonly List<GameEventListener> _listeners = new List<GameEventListener>();
public virtual void Raise()
{
if (_logRaised)
{
Debug.Log($"raised {this}", this);
}
for (int i = 0; i < _listeners.Count; i++)
{
_listeners[i].OnEventRaised();
}
}
public void Register(GameEventListener listener)
{
if (_listeners.Contains(listener))
{
Debug.LogError($"{listener} already registered", this);
return;
}
_listeners.Add(listener);
}
public void Unregister(GameEventListener listener)
{
if (!_listeners.Contains(listener))
{
Debug.LogError($"{listener} not already registered");
return;
}
_listeners.Remove(listener);
}
}
#region Editor
#if UNITY_EDITOR
[CustomEditor(typeof(GameEvent), true)]
public class GameEventEditor : Editor
{
private GameEvent _event;
private void OnEnable()
{
_event = target as GameEvent;
}
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
if (GUILayout.Button("Raise"))
{
_event.Raise();
}
}
}
#endif
#endregion
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 3a977303773797047b37664649362484
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,29 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
namespace Ktyl.Util
{
public class GameEventListener : MonoBehaviour
{
[SerializeField] private GameEvent _event;
[SerializeField] private UnityEvent _response;
private void OnEnable()
{
_event.Register(this);
}
private void OnDisable()
{
_event.Register(this);
}
public void OnEventRaised()
{
_response.Invoke();
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 0a5de09a27d949d4db67034f55c57e6b
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: