Esempio n. 1
0
        /// <summary>
        /// Called on the server to serialize all <see cref="ITinyNetComponent"/> attached to this prefab.
        /// </summary>
        /// <param name="writer"></param>
        public void TinySerialize(NetDataWriter writer, bool firstStateUpdate)
        {
            if (firstStateUpdate)
            {
                for (int i = 0; i < _tinyNetComponents.Length; i++)
                {
                    // We are getting the length of how much this obj wrote.
                    _recycleWriter.Reset();

                    _tinyNetComponents[i].TinySerialize(_recycleWriter, firstStateUpdate);
                    // TODO: Compact this
                    writer.Put(_recycleWriter.Length);
                    writer.Put(_recycleWriter.Data, 0, _recycleWriter.Length);
                }

                return;
            }

            switch (_dirtyFlag.Length)
            {
            case 8:
                writer.Put((byte)TinyBitArrayUtil.BitArrayToU64(_dirtyFlag));
                break;

            case 16:
                writer.Put((ushort)TinyBitArrayUtil.BitArrayToU64(_dirtyFlag));
                break;

            case 32:
                writer.Put((uint)TinyBitArrayUtil.BitArrayToU64(_dirtyFlag));
                break;

            case 64:
                writer.Put((ulong)TinyBitArrayUtil.BitArrayToU64(_dirtyFlag));
                break;
            }

            for (int i = 0; i < _tinyNetComponents.Length; i++)
            {
                if (_dirtyFlag[i] == true)
                {
                    // We are getting the length of how much this obj wrote.
                    _recycleWriter.Reset();

                    _tinyNetComponents[i].TinySerialize(_recycleWriter, firstStateUpdate);
                    //Debug.Log("[Serialize] Size: " + _recycleWriter.Length + ", DirtyFlag: " + TinyBitArrayUtil.Display(_recycleWriter.Data[0]));
                    // TODO: Compact this
                    writer.Put(_recycleWriter.Length);
                    writer.Put(_recycleWriter.Data, 0, _recycleWriter.Length);
                }
            }
        }
Esempio n. 2
0
        /// <summary>
        /// Deserializes all <see cref="ITinyNetComponent"/> data.
        /// </summary>
        /// <param name="reader">The reader.</param>
        /// <param name="bInitialState">if set to <c>true</c> [b initial state].</param>
        public virtual void TinyDeserialize(TinyNetStateReader reader, bool firstStateUpdate)
        {
            if (firstStateUpdate && _tinyNetComponents == null)
            {
                if (TinyNetLogLevel.logWarn)
                {
                    TinyLogger.LogWarning("TinyNetIdentity::TinyDeserialize called with firstStateUpdate true, but _tinyNetComponents is null.");
                }
                CacheTinyNetObjects();
            }

            if (firstStateUpdate)
            {
                for (int i = 0; i < _tinyNetComponents.Length; i++)
                {
                    _tinyNetComponents[i].ReceiveNetworkID(new TinyNetworkID(TinyInstanceID.NetworkID, (byte)(i + 1)));

                    _recycleReader.Clear();
                    int rSize = reader.GetInt();
                    _recycleReader.SetSource(reader.RawData, reader.Position, rSize);

                    _recycleReader.SetFrameTick(reader.FrameTick);
                    _tinyNetComponents[i].TinyDeserialize(_recycleReader, firstStateUpdate);
                    // We jump the reader position to the amount of data we read.
                    reader.SkipBytes(rSize);
                }

                return;
            }

            switch (_dirtyFlag.Length)
            {
            case 8:
                TinyBitArrayUtil.U64ToBitArray(reader.GetByte(), _dirtyFlag);
                break;

            case 16:
                TinyBitArrayUtil.U64ToBitArray(reader.GetUShort(), _dirtyFlag);
                break;

            case 32:
                TinyBitArrayUtil.U64ToBitArray(reader.GetUInt(), _dirtyFlag);
                break;

            case 64:
                TinyBitArrayUtil.U64ToBitArray(reader.GetULong(), _dirtyFlag);
                break;
            }

            for (int i = 0; i < _tinyNetComponents.Length; i++)
            {
                if (_dirtyFlag[i] == true)
                {
                    _recycleReader.Clear();
                    int rSize = reader.GetInt();
                    _recycleReader.SetSource(reader.RawData, reader.Position, rSize);

                    _recycleReader.SetFrameTick(reader.FrameTick);
                    //Debug.Log("[Deserialize] Size: " + rSize + ", DirtyFlag: " + TinyBitArrayUtil.Display(_recycleReader.PeekByte()));
                    _tinyNetComponents[i].TinyDeserialize(_recycleReader, firstStateUpdate);
                    // We jump the reader position to the amount of data we read.
                    reader.SkipBytes(rSize);
                }
            }
        }
        /// <inheritdoc />
        public virtual void TinyDeserialize(TinyNetStateReader reader, bool firstStateUpdate)
        {
            if (!firstStateUpdate)
            {
                //uint dFlag = reader.GetUInt();
                //TinyBitArrayUtil.U64ToBitArray(dFlag, _dirtyFlag);
                switch (_dirtyFlag.Length)
                {
                case 0:
                    break;

                case 8:
                    //Debug.Log("Deserialize DirtyFlag: " + reader.PeekByte());
                    TinyBitArrayUtil.U64ToBitArray(reader.GetByte(), _dirtyFlag);
                    break;

                case 16:
                    TinyBitArrayUtil.U64ToBitArray(reader.GetUShort(), _dirtyFlag);
                    break;

                case 32:
                    TinyBitArrayUtil.U64ToBitArray(reader.GetUInt(), _dirtyFlag);
                    break;

                case 64:
                    TinyBitArrayUtil.U64ToBitArray(reader.GetULong(), _dirtyFlag);
                    break;
                }
            }

            //Debug.Log("DirtyFlag: " + _dirtyFlag[0]);
            //Debug.Log("DirtyFlag: " + TinyBitArrayUtil.Display(_dirtyFlag));

            Type type;
            int  maxSyncVar = propertiesName.Length;

            for (int i = 0; i < maxSyncVar; i++)
            {
                if (!firstStateUpdate && _dirtyFlag[i] == false)
                {
                    continue;
                }

                type = propertiesTypes[i];

                if (type == typeof(byte))
                {
                    byteAccessor[propertiesName[i]].Set(this, reader.GetByte());
                }
                else if (type == typeof(sbyte))
                {
                    sbyteAccessor[propertiesName[i]].Set(this, reader.GetSByte());
                }
                else if (type == typeof(short))
                {
                    shortAccessor[propertiesName[i]].Set(this, reader.GetShort());
                }
                else if (type == typeof(ushort))
                {
                    ushortAccessor[propertiesName[i]].Set(this, reader.GetUShort());
                }
                else if (type == typeof(int))
                {
                    intAccessor[propertiesName[i]].Set(this, reader.GetInt());
                }
                else if (type == typeof(uint))
                {
                    uintAccessor[propertiesName[i]].Set(this, reader.GetUInt());
                }
                else if (type == typeof(long))
                {
                    longAccessor[propertiesName[i]].Set(this, reader.GetLong());
                }
                else if (type == typeof(ulong))
                {
                    ulongAccessor[propertiesName[i]].Set(this, reader.GetULong());
                }
                else if (type == typeof(float))
                {
                    floatAccessor[propertiesName[i]].Set(this, reader.GetFloat());
                }
                else if (type == typeof(double))
                {
                    doubleAccessor[propertiesName[i]].Set(this, reader.GetDouble());
                }
                else if (type == typeof(bool))
                {
                    boolAccessor[propertiesName[i]].Set(this, reader.GetBool());
                }
                else if (type == typeof(string))
                {
                    stringAccessor[propertiesName[i]].Set(this, reader.GetString());
                }
            }
        }
        /// <summary>
        /// Serializates the data.
        /// </summary>
        /// <param name="writer">The writer.</param>
        /// <param name="firstStateUpdate">if set to <c>true</c> it's the first state update.</param>
        public virtual void TinySerialize(NetDataWriter writer, bool firstStateUpdate)
        {
            if (!firstStateUpdate)
            {
                //writer.Put((uint)TinyBitArrayUtil.BitArrayToU64(_dirtyFlag));
                switch (_dirtyFlag.Length)
                {
                case 0:
                    // Do nothing!
                    break;

                case 8:
                    //byte test = (byte)TinyBitArrayUtil.BitArrayToU64(_dirtyFlag);
                    //Debug.Log("Serialize DirtyFlag: " + test);
                    writer.Put((byte)TinyBitArrayUtil.BitArrayToU64(_dirtyFlag));
                    break;

                case 16:
                    writer.Put((ushort)TinyBitArrayUtil.BitArrayToU64(_dirtyFlag));
                    break;

                case 32:
                    writer.Put((uint)TinyBitArrayUtil.BitArrayToU64(_dirtyFlag));
                    break;

                case 64:
                    writer.Put((ulong)TinyBitArrayUtil.BitArrayToU64(_dirtyFlag));
                    break;
                }
            }

            //Debug.Log("DirtyFlag: " + _dirtyFlag[0]);
            //Debug.Log("DirtyFlag: " + TinyBitArrayUtil.Display(_dirtyFlag));

            Type type;
            int  maxSyncVar = propertiesName.Length;

            for (int i = 0; i < maxSyncVar; i++)
            {
                if (!firstStateUpdate && _dirtyFlag[i] == false)
                {
                    continue;
                }

                type = propertiesTypes[i];

                if (type == typeof(byte))
                {
                    writer.Put(byteAccessor[propertiesName[i]].Get(this));
                }
                else if (type == typeof(sbyte))
                {
                    writer.Put(sbyteAccessor[propertiesName[i]].Get(this));
                }
                else if (type == typeof(short))
                {
                    writer.Put(shortAccessor[propertiesName[i]].Get(this));
                }
                else if (type == typeof(ushort))
                {
                    writer.Put(ushortAccessor[propertiesName[i]].Get(this));
                }
                else if (type == typeof(int))
                {
                    writer.Put(intAccessor[propertiesName[i]].Get(this));
                }
                else if (type == typeof(uint))
                {
                    writer.Put(uintAccessor[propertiesName[i]].Get(this));
                }
                else if (type == typeof(long))
                {
                    writer.Put(longAccessor[propertiesName[i]].Get(this));
                }
                else if (type == typeof(ulong))
                {
                    writer.Put(ulongAccessor[propertiesName[i]].Get(this));
                }
                else if (type == typeof(float))
                {
                    writer.Put(floatAccessor[propertiesName[i]].Get(this));
                }
                else if (type == typeof(double))
                {
                    writer.Put(doubleAccessor[propertiesName[i]].Get(this));
                }
                else if (type == typeof(bool))
                {
                    writer.Put(boolAccessor[propertiesName[i]].Get(this));
                }
                else if (type == typeof(string))
                {
                    writer.Put(stringAccessor[propertiesName[i]].Get(this));
                }
            }
        }