public class GameEventListener : MonoBehaviour
{
[Tooltip("Event to register with.")]
public GameEvent Event;
[Tooltip("Response to invoke when Event is raised.")]
public UnityEvent Response;
private void OnEnable()
{
Event.RegisterListener(this);
}
private void OnDisable()
{
Event.UnregisterListener(this);
}
public void OnEventRaised()
{
Response.Invoke();
}
}
[CreateAssetMenu(menuName = "Scriptable Objects/Game Event")]
public class GameEvent : ScriptableObject
{
private readonly List<GameEventListener> eventListeners = new List<GameEventListener>();
public void Raise()
{
for (int i = eventListeners.Count - 1; i >= 0; i--)
eventListeners[i].OnEventRaised();
}
public void RegisterListener(GameEventListener listener)
{
if (!eventListeners.Contains(listener))
eventListeners.Add(listener);
}
public void UnregisterListener(GameEventListener listener)
{
if (eventListeners.Contains(listener))
eventListeners.Remove(listener);
}
}
팀원분이 가져오신 새로운 방식이다. GameEvent ScriptableObject에 UnityEvent를 구독해주는 방식으로 한다.
이런 식으로 인스펙터에서 구독을 걸어줄 함수를 불러와 걸어주고. GameEvent를 스크립트에서 받아와 Raise() 해주면 구독되있는 메소드들이 실행된다.