add game event scriptable object
This commit is contained in:
parent
9ef1d12a40
commit
d945aea322
|
@ -0,0 +1,8 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 63db837647a10954ea169d14e0ceedce
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
|
@ -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
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 3a977303773797047b37664649362484
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 0a5de09a27d949d4db67034f55c57e6b
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
Loading…
Reference in New Issue