using System; using System.Collections; using System.Collections.Generic; #if UNITY_EDITOR using UnityEditor.Experimental.GraphView; #endif using System.Runtime.CompilerServices; using Xorti = XericLibrary.Runtime.MacroLibrary.MacroMath; using UnityEngine; namespace XericLibrary.Runtime.MacroLibrary { public static class MacroEvent { #region 控制器 /// /// 保守事件控制器 /// class ConservativeManager { #region 字段属性 /// /// 事件索引器 /// private Dictionary EventIndex; /// /// 事件状态寄存器 /// private List eventRegister; #endregion #region 方法 public ConservativeManager() { EventIndex = new Dictionary(); eventRegister = new List(); } /// /// 保守地利用控制器调用一个事件分发器 /// public void InvokeConservative(Delegate targetevent) { var code = targetevent.GetHashCode(); int index = 0; if(!EventIndex.TryGetValue(code, out index)) EventIndex.Add(code, EventIndex.Count); targetevent.DynamicInvoke();// dynmic代表动态类型,包含装箱拆箱,速度会非常慢 } #endregion } #endregion #region 事件 /// /// 保守地调用一个事件分发器 /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool InvokeConservative(this Action invokedEvent, int sign, ref int register) { if(Xorti.GetByteState(register, sign)) return false; Xorti.SetByteState(ref register, sign, true); invokedEvent?.Invoke(); Xorti.SetByteState(ref register, sign, false); return true; } /// /// 保守地调用一个事件分发器 /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool InvokeConservative(this Action invokedEvent, PARAM input, int sign, ref int register) { if(Xorti.GetByteState(register, sign)) return false; Xorti.SetByteState(ref register, sign, true); invokedEvent?.Invoke(input); Xorti.SetByteState(ref register, sign, false); return true; } #endregion } }