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