コード例 #1
0
        //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);
        }
コード例 #2
0
        //反序列化一个可传输的参数
        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);
        }
コード例 #3
0
        //序列化一个可传送的参数
        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);
            }
        }