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);
                }
            }
        }
        /// <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));
                }
            }
        }