Skip to content

Commit ec517bf

Browse files
committed
First iteration refactor events with generics
1 parent 79366d9 commit ec517bf

20 files changed

Lines changed: 206 additions & 0 deletions

Runtime/SOBaseEvents/Refactor.meta

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
using System;
2+
using SOBaseEvents.Refactor.Impl;
3+
using UnityEngine;
4+
5+
namespace SOBaseEvents.Refactor
6+
{
7+
public abstract class EventListener<TEvent, TArg> : EventListenerBase where TEvent : EventSOBase<TArg>
8+
{
9+
public event Action<TArg> OnEventRaised;
10+
11+
protected TEvent _typedEvent => _baseEvent as TEvent;
12+
13+
private void OnEnable()
14+
{
15+
if (_typedEvent != null)
16+
{
17+
_typedEvent.AddListener(OnEventRaised);
18+
}
19+
}
20+
21+
private void OnDisable()
22+
{
23+
if (_typedEvent != null)
24+
{
25+
_typedEvent.RemoveListener(OnEventRaised);
26+
}
27+
}
28+
}
29+
}

Runtime/SOBaseEvents/Refactor/EventListener.cs.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using UnityEngine;
4+
5+
namespace SOBaseEvents.Refactor
6+
{
7+
public abstract class EventSOBase<TArg> : ScriptableObject, ISOEventBase, ISOEventRegistry<TArg>, ISOEventRaiser<TArg>
8+
{
9+
private readonly List<Action<TArg>> _listeners = new();
10+
11+
public void AddListener(Action<TArg> listener)
12+
{
13+
if (_listeners.Contains(listener))
14+
{
15+
var (objectName, methodName) = GetListenerInfo(listener);
16+
Debug.LogError($"[ScriptableObjectEvents] Listener {methodName} of GameObject {objectName} already registered. Aborting registration.");
17+
return;
18+
}
19+
20+
_listeners.Add(listener);
21+
}
22+
23+
public void RemoveListener(Action<TArg> listener)
24+
{
25+
if (!_listeners.Contains(listener))
26+
{
27+
var (objectName, methodName) = GetListenerInfo(listener);
28+
Debug.LogError($"[ScriptableObjectEvents] Listener {methodName} of GameObject {objectName} is not registered. Aborting removal.");
29+
return;
30+
}
31+
32+
_listeners.Remove(listener);
33+
}
34+
35+
public void RaiseEvent(TArg arg)
36+
{
37+
for (int i = _listeners.Count - 1; i >= 0; i--)
38+
{
39+
_listeners[i]?.Invoke(arg);
40+
}
41+
}
42+
43+
private (string objectName, string methodName) GetListenerInfo(Action<TArg> listener)
44+
{
45+
var objectName = string.Empty;
46+
var methodName = listener.Method.Name;
47+
48+
if (listener.Target is MonoBehaviour mb)
49+
{
50+
objectName = mb.gameObject.name;
51+
}
52+
else if (listener.Target != null)
53+
{
54+
objectName = listener.Target.ToString();
55+
}
56+
57+
return (objectName, methodName);
58+
}
59+
}
60+
}

Runtime/SOBaseEvents/Refactor/EventSOBase.cs.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
namespace SOBaseEvents.Refactor
2+
{
3+
public interface ISOEventBase
4+
{
5+
6+
}
7+
}

Runtime/SOBaseEvents/Refactor/ISOEventBase.cs.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
namespace SOBaseEvents.Refactor
2+
{
3+
//TODO This has to be made with a template if I want to support more Args dynamically
4+
5+
public interface ISOEventRaiser<TEventArg>
6+
{
7+
void RaiseEvent(TEventArg arg);
8+
}
9+
}

Runtime/SOBaseEvents/Refactor/ISOEventRaiser.cs.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
using System;
2+
3+
namespace SOBaseEvents.Refactor
4+
{
5+
//TODO This has to be made with a template if I want to support more Args dynamically
6+
//public interface IEventRegistry<TEventArg1, TEventArg2, TEventArg3>
7+
8+
public interface ISOEventRegistry<TEventArg>
9+
{
10+
void AddListener(Action<TEventArg> listener);
11+
void RemoveListener(Action<TEventArg> listener);
12+
}
13+
}

0 commit comments

Comments
 (0)