public static void RegisterNetworkHandlerAttributes() { List <NetworkMessageHandlerAttribute> serverMessageHandlers = (List <NetworkMessageHandlerAttribute>)get_serverMessageHandlers.GetValue(null); List <NetworkMessageHandlerAttribute> clientMessageHandlers = (List <NetworkMessageHandlerAttribute>)get_clientMessageHandlers.GetValue(null); HashSet <short> hashSet = new HashSet <short>(); Type[] types = typeof(NetworkHandler).Assembly.GetTypes(); for (int i = 0; i < types.Length; i++) { foreach (MethodInfo methodInfo in types[i].GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)) { object[] customAttributes = methodInfo.GetCustomAttributes(false); foreach (var attribute in customAttributes.OfType <NetworkMessageHandlerAttribute>()) { NetworkMessageHandlerAttribute networkMessageHandlerAttribute = (Attribute)attribute as NetworkMessageHandlerAttribute; NetworkMessageDelegate messageHandler = null; if (networkMessageHandlerAttribute != null) { messageHandler = (NetworkMessageDelegate)Delegate.CreateDelegate(typeof(NetworkMessageDelegate), methodInfo); if (messageHandler != null) { if (networkMessageHandlerAttribute.client) { clientMessageHandlers.Add(networkMessageHandlerAttribute); hashSet.Add(networkMessageHandlerAttribute.msgType); } if (networkMessageHandlerAttribute.server) { serverMessageHandlers.Add(networkMessageHandlerAttribute); hashSet.Add(networkMessageHandlerAttribute.msgType); } } if (messageHandler == null) { Debug.LogWarningFormat("Could not register message handler for {0}. The function signature is likely incorrect.", new object[] { methodInfo.Name }); } get_messageHandler.SetValue(networkMessageHandlerAttribute, messageHandler); if (!networkMessageHandlerAttribute.client && !networkMessageHandlerAttribute.server) { Debug.LogWarningFormat("Could not register message handler for {0}. It is marked as neither server nor client.", new object[] { methodInfo.Name }); } } } } } }
public override void Initialize() { var serverMessageHandlers = typeof(NetworkMessageHandlerAttribute).GetFieldValue <List <NetworkMessageHandlerAttribute> >("serverMessageHandlers"); var clientMessageHandlers = typeof(NetworkMessageHandlerAttribute).GetFieldValue <List <NetworkMessageHandlerAttribute> >("clientMessageHandlers"); var serverRpcHandler = new NetworkMessageHandlerAttribute { server = true, msgType = MessageTypeC2S }; var clientRpcHandler = new NetworkMessageHandlerAttribute { client = true, msgType = MessageTypeS2C }; var delegateC2S = (NetworkMessageDelegate)Delegate.CreateDelegate(typeof(NetworkMessageDelegate), MethodHelper.GetMethodInfo <Action <NetworkMessage> >(HandleC2S)); var delegateS2C = (NetworkMessageDelegate)Delegate.CreateDelegate(typeof(NetworkMessageDelegate), MethodHelper.GetMethodInfo <Action <NetworkMessage> >(HandleS2C)); serverRpcHandler.SetFieldValue("messageHandler", delegateC2S); clientRpcHandler.SetFieldValue("messageHandler", delegateS2C); serverMessageHandlers.Add(serverRpcHandler); clientMessageHandlers.Add(clientRpcHandler); }