/// <summary> /// 处理服务器到客户端的调用 /// </summary> /// <param name="buf"></param> private void OnCallScript(KProtoBuf buf) { S2C_CALL_SCRIPT respond = buf as S2C_CALL_SCRIPT; ArrayList remoteObjects = UnpackAll(new MemoryStream(respond.data)); uint methodHash = (uint)remoteObjects[0]; MethodInfo methodInfo = hash2MethodInfo.ContainsKey(methodHash) ? hash2MethodInfo[methodHash] : null; if (methodInfo == null) { //Debugger.LogErrorFormat("Remote call method error, no such function, protocolID = {0}, hashCode = {1}", respond.protocolID, methodHash); return; } //Debug.LogWarning(methodInfo.Name); if (Application.isEditor) { try { methodInfo.Invoke(this, FixRemoteCallParams(remoteObjects, methodInfo.GetParameters())); } catch (System.Exception ex) { Debug.LogError("Remote call method error in function hashCode = " + methodHash + " Methodinfo Name: " + methodInfo.Name); Debug.LogException(ex); } } else { methodInfo.Invoke(this, FixRemoteCallParams(remoteObjects, methodInfo.GetParameters())); } //回收临时数据 RemoteBool.ResetPosition(); RemoteInt8.ResetPosition(); RemoteInt16.ResetPosition(); RemoteInt32.ResetPosition(); RemoteUInt8.ResetPosition(); RemoteUInt16.ResetPosition(); RemoteUInt32.ResetPosition(); RemoteFloat.ResetPosition(); RemoteDouble.ResetPosition(); RemoteString.ResetPosition(); RemoteString.ResetPosition(); RemoteUInt64.ResetPosition(); }
private ushort UnPackTable(MemoryStream stream, BinaryReader read, ArrayList retArray, ushort tabSize = 0) { if (tabSize == 0) { tabSize = read.ReadUInt16(); } uint tabEnd = (uint)(stream.Position) + tabSize; RemoteTable luaTab = new RemoteTable(); while (stream.Position < tabEnd) { ArrayList tabKV = new ArrayList(); KSDType keyType = UnPackUp(stream, read, tabKV); KSDType valueType = UnPackUp(stream, read, tabKV); if (IsNumberType(keyType)) { int nIndex = Convert.ToInt32(tabKV[0]); switch (valueType) { case KSDType.kstBool: luaTab[nIndex] = RemoteBool.GetItem((bool)tabKV[1]); break; case KSDType.kstInt8: luaTab[nIndex] = RemoteInt8.GetItem((sbyte)tabKV[1]); break; case KSDType.kstInt16: luaTab[nIndex] = RemoteInt16.GetItem((short)tabKV[1]); break; case KSDType.kstInt32: luaTab[nIndex] = RemoteInt32.GetItem((int)tabKV[1]); break; case KSDType.kstUInt8: luaTab[nIndex] = RemoteUInt8.GetItem((byte)tabKV[1]); break; case KSDType.kstUInt16: luaTab[nIndex] = RemoteUInt16.GetItem((ushort)tabKV[1]); break; case KSDType.kstUInt32: luaTab[nIndex] = RemoteUInt32.GetItem((uint)tabKV[1]); break; case KSDType.kstFloat: luaTab[nIndex] = RemoteFloat.GetItem((float)tabKV[1]); break; case KSDType.kstDouble: luaTab[nIndex] = RemoteDouble.GetItem((double)tabKV[1]); break; case KSDType.kstString: luaTab[nIndex] = RemoteString.GetItem((string)tabKV[1]); break; case KSDType.kstBigString: luaTab[nIndex] = RemoteString.GetItem((string)tabKV[1]); break; case KSDType.kstUInt64: luaTab[nIndex] = RemoteUInt64.GetItem((ulong)tabKV[1]); break; case KSDType.kstDataStream: luaTab[nIndex] = tabKV[1] as RemoteTable; break; case KSDType.kstNull: luaTab[nIndex] = null; break; default: Debug.LogError("UnKnow ValueType"); break; } } else if (keyType == KSDType.kstString) { string name = tabKV[0] as string; switch (valueType) { case KSDType.kstBool: luaTab[name] = RemoteBool.GetItem((bool)tabKV[1]); break; case KSDType.kstInt8: luaTab[name] = RemoteInt8.GetItem((sbyte)tabKV[1]); break; case KSDType.kstInt16: luaTab[name] = RemoteInt16.GetItem((short)tabKV[1]); break; case KSDType.kstInt32: luaTab[name] = RemoteInt32.GetItem((int)tabKV[1]); break; case KSDType.kstUInt8: luaTab[name] = RemoteUInt8.GetItem((byte)tabKV[1]); break; case KSDType.kstUInt16: luaTab[name] = RemoteUInt16.GetItem((ushort)tabKV[1]); break; case KSDType.kstUInt32: luaTab[name] = RemoteUInt32.GetItem((uint)tabKV[1]); break; case KSDType.kstFloat: luaTab[name] = RemoteFloat.GetItem((float)tabKV[1]); break; case KSDType.kstDouble: luaTab[name] = RemoteDouble.GetItem((double)tabKV[1]); break; case KSDType.kstString: luaTab[name] = RemoteString.GetItem((string)tabKV[1]); break; case KSDType.kstBigString: luaTab[name] = RemoteString.GetItem((string)tabKV[1]); break; case KSDType.kstUInt64: luaTab[name] = RemoteUInt64.GetItem((ulong)tabKV[1]); break; case KSDType.kstDataStream: luaTab[name] = tabKV[1] as RemoteTable; break; case KSDType.kstNull: luaTab[name] = null; break; default: Debug.LogError("UnKnow ValueType"); break; } } else { Debug.LogError("RemoteCall UnPackTable error, key type error"); throw new NotImplementedException(); } } retArray.Add(luaTab); return(tabSize); }