//static readonly Dictionary<Type, FduSendableParameter> //根据参数获取该参数的可传递类型枚举变量 public static FduSendableParameter getSendableParameterCode(object parameter) { FduSendableParameter _result = FduSendableParameter.NotImplemented; if (parameter == null) { Debug.LogError("[FduSendableParameter]Sendable parameter can not be null!"); return(_result); } Type _paraType = parameter.GetType(); if (!ParamTypeCodedic.TryGetValue(_paraType, out _result)) { if (_paraType.IsEnum) { _result = FduSendableParameter.Enum; } else if (_paraType.IsValueType) { _result = FduSendableParameter.Struct; } else if (_paraType.IsSerializable) { _result = FduSendableParameter.SerializableClass; } else { _result = FduSendableParameter.NotImplemented; Debug.LogWarning("[FduSendableParameter]Can not send such type of parameter, type name is " + parameter.GetType().FullName + ", Please refer to enum FduSendableParameter or relative doc"); } } return(_result); }
//反序列化一个可传输的参数 public static object deserializeOneParameter(ref NetworkState.NETWORK_STATE_TYPE state) { FduSendableParameter typeCode = (FduSendableParameter)BufferedNetworkUtilsClient.ReadByte(ref state); object result; switch (typeCode) { case FduSendableParameter.Int: result = BufferedNetworkUtilsClient.ReadInt(ref state); break; case FduSendableParameter.IntArray: result = BufferedNetworkUtilsClient.ReadIntArray(ref state); break; case FduSendableParameter.Byte: result = BufferedNetworkUtilsClient.ReadByte(ref state); break; case FduSendableParameter.ByteArray: result = BufferedNetworkUtilsClient.ReadByteArray(ref state); break; case FduSendableParameter.Float: result = BufferedNetworkUtilsClient.ReadFloat(ref state); break; case FduSendableParameter.FloatArray: result = BufferedNetworkUtilsClient.ReadFloatArray(ref state); break; case FduSendableParameter.Bool: result = BufferedNetworkUtilsClient.ReadBool(ref state); break; case FduSendableParameter.BoolArray: int bollen = BufferedNetworkUtilsClient.ReadInt(ref state); bool[] bolarr = new bool[bollen]; for (int i = 0; i < bollen; ++i) { bolarr[i] = BufferedNetworkUtilsClient.ReadBool(ref state); } result = bolarr; break; case FduSendableParameter.String: result = BufferedNetworkUtilsClient.ReadString(ref state); break; case FduSendableParameter.StringArray: int strlen = BufferedNetworkUtilsClient.ReadInt(ref state); string[] strarr = new string[strlen]; for (int i = 0; i < strlen; ++i) { strarr[i] = BufferedNetworkUtilsClient.ReadString(ref state); } result = strarr; break; case FduSendableParameter.Vector2: result = BufferedNetworkUtilsClient.ReadVector2(ref state); break; case FduSendableParameter.Vector2Array: int v2len = BufferedNetworkUtilsClient.ReadInt(ref state); Vector2[] v2arr = new Vector2[v2len]; for (int i = 0; i < v2len; ++i) { v2arr[i] = BufferedNetworkUtilsClient.ReadVector2(ref state); } result = v2arr; break; case FduSendableParameter.Vector3: result = BufferedNetworkUtilsClient.ReadVector3(ref state); break; case FduSendableParameter.Vector3Array: int v3len = BufferedNetworkUtilsClient.ReadInt(ref state); Vector3[] v3arr = new Vector3[v3len]; for (int i = 0; i < v3len; ++i) { v3arr[i] = BufferedNetworkUtilsClient.ReadVector3(ref state); } result = v3arr; break; case FduSendableParameter.Vector4: result = BufferedNetworkUtilsClient.ReadVector4(ref state); break; case FduSendableParameter.Vector4Array: int v4len = BufferedNetworkUtilsClient.ReadInt(ref state); Vector4[] v4arr = new Vector4[v4len]; for (int i = 0; i < v4len; ++i) { v4arr[i] = BufferedNetworkUtilsClient.ReadVector4(ref state); } result = v4arr; break; case FduSendableParameter.Color: result = BufferedNetworkUtilsClient.ReadColor(ref state); break; case FduSendableParameter.ColorArray: int clen = BufferedNetworkUtilsClient.ReadInt(ref state); Color[] carray = new Color[clen]; for (int i = 0; i < clen; ++i) { carray[i] = BufferedNetworkUtilsClient.ReadColor(ref state); } result = carray; break; case FduSendableParameter.Quaternion: result = BufferedNetworkUtilsClient.ReadQuaternion(ref state); break; case FduSendableParameter.QuaternionArray: int qlen = BufferedNetworkUtilsClient.ReadInt(ref state); Quaternion[] qarr = new Quaternion[qlen]; for (int i = 0; i < qlen; i++) { qarr[i] = BufferedNetworkUtilsClient.ReadQuaternion(ref state); } result = qarr; break; case FduSendableParameter.Matrix4X4: result = BufferedNetworkUtilsClient.ReadMatrix4x4(ref state); break; case FduSendableParameter.Matrix4X4Array: int matlen = BufferedNetworkUtilsClient.ReadInt(ref state); Matrix4x4 [] matArr = new Matrix4x4[matlen]; for (int i = 0; i < matlen; ++i) { matArr[i] = BufferedNetworkUtilsClient.ReadMatrix4x4(ref state); } result = matArr; break; case FduSendableParameter.Rect: result = BufferedNetworkUtilsClient.ReadRect(ref state); break; case FduSendableParameter.RectArray: int rectlen = BufferedNetworkUtilsClient.ReadInt(ref state); Rect[] rectArr = new Rect[rectlen]; for (int i = 0; i < rectlen; ++i) { rectArr[i] = BufferedNetworkUtilsClient.ReadRect(ref state); } result = rectArr; break; case FduSendableParameter.GameObject: bool goType = BufferedNetworkUtilsClient.ReadBool(ref state); if (goType) //有clusterview的物体 { var view = FduClusterViewManager.getClusterView(BufferedNetworkUtilsClient.ReadInt(ref state)); if (view != null) { result = view.gameObject; } else { result = null; } } else //有唯一路径的gameobject { string path = BufferedNetworkUtilsClient.ReadString(ref state); result = FduSupportClass.getGameObjectByPath(path); } break; case FduSendableParameter.ClusterView: result = FduClusterViewManager.getClusterView(BufferedNetworkUtilsClient.ReadInt(ref state)); break; case FduSendableParameter.Struct: try { string typeName = BufferedNetworkUtilsClient.ReadString(ref state); System.Type type = System.Type.GetType(typeName); result = BufferedNetworkUtilsClient.ReadStruct(type, ref state); } catch (System.Exception e) { Debug.LogError("Error occured in reading struct data. Details: " + e.Message); throw; } break; case FduSendableParameter.SerializableClass: result = BufferedNetworkUtilsClient.ReadSerializableClass(ref state); break; case FduSendableParameter.Enum: result = BufferedNetworkUtilsClient.ReadInt(ref state); break; default: throw new InvalidSendableDataException("Received unsendable data type, type code:" + typeCode); } return(result); }
//序列化一个可传送的参数 public static void serializeOneParameter(object para) { FduSendableParameter typeCode = FduGlobalConfig.getSendableParameterCode(para); BufferedNetworkUtilsServer.SendByte((byte)typeCode); switch (typeCode) { case FduSendableParameter.Int: BufferedNetworkUtilsServer.SendInt((int)para); break; case FduSendableParameter.IntArray: BufferedNetworkUtilsServer.SendIntArray((int[])para); break; case FduSendableParameter.Byte: BufferedNetworkUtilsServer.SendByte((byte)para); break; case FduSendableParameter.ByteArray: BufferedNetworkUtilsServer.SendByteArray((byte[])para); break; case FduSendableParameter.Float: BufferedNetworkUtilsServer.SendFloat((float)para); break; case FduSendableParameter.FloatArray: BufferedNetworkUtilsServer.SendFloatArray((float[])para); break; case FduSendableParameter.Bool: BufferedNetworkUtilsServer.SendBool((bool)para); break; case FduSendableParameter.BoolArray: bool[] bolarr = (bool[])para; int bollen = bolarr.Length; BufferedNetworkUtilsServer.SendInt(bollen); for (int i = 0; i < bollen; ++i) { BufferedNetworkUtilsServer.SendBool(bolarr[i]); } break; case FduSendableParameter.String: BufferedNetworkUtilsServer.SendString((string)para); break; case FduSendableParameter.StringArray: string[] strarr = (string[])para; int strlen = strarr.Length; BufferedNetworkUtilsServer.SendInt(strlen); for (int i = 0; i < strlen; ++i) { BufferedNetworkUtilsServer.SendString(strarr[i]); } break; case FduSendableParameter.Vector2: BufferedNetworkUtilsServer.SendVector2((Vector2)para); break; case FduSendableParameter.Vector2Array: Vector2[] v2arr = (Vector2[])para; int v2len = v2arr.Length; BufferedNetworkUtilsServer.SendInt(v2len); for (int i = 0; i < v2len; ++i) { BufferedNetworkUtilsServer.SendVector2(v2arr[i]); } break; case FduSendableParameter.Vector3: BufferedNetworkUtilsServer.SendVector3((Vector3)para); break; case FduSendableParameter.Vector3Array: Vector3[] v3arr = (Vector3[])para; int v3len = v3arr.Length; BufferedNetworkUtilsServer.SendInt(v3len); for (int i = 0; i < v3len; ++i) { BufferedNetworkUtilsServer.SendVector3(v3arr[i]); } break; case FduSendableParameter.Vector4: BufferedNetworkUtilsServer.SendVector4((Vector4)para); break; case FduSendableParameter.Vector4Array: Vector4[] v4arr = (Vector4[])para; int v4len = v4arr.Length; BufferedNetworkUtilsServer.SendInt(v4len); for (int i = 0; i < v4len; ++i) { BufferedNetworkUtilsServer.SendVector3(v4arr[i]); } break; case FduSendableParameter.Color: BufferedNetworkUtilsServer.SendColor((Color)para); break; case FduSendableParameter.ColorArray: Color[] carray = (Color[])para; int clen = carray.Length; BufferedNetworkUtilsServer.SendInt(clen); for (int i = 0; i < clen; ++i) { BufferedNetworkUtilsServer.SendColor(carray[i]); } break; case FduSendableParameter.Quaternion: BufferedNetworkUtilsServer.SendQuaternion((Quaternion)para); break; case FduSendableParameter.QuaternionArray: Quaternion[] qarr = (Quaternion[])para; int qlen = qarr.Length; BufferedNetworkUtilsServer.SendInt(qlen); for (int i = 0; i < qlen; i++) { BufferedNetworkUtilsServer.SendQuaternion(qarr[i]); } break; case FduSendableParameter.GameObject: if (((GameObject)para).GetClusterView() != null) { BufferedNetworkUtilsServer.SendBool(true); BufferedNetworkUtilsServer.SendInt(((GameObject)para).GetClusterView().ViewId); } else { BufferedNetworkUtilsServer.SendBool(false); BufferedNetworkUtilsServer.SendString(FduSupportClass.getGameObjectPath((GameObject)para)); } break; case FduSendableParameter.ClusterView: BufferedNetworkUtilsServer.SendInt(((FduClusterView)para).ViewId); break; case FduSendableParameter.Matrix4X4: BufferedNetworkUtilsServer.SendMatrix4x4((Matrix4x4)para); break; case FduSendableParameter.Matrix4X4Array: Matrix4x4[] matarr = (Matrix4x4[])para; int mlen = matarr.Length; BufferedNetworkUtilsServer.SendInt(mlen); for (int i = 0; i < mlen; ++i) { BufferedNetworkUtilsServer.SendMatrix4x4(matarr[i]); } break; case FduSendableParameter.Rect: BufferedNetworkUtilsServer.SendRect((Rect)para); break; case FduSendableParameter.RectArray: Rect[] rectArr = (Rect[])para; int rectlen = rectArr.Length; BufferedNetworkUtilsServer.SendInt(rectlen); for (int i = 0; i < rectlen; ++i) { BufferedNetworkUtilsServer.SendRect(rectArr[i]); } break; case FduSendableParameter.Struct: BufferedNetworkUtilsServer.SendString(para.GetType().AssemblyQualifiedName); BufferedNetworkUtilsServer.SendStruct(para); break; case FduSendableParameter.SerializableClass: BufferedNetworkUtilsServer.SendSerializableClass(para); break; case FduSendableParameter.Enum: BufferedNetworkUtilsServer.SendInt(System.Convert.ToInt32(para)); break; default: throw new InvalidSendableDataException("Such type of data can not be sent. Type name:" + para.GetType().FullName); } }