Practical signaling system

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 }

Guess you like

Origin www.cnblogs.com/leilei-weapon/p/12110159.html