Skip to content
This repository was archived by the owner on May 9, 2025. It is now read-only.

Commit 125c547

Browse files
Fixed events not being registered properly when changed in the inspector
1 parent 9ed61e8 commit 125c547

File tree

9 files changed

+122
-24
lines changed

9 files changed

+122
-24
lines changed

Assets/GameEvent.asset

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
%YAML 1.1
2+
%TAG !u! tag:unity3d.com,2011:
3+
--- !u!114 &11400000
4+
MonoBehaviour:
5+
m_ObjectHideFlags: 0
6+
m_CorrespondingSourceObject: {fileID: 0}
7+
m_PrefabInternal: {fileID: 0}
8+
m_GameObject: {fileID: 0}
9+
m_Enabled: 1
10+
m_EditorHideFlags: 0
11+
m_Script: {fileID: 11500000, guid: 7a78c7052899406438e9fc79486b45c0, type: 3}
12+
m_Name: GameEvent
13+
m_EditorClassIdentifier:
14+
DeveloperDescription:
15+
_value:

Assets/GameEvent.asset.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.

Assets/IntGameEvent.asset

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
%YAML 1.1
2+
%TAG !u! tag:unity3d.com,2011:
3+
--- !u!114 &11400000
4+
MonoBehaviour:
5+
m_ObjectHideFlags: 0
6+
m_CorrespondingSourceObject: {fileID: 0}
7+
m_PrefabInternal: {fileID: 0}
8+
m_GameObject: {fileID: 0}
9+
m_Enabled: 1
10+
m_EditorHideFlags: 0
11+
m_Script: {fileID: 11500000, guid: 8ea29b4887d65ef45a35c9c5add9005e, type: 3}
12+
m_Name: IntGameEvent
13+
m_EditorClassIdentifier:
14+
DeveloperDescription:
15+
_value:
16+
_debugValue: 64

Assets/IntGameEvent.asset.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.

Assets/NewBehaviourScript.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
using System.Collections;
2+
using System.Collections.Generic;
3+
using UnityEngine;
4+
5+
public class NewBehaviourScript : MonoBehaviour
6+
{
7+
public void Raise(object value)
8+
{
9+
Debug.Log(value);
10+
}
11+
public void Raise()
12+
{
13+
Debug.Log("gfdkjh");
14+
}
15+
}

Assets/NewBehaviourScript.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/SO Architecture/Editor/Inspectors/TypedGameEventEditor.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ public class TypedGameEventEditor : BaseGameEventEditor
1313
protected override void OnEnable()
1414
{
1515
base.OnEnable();
16-
17-
_raiseMethod = target.GetType().BaseType.GetMethod("Raise");
16+
17+
_raiseMethod = target.GetType().BaseType.GetMethod("Raise", BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public);
1818
}
1919
protected override void DrawRaiseButton()
2020
{

Assets/SO Architecture/Events/Game Events/GameEventBase.cs

Lines changed: 11 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,33 @@
11
using UnityEngine;
22
using System.Collections.Generic;
33

4-
public abstract class GameEventBase<T> : SOArchitectureBaseObject, IGameEvent<T>, IStackTraceObject
4+
public abstract class GameEventBase<T> : GameEventBase, IGameEvent<T>, IStackTraceObject
55
{
6-
private readonly List<IGameEventListener<T>> _listeners = new List<IGameEventListener<T>>();
7-
8-
public List<StackTraceEntry> StackTraces { get { return _stackTraces; } }
9-
private List<StackTraceEntry> _stackTraces = new List<StackTraceEntry>();
6+
private readonly List<IGameEventListener<T>> _typedListeners = new List<IGameEventListener<T>>();
107

118
#if UNITY_EDITOR
129
[SerializeField]
1310
protected T _debugValue;
14-
15-
public void AddStackTrace()
16-
{
17-
_stackTraces.Insert(0, StackTraceEntry.Create());
18-
}
19-
public void AddStackTrace(object value)
20-
{
21-
_stackTraces.Insert(0, StackTraceEntry.Create(value));
22-
}
2311
#endif
2412
public void Raise(T value)
2513
{
2614
AddStackTrace(value);
2715

16+
for (int i = _typedListeners.Count - 1; i >= 0; i--)
17+
_typedListeners[i].OnEventRaised(value);
18+
2819
for (int i = _listeners.Count - 1; i >= 0; i--)
29-
_listeners[i].OnEventRaised(value);
20+
_listeners[i].OnEventRaised();
3021
}
3122
public void AddListener(IGameEventListener<T> listener)
3223
{
33-
if (!_listeners.Contains(listener))
34-
_listeners.Add(listener);
24+
if (!_typedListeners.Contains(listener))
25+
_typedListeners.Add(listener);
3526
}
3627
public void RemoveListener(IGameEventListener<T> listener)
3728
{
38-
if (_listeners.Contains(listener))
39-
_listeners.Remove(listener);
29+
if (_typedListeners.Contains(listener))
30+
_typedListeners.Remove(listener);
4031
}
4132
public override string ToString()
4233
{
@@ -45,7 +36,7 @@ public override string ToString()
4536
}
4637
public abstract class GameEventBase : SOArchitectureBaseObject, IGameEvent, IStackTraceObject
4738
{
48-
private readonly List<IGameEventListener> _listeners = new List<IGameEventListener>();
39+
protected readonly List<IGameEventListener> _listeners = new List<IGameEventListener>();
4940

5041
public List<StackTraceEntry> StackTraces { get { return _stackTraces; } }
5142
private List<StackTraceEntry> _stackTraces = new List<StackTraceEntry>();

Assets/SO Architecture/Events/Listeners/BaseGameEventListener.cs

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ public abstract class BaseGameEventListener<TType, TEvent, TResponse> : Debuggab
1313
protected override ScriptableObject GameEvent { get { return _event; } }
1414
protected override UnityEventBase Response { get { return _response; } }
1515

16+
[SerializeField]
17+
private TEvent _previouslyRegisteredEvent;
1618
[SerializeField]
1719
private TEvent _event;
1820
[SerializeField]
@@ -35,16 +37,31 @@ private void RaiseResponse(TType value)
3537
{
3638
_response.Invoke(value);
3739
}
40+
private void OnValidate()
41+
{
42+
if (_event != null)
43+
Register();
44+
}
3845
private void OnEnable()
3946
{
4047
if (_event != null)
41-
_event.AddListener(this);
48+
Register();
4249
}
4350
private void OnDisable()
4451
{
4552
if (_event != null)
4653
_event.RemoveListener(this);
4754
}
55+
private void Register()
56+
{
57+
if(_previouslyRegisteredEvent != null)
58+
{
59+
_previouslyRegisteredEvent.RemoveListener(this);
60+
}
61+
62+
_event.AddListener(this);
63+
_previouslyRegisteredEvent = _event;
64+
}
4865
}
4966
public abstract class BaseGameEventListener<TEvent, TResponse> : DebuggableGameEventListener, IGameEventListener
5067
where TEvent : GameEventBase
@@ -53,6 +70,8 @@ public abstract class BaseGameEventListener<TEvent, TResponse> : DebuggableGameE
5370
protected override ScriptableObject GameEvent { get { return _event; } }
5471
protected override UnityEventBase Response { get { return _response; } }
5572

73+
[SerializeField]
74+
private TEvent _previouslyRegisteredEvent;
5675
[SerializeField]
5776
private TEvent _event;
5877
[SerializeField]
@@ -70,16 +89,31 @@ protected void RaiseResponse()
7089
{
7190
_response.Invoke();
7291
}
92+
private void OnValidate()
93+
{
94+
if (_event != null)
95+
Register();
96+
}
7397
private void OnEnable()
7498
{
7599
if (_event != null)
76-
_event.AddListener(this);
100+
Register();
77101
}
78102
private void OnDisable()
79103
{
80104
if (_event != null)
81105
_event.RemoveListener(this);
82106
}
107+
private void Register()
108+
{
109+
if (_previouslyRegisteredEvent != null)
110+
{
111+
_previouslyRegisteredEvent.RemoveListener(this);
112+
}
113+
114+
_event.AddListener(this);
115+
_previouslyRegisteredEvent = _event;
116+
}
83117
}
84118
public abstract class DebuggableGameEventListener : SOArchitectureBaseMonobehaviour, IStackTraceObject
85119
{

0 commit comments

Comments
 (0)