In the project signaling system (or event system) used very much, and very easy to use, I like a global signal for interaction between different systems, together with internal signal ECS module.
The following lists the contents of implementation:
SignalCenter: global signal message center for interaction between different systems
EntitySignal (below does not actually change the name, and not a static class): entity internal signals, I used to MVC structure, or the structure of the ECS internal signals, such as data interaction with the UI, UI monitor data, system monitor UI click event some type of
SignalParam: parameter signal for extended data transfer complex
Implementation
1 using UnityEngine; 2 using UnityEngine.Events; 3 using System.Collections; 4 using System.Collections.Generic; 5 6 /// <summary> 7 /// event 8 /// </summary> 9 [System.Serializable] 10 public class Signal : UnityEvent<SignalParam> { } 11 12 13 /// <summary> 14 /// 信号行为参数 15 /// </summary> 16 public class SignalParam { . 17 public int intVal; 18 is public String stringVal; . 19 public the Dictionary < int , int > dicVal; 20 is public List < int > listVal; 21 is public the GameObject gameObjectVal; 22 is // their expansion of other parameters 23 } 24 25 // / <Summary> 26 is /// message center 27 /// </ Summary> 28 public classSignalCenter 29 { 30 // singleton pattern 31 is public static SignalCenter instance; 32 33 is // signal table 34 is Private the Dictionary < String , Signal> = eventDictionary new new the Dictionary < String , Signal> (); 35 36 Private static SignalParam onceParam { GET ; SET ;} // simple signal parameters, internal expansion interfaces, a reference note 37 [ /// <Summary> 38 is /// start monitoring, registration signals 39 /// </summary> 40 /// <param name="signalName">Event name.</param> 41 /// <param name="signalAction">signalAction.</param> 42 public static void Connect(string signalName, UnityAction<SignalParam> signalAction) 43 { 44 if (instance == null) 45 { 46 instance = new SignalCenter(); 47 if (instance == null) 48 { 49 Debug.Log("Have no event manager on scene"); 50 return; 51 } 52 } 53 Signal signal = null; 54 if (instance.eventDictionary.TryGetValue(signalName, out signal)) 55 { 56 signal.AddListener(signalAction); 57 } 58 else 59 { 60 signal = new Signal(); 61 signal.AddListener(signalAction); 62 instance.eventDictionary.Add(signalName, signal); 63 } 64 } 65 66 /// <summary> 67 /// 断开监听,取消信号 68 /// </summary> 69 /// <param name="signalName">Event name.</param> 70 /// <param name="signalAction">signalAction.</param> 71 public static void Disconnect(string signalName, UnityAction<SignalParam> signalAction) 72 { 73 is IF (instance == null ) 74 { 75 return ; 76 } 77 Signal Signal = null ; 78 IF (instance.eventDictionary.TryGetValue (SignalName, OUT Signal)) 79 { 80 signal.RemoveListener (signalAction); 81 } 82 } 83 84 /// <Summary> 85 /// transmission signal, the trigger 86 /// </ Summary> 87 /// <param name="signalName">Event name.</param> 88 /// <param name="obj">Object.</param> 89 /// <param name="param">Parameter.</param> 90 public static void Emit(string signalName, SignalParam param) 91 { 92 if (instance == null) 93 { 94 return; 95 } 96 Signal signal = null; 97 if (instance.eventDictionary.TryGetValue(signalName, out signal)) 98 { 99 signal.Invoke(param); 100 } 101 } 102 103 /// <summary> 104 /// 简单发送信号,整形参数 105 /// </summary> 106 /// <param name="signalName">Event name.</param> 107 /// <param name="obj">Object.</param> 108 /// <param name="param">Parameter.</param> 109 public static void Emit(string signalName, int intval) 110 { 111 if (instance == null) 112 { 113 return; 114 } 115 Signal signal = null; 116 onceParam.intVal = intval; 117 if (instance.eventDictionary.TryGetValue(signalName, out signal)) 118 { 119 signal.Invoke(onceParam); 120 } 121 } 122 }