{"id":1298,"date":"2017-09-14T13:09:44","date_gmt":"2017-09-14T05:09:44","guid":{"rendered":"http:\/\/39.100.100.179\/?p=1298"},"modified":"2018-12-15T11:44:12","modified_gmt":"2018-12-15T03:44:12","slug":"%e8%a7%a3%e8%80%a6%e5%90%88%e4%b9%8b%e5%b0%81%e8%a3%85%e6%b6%88%e6%81%af%e4%ba%8b%e4%bb%b6","status":"publish","type":"post","link":"http:\/\/www.u3d8.com\/?p=1298","title":{"rendered":"\u6d88\u606f\u8ba2\u9605\u5206\u53d1\u673a\u5236\u7684\u5b9e\u9645\u5e94\u7528"},"content":{"rendered":"<p>\u5728\u9879\u76ee\u4e2d\uff0c\u811a\u672c\u76f8\u4e92\u5f15\u7528\u4f1a\u9020\u6210\u8026\u5408\u6027\u7684\u589e\u52a0\uff0c\u800c\u4f7f\u7528\u6d88\u606f\u8ba2\u9605\u5206\u53d1\uff0c\u53ef\u4ee5\u89e3\u8026\u5408\u3002<\/p>\n<p>\u4eca\u5929\u6211\u4eec\u6765\u5b9e\u73b0\u7edf\u4e00\u7ba1\u7406\u7684\u6d88\u606f\u4e8b\u4ef6\u7ba1\u7406\u3002<\/p>\n<p>\u90e8\u5206\u6e90\u7801\u6765\u81ea\uff1a<a href=\"http:\/\/www.cnblogs.com\/suoluo\/p\/7439944.html\" target=\"_blank\" rel=\"noopener\">http:\/\/www.cnblogs.com\/suoluo\/p\/7439944.html<\/a><\/p>\n<pre class=\"lang:c# decode:true \">using UnityEngine;\r\nusing System.Collections.Generic;\r\nusing System;\r\n\r\n\/\/\/ &lt;summary&gt;\r\n\/\/\/ \u6d88\u606f\u7c7b\u578b\r\n\/\/\/ &lt;\/summary&gt;\r\npublic enum EventType\r\n{\r\n    GetDiamond,     \/\/ \u83b7\u5f97\u94bb\u77f3\r\n    GetCoin,        \/\/ \u83b7\u5f97\u94b1\u5e01\r\n    LevelUp,        \/\/ \u5347\u7ea7\r\n}\r\n\r\npublic class EventMgr\r\n{\r\n\r\n    public delegate void Act();\r\n    public delegate void Act&lt;T&gt;(T t);\r\n    public delegate void Act&lt;T1, T2&gt;(T1 t1, T2 t2);\r\n    public delegate void Act&lt;T1, T2, T3&gt;(T1 t1, T2 t2, T3 t3);\r\n    public delegate void Act&lt;T1, T2, T3, T4&gt;(T1 t1, T2 t2, T3 t3, T4 t4);\r\n    \/\/public delegate void Act&lt;T1, T2, T3, T4, T5&gt;(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5);\r\n\r\n    static Dictionary&lt;EventType, Delegate&gt; eventTable = new Dictionary&lt;EventType, Delegate&gt;();\r\n\r\n    #region \u6ce8\u518c\u76d1\u542c\r\n    public static void AddListener(EventType type, Act act)\r\n    {\r\n        if (!eventTable.ContainsKey(type))\r\n        {\r\n            eventTable.Add(type, null);\r\n        }\r\n\r\n        Delegate d = eventTable[type];\r\n        if (d != null &amp;&amp; d.GetType() != act.GetType())\r\n        {\r\n            Debug.LogError(string.Format(\"Attempting to add listener with inconsistent signature for event type {0}. Current listeners have type {1} and listener being added has type {2}\", type, d.GetType().Name, act.GetType().Name));\r\n        }\r\n        else\r\n        {\r\n            eventTable[type] = (Act)eventTable[type] + act;\r\n        }\r\n    }\r\n    public static void AddListener&lt;T&gt;(EventType type, Act&lt;T&gt; act)\r\n    {\r\n        if (!eventTable.ContainsKey(type))\r\n        {\r\n            eventTable.Add(type, null);\r\n        }\r\n\r\n        Delegate d = eventTable[type];\r\n        if (d != null &amp;&amp; d.GetType() != act.GetType())\r\n        {\r\n            Debug.LogError(string.Format(\"Attempting to add listener with inconsistent signature for event type {0}. Current listeners have type {1} and listener being added has type {2}\", type, d.GetType().Name, act.GetType().Name));\r\n        }\r\n        else\r\n        {\r\n            eventTable[type] = (Act&lt;T&gt;)eventTable[type] + act;\r\n        }\r\n    }\r\n    public static void AddListener&lt;T1, T2&gt;(EventType type, Act&lt;T1, T2&gt; act)\r\n    {\r\n        if (!eventTable.ContainsKey(type))\r\n        {\r\n            eventTable.Add(type, null);\r\n        }\r\n\r\n        Delegate d = eventTable[type];\r\n        if (d != null &amp;&amp; d.GetType() != act.GetType())\r\n        {\r\n            Debug.LogError(string.Format(\"Attempting to add listener with inconsistent signature for event type {0}. Current listeners have type {1} and listener being added has type {2}\", type, d.GetType().Name, act.GetType().Name));\r\n        }\r\n        else\r\n        {\r\n            eventTable[type] = (Act&lt;T1, T2&gt;)eventTable[type] + act;\r\n        }\r\n    }\r\n    public static void AddListener&lt;T1, T2, T3&gt;(EventType type, Act&lt;T1, T2, T3&gt; act)\r\n    {\r\n        if (!eventTable.ContainsKey(type))\r\n        {\r\n            eventTable.Add(type, null);\r\n        }\r\n\r\n        Delegate d = eventTable[type];\r\n        if (d != null &amp;&amp; d.GetType() != act.GetType())\r\n        {\r\n            Debug.LogError(string.Format(\"Attempting to add listener with inconsistent signature for event type {0}. Current listeners have type {1} and listener being added has type {2}\", type, d.GetType().Name, act.GetType().Name));\r\n        }\r\n        else\r\n        {\r\n            eventTable[type] = (Act&lt;T1, T2, T3&gt;)eventTable[type] + act;\r\n        }\r\n    }\r\n    public static void AddListener&lt;T1, T2, T3, T4&gt;(EventType type, Act&lt;T1, T2, T3, T4&gt; act)\r\n    {\r\n        if (!eventTable.ContainsKey(type))\r\n        {\r\n            eventTable.Add(type, null);\r\n        }\r\n\r\n        Delegate d = eventTable[type];\r\n        if (d != null &amp;&amp; d.GetType() != act.GetType())\r\n        {\r\n            Debug.LogError(string.Format(\"Attempting to add listener with inconsistent signature for event type {0}. Current listeners have type {1} and listener being added has type {2}\", type, d.GetType().Name, act.GetType().Name));\r\n        }\r\n        else\r\n        {\r\n            eventTable[type] = (Act&lt;T1, T2, T3, T4&gt;)eventTable[type] + act;\r\n        }\r\n    }\r\n    #endregion\r\n\r\n    #region \u79fb\u9664\u76d1\u542c\r\n    public static void RemoveListener(EventType type, Act listenerBeingRemoved)\r\n    {\r\n        if (eventTable.ContainsKey(type))\r\n        {\r\n            Delegate d = eventTable[type];\r\n\r\n            if (d == null)\r\n            {\r\n                Debug.LogError(string.Format(\"Attempting to remove listener with for event type \\\"{0}\\\" but current listener is null.\", type));\r\n            }\r\n            else if (d.GetType() != listenerBeingRemoved.GetType())\r\n            {\r\n                Debug.LogError(string.Format(\"Attempting to remove listener with inconsistent signature for event type {0}. Current listeners have type {1} and listener being removed has type {2}\", type, d.GetType().Name, listenerBeingRemoved.GetType().Name));\r\n            }\r\n            else\r\n            {\r\n                eventTable[type] = (Act)eventTable[type] - listenerBeingRemoved;\r\n                if (eventTable[type] == null)\r\n                {\r\n                    eventTable.Remove(type);\r\n                }\r\n            }\r\n        }\r\n        else\r\n        {\r\n            Debug.LogError(string.Format(\"Attempting to remove listener for type \\\"{0}\\\" but Messenger doesn't know about this event type.\", type));\r\n        }\r\n    }\r\n    public static void RemoveListener&lt;T&gt;(EventType type, Act&lt;T&gt; listenerBeingRemoved)\r\n    {\r\n        if (eventTable.ContainsKey(type))\r\n        {\r\n            Delegate d = eventTable[type];\r\n\r\n            if (d == null)\r\n            {\r\n                Debug.LogError(string.Format(\"Attempting to remove listener with for event type \\\"{0}\\\" but current listener is null.\", type));\r\n            }\r\n            else if (d.GetType() != listenerBeingRemoved.GetType())\r\n            {\r\n                Debug.LogError(string.Format(\"Attempting to remove listener with inconsistent signature for event type {0}. Current listeners have type {1} and listener being removed has type {2}\", type, d.GetType().Name, listenerBeingRemoved.GetType().Name));\r\n            }\r\n            else\r\n            {\r\n                eventTable[type] = (Act&lt;T&gt;)eventTable[type] - listenerBeingRemoved;\r\n                if (eventTable[type] == null)\r\n                {\r\n                    eventTable.Remove(type);\r\n                }\r\n            }\r\n        }\r\n        else\r\n        {\r\n            Debug.LogError(string.Format(\"Attempting to remove listener for type \\\"{0}\\\" but Messenger doesn't know about this event type.\", type));\r\n        }\r\n    }\r\n    public static void RemoveListener&lt;T1, T2&gt;(EventType type, Act&lt;T1, T2&gt; listenerBeingRemoved)\r\n    {\r\n        if (eventTable.ContainsKey(type))\r\n        {\r\n            Delegate d = eventTable[type];\r\n\r\n            if (d == null)\r\n            {\r\n                Debug.LogError(string.Format(\"Attempting to remove listener with for event type \\\"{0}\\\" but current listener is null.\", type));\r\n            }\r\n            else if (d.GetType() != listenerBeingRemoved.GetType())\r\n            {\r\n                Debug.LogError(string.Format(\"Attempting to remove listener with inconsistent signature for event type {0}. Current listeners have type {1} and listener being removed has type {2}\", type, d.GetType().Name, listenerBeingRemoved.GetType().Name));\r\n            }\r\n            else\r\n            {\r\n                eventTable[type] = (Act&lt;T1, T2&gt;)eventTable[type] - listenerBeingRemoved;\r\n                if (eventTable[type] == null)\r\n                {\r\n                    eventTable.Remove(type);\r\n                }\r\n            }\r\n        }\r\n        else\r\n        {\r\n            Debug.LogError(string.Format(\"Attempting to remove listener for type \\\"{0}\\\" but Messenger doesn't know about this event type.\", type));\r\n        }\r\n    }\r\n    public static void RemoveListener&lt;T1, T2, T3&gt;(EventType type, Act&lt;T1, T2, T3&gt; listenerBeingRemoved)\r\n    {\r\n        if (eventTable.ContainsKey(type))\r\n        {\r\n            Delegate d = eventTable[type];\r\n\r\n            if (d == null)\r\n            {\r\n                Debug.LogError(string.Format(\"Attempting to remove listener with for event type \\\"{0}\\\" but current listener is null.\", type));\r\n            }\r\n            else if (d.GetType() != listenerBeingRemoved.GetType())\r\n            {\r\n                Debug.LogError(string.Format(\"Attempting to remove listener with inconsistent signature for event type {0}. Current listeners have type {1} and listener being removed has type {2}\", type, d.GetType().Name, listenerBeingRemoved.GetType().Name));\r\n            }\r\n            else\r\n            {\r\n                eventTable[type] = (Act&lt;T1, T2, T3&gt;)eventTable[type] - listenerBeingRemoved;\r\n                if (eventTable[type] == null)\r\n                {\r\n                    eventTable.Remove(type);\r\n                }\r\n            }\r\n        }\r\n        else\r\n        {\r\n            Debug.LogError(string.Format(\"Attempting to remove listener for type \\\"{0}\\\" but Messenger doesn't know about this event type.\", type));\r\n        }\r\n    }\r\n    public static void RemoveListener&lt;T1, T2, T3, T4&gt;(EventType type, Act&lt;T1, T2, T3, T4&gt; listenerBeingRemoved)\r\n    {\r\n        if (eventTable.ContainsKey(type))\r\n        {\r\n            Delegate d = eventTable[type];\r\n\r\n            if (d == null)\r\n            {\r\n                Debug.LogError(string.Format(\"Attempting to remove listener with for event type \\\"{0}\\\" but current listener is null.\", type));\r\n            }\r\n            else if (d.GetType() != listenerBeingRemoved.GetType())\r\n            {\r\n                Debug.LogError(string.Format(\"Attempting to remove listener with inconsistent signature for event type {0}. Current listeners have type {1} and listener being removed has type {2}\", type, d.GetType().Name, listenerBeingRemoved.GetType().Name));\r\n            }\r\n            else\r\n            {\r\n                eventTable[type] = (Act&lt;T1, T2, T3, T4&gt;)eventTable[type] - listenerBeingRemoved;\r\n                if (eventTable[type] == null)\r\n                {\r\n                    eventTable.Remove(type);\r\n                }\r\n            }\r\n        }\r\n        else\r\n        {\r\n            Debug.LogError(string.Format(\"Attempting to remove listener for type \\\"{0}\\\" but Messenger doesn't know about this event type.\", type));\r\n        }\r\n    }\r\n\r\n    public static void RemoveAllListener(EventType type)\r\n    {\r\n        if (eventTable.ContainsKey(type))\r\n        {\r\n            eventTable[type] = null;\r\n            eventTable.Remove(type);\r\n        }\r\n        else\r\n        {\r\n            Debug.LogError(string.Format(\"Attempting to remove listener for type \\\"{0}\\\" but Messenger doesn't know about this event type.\", type));\r\n        }\r\n    }\r\n    #endregion\r\n\r\n    #region \u5206\u914d\u6d88\u606f\r\n    public static void Dispatch(EventType type)\r\n    {\r\n        Delegate d;\r\n        if (eventTable.TryGetValue(type, out d))\r\n        {\r\n            Act callback = d as Act;\r\n\r\n            if (callback != null)\r\n            {\r\n                callback();\r\n            }\r\n            else\r\n            {\r\n                Debug.LogError(string.Format(\"no such event type {0}\", type));\r\n            }\r\n        }\r\n    }\r\n    public static void Dispatch&lt;T&gt;(EventType type, T param1)\r\n    {\r\n        Delegate d;\r\n        if (eventTable.TryGetValue(type, out d))\r\n        {\r\n            Act&lt;T&gt; callback = d as Act&lt;T&gt;;\r\n\r\n            if (callback != null)\r\n            {\r\n                callback(param1);\r\n            }\r\n            else\r\n            {\r\n                Debug.LogError(string.Format(\"no such event type {0}\", type));\r\n            }\r\n        }\r\n    }\r\n    public static void Dispatch&lt;T1, T2&gt;(EventType type, T1 param1, T2 param2)\r\n    {\r\n        Delegate d;\r\n        if (eventTable.TryGetValue(type, out d))\r\n        {\r\n            Act&lt;T1, T2&gt; callback = d as Act&lt;T1, T2&gt;;\r\n\r\n            if (callback != null)\r\n            {\r\n                callback(param1, param2);\r\n            }\r\n            else\r\n            {\r\n                Debug.LogError(string.Format(\"no such event type {0}\", type));\r\n            }\r\n        }\r\n    }\r\n    public static void Dispatch&lt;T1, T2, T3&gt;(EventType type, T1 param1, T2 param2, T3 param3)\r\n    {\r\n        Delegate d;\r\n        if (eventTable.TryGetValue(type, out d))\r\n        {\r\n            Act&lt;T1, T2, T3&gt; callback = d as Act&lt;T1, T2, T3&gt;;\r\n\r\n            if (callback != null)\r\n            {\r\n                callback(param1, param2, param3);\r\n            }\r\n            else\r\n            {\r\n                Debug.LogError(string.Format(\"no such event type {0}\", type));\r\n            }\r\n        }\r\n    }\r\n    public static void Dispatch&lt;T1, T2, T3, T4&gt;(EventType type, T1 param1, T2 param2, T3 param3, T4 param4)\r\n    {\r\n        Delegate d;\r\n        if (eventTable.TryGetValue(type, out d))\r\n        {\r\n            Act&lt;T1, T2, T3, T4&gt; callback = d as Act&lt;T1, T2, T3, T4&gt;;\r\n\r\n            if (callback != null)\r\n            {\r\n                callback(param1, param2, param3, param4);\r\n            }\r\n            else\r\n            {\r\n                Debug.LogError(string.Format(\"no such event type {0}\", type));\r\n            }\r\n        }\r\n    }\r\n    #endregion\r\n}<\/pre>\n<p>\u6d4b\u8bd5\u4ee3\u7801\uff1a<\/p>\n<pre class=\"lang:c# decode:true \">using UnityEngine;\r\nusing System.Collections;\r\n\r\npublic class Test : MonoBehaviour\r\n{\r\n\r\n    void Start()\r\n    {\r\n        EventMgr.AddListener&lt;int&gt;(EventType.GetCoin, CoinCallBack);\r\n        EventMgr.Dispatch(EventType.GetCoin, 100);\r\n        EventMgr.RemoveListener&lt;int&gt;(EventType.GetCoin, CoinCallBack);\r\n\r\n\r\n        EventMgr.AddListener&lt;int, float&gt;(EventType.LevelUp, LevelUpCallBack1);\r\n        EventMgr.AddListener&lt;int, float&gt;(EventType.LevelUp, LevelUpCallBack2);\r\n        EventMgr.Dispatch(EventType.LevelUp, 2, 392f);\r\n\r\n        EventMgr.RemoveListener&lt;int, float&gt;(EventType.LevelUp, LevelUpCallBack1);\r\n        EventMgr.Dispatch&lt;int, float&gt;(EventType.LevelUp, 3, 256f);\r\n\r\n    }\r\n\r\n    private void CoinCallBack(int coin)\r\n    {\r\n        Debug.Log(\"CoinCallBack \" + coin);\r\n    }\r\n\r\n    private void LevelUpCallBack1(int level, float exp)\r\n    {\r\n        Debug.Log(\"LevelUpCallBack1 \" + level + \" \" + exp);\r\n    }\r\n    private void LevelUpCallBack2(int level, float exp)\r\n    {\r\n        Debug.Log(\"LevelUpCallBack2 \" + level + \" \" + exp);\r\n    }\r\n\r\n}\r\n<\/pre>\n<p><a href=\"http:\/\/www.u3d8.com\/wp-content\/uploads\/2017\/09\/QQ\u622a\u56fe20170914130953.png\" data-lightbox=\"image_lg\"><img title=\"\u6d88\u606f\u8ba2\u9605\u5206\u53d1\u673a\u5236\u7684\u5b9e\u9645\u5e94\u7528 - \u7b2c1\u5f20  | u3d8\u6280\u672f\u5206\u4eab\" alt=\"\u6d88\u606f\u8ba2\u9605\u5206\u53d1\u673a\u5236\u7684\u5b9e\u9645\u5e94\u7528 - \u7b2c1\u5f20  | u3d8\u6280\u672f\u5206\u4eab\"  loading=\"lazy\" class=\"aligncenter size-full wp-image-1301\"  data-src=\"http:\/\/www.u3d8.com\/wp-content\/uploads\/2017\/09\/QQ\u622a\u56fe20170914130953.png\" width=\"410\" height=\"199\" srcset=\"http:\/\/www.u3d8.com\/wp-content\/uploads\/2017\/09\/QQ\u622a\u56fe20170914130953.png 410w, http:\/\/www.u3d8.com\/wp-content\/uploads\/2017\/09\/QQ\u622a\u56fe20170914130953-300x146.png 300w\" sizes=\"(max-width: 410px) 100vw, 410px\" \/><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u5728\u9879\u76ee\u4e2d\uff0c\u811a\u672c\u76f8\u4e92\u5f15\u7528\u4f1a\u9020\u6210\u8026\u5408\u6027\u7684\u589e\u52a0\uff0c\u800c\u4f7f\u7528\u6d88\u606f\u8ba2\u9605\u5206\u53d1\uff0c\u53ef\u4ee5\u89e3\u8026\u5408\u3002 \u4eca\u5929 &hellip; <a href=\"http:\/\/www.u3d8.com\/?p=1298\">\u7ee7\u7eed\u9605\u8bfb <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[23],"tags":[69],"_links":{"self":[{"href":"http:\/\/www.u3d8.com\/index.php?rest_route=\/wp\/v2\/posts\/1298"}],"collection":[{"href":"http:\/\/www.u3d8.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.u3d8.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.u3d8.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.u3d8.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1298"}],"version-history":[{"count":9,"href":"http:\/\/www.u3d8.com\/index.php?rest_route=\/wp\/v2\/posts\/1298\/revisions"}],"predecessor-version":[{"id":1900,"href":"http:\/\/www.u3d8.com\/index.php?rest_route=\/wp\/v2\/posts\/1298\/revisions\/1900"}],"wp:attachment":[{"href":"http:\/\/www.u3d8.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1298"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.u3d8.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1298"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.u3d8.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1298"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}