2using System.Collections.Generic;
3using System.Runtime.InteropServices;
16 static readonly UTF8Encoding encoding =
new UTF8Encoding(
false,
true);
17 static readonly
byte[] stringBuffer =
new byte[
NetworkWriter.MaxStringLength];
19 public static void WriteByte(
this NetworkWriter writer,
byte value) => writer.WriteBlittable(value);
20 public static void WriteByteNullable(
this NetworkWriter writer,
byte? value) => writer.WriteBlittableNullable(value);
22 public static void WriteSByte(
this NetworkWriter writer, sbyte value) => writer.WriteBlittable(value);
23 public static void WriteSByteNullable(
this NetworkWriter writer, sbyte? value) => writer.WriteBlittableNullable(value);
26 public static void WriteChar(
this NetworkWriter writer,
char value) => writer.WriteBlittable((ushort)value);
27 public static void WriteCharNullable(
this NetworkWriter writer,
char? value) => writer.WriteBlittableNullable((ushort?)value);
30 public static void WriteBool(
this NetworkWriter writer,
bool value) => writer.WriteBlittable((
byte)(value ? 1 : 0));
31 public static void WriteBoolNullable(
this NetworkWriter writer,
bool? value) => writer.WriteBlittableNullable(value.HasValue ? ((
byte)(value.Value ? 1 : 0)) :
new byte?());
33 public static void WriteShort(
this NetworkWriter writer,
short value) => writer.WriteBlittable(value);
34 public static void WriteShortNullable(
this NetworkWriter writer,
short? value) => writer.WriteBlittableNullable(value);
36 public static void WriteUShort(
this NetworkWriter writer, ushort value) => writer.WriteBlittable(value);
37 public static void WriteUShortNullable(
this NetworkWriter writer, ushort? value) => writer.WriteBlittableNullable(value);
39 public static void WriteInt(
this NetworkWriter writer,
int value) => writer.WriteBlittable(value);
40 public static void WriteIntNullable(
this NetworkWriter writer,
int? value) => writer.WriteBlittableNullable(value);
42 public static void WriteUInt(
this NetworkWriter writer, uint value) => writer.WriteBlittable(value);
43 public static void WriteUIntNullable(
this NetworkWriter writer, uint? value) => writer.WriteBlittableNullable(value);
45 public static void WriteLong(
this NetworkWriter writer,
long value) => writer.WriteBlittable(value);
46 public static void WriteLongNullable(
this NetworkWriter writer,
long? value) => writer.WriteBlittableNullable(value);
48 public static void WriteULong(
this NetworkWriter writer, ulong value) => writer.WriteBlittable(value);
49 public static void WriteULongNullable(
this NetworkWriter writer, ulong? value) => writer.WriteBlittableNullable(value);
51 public static void WriteFloat(
this NetworkWriter writer,
float value) => writer.WriteBlittable(value);
52 public static void WriteFloatNullable(
this NetworkWriter writer,
float? value) => writer.WriteBlittableNullable(value);
54 [StructLayout(LayoutKind.Explicit)]
55 internal struct UIntDouble
58 public double doubleValue;
61 public ulong longValue;
64 public static void WriteDouble(
this NetworkWriter writer,
double value)
71 writer.WriteBlittable(value);
73 public static void WriteDoubleNullable(
this NetworkWriter writer,
double? value) => writer.WriteBlittableNullable(value);
75 public static void WriteDecimal(
this NetworkWriter writer, decimal value) => writer.WriteBlittable(value);
76 public static void WriteDecimalNullable(
this NetworkWriter writer, decimal? value) => writer.WriteBlittableNullable(value);
78 public static void WriteString(
this NetworkWriter writer,
string value)
86 writer.WriteUShort(0);
92 int size = encoding.GetBytes(value, 0, value.Length, stringBuffer, 0);
97 throw new IndexOutOfRangeException($
"NetworkWriter.Write(string) too long: {size}. Limit: {NetworkWriter.MaxStringLength}");
101 writer.WriteUShort(checked((ushort)(size + 1)));
102 writer.WriteBytes(stringBuffer, 0, size);
105 public static void WriteBytesAndSizeSegment(
this NetworkWriter writer, ArraySegment<byte> buffer)
107 writer.WriteBytesAndSize(buffer.Array, buffer.Offset, buffer.Count);
113 public static void WriteBytesAndSize(
this NetworkWriter writer,
byte[] buffer)
116 writer.WriteBytesAndSize(buffer, 0, buffer !=
null ? buffer.Length : 0);
122 public static void WriteBytesAndSize(
this NetworkWriter writer,
byte[] buffer,
int offset,
int count)
129 writer.WriteUInt(0u);
132 writer.WriteUInt(checked((uint)count) + 1u);
133 writer.WriteBytes(buffer, offset, count);
136 public static void WriteArraySegment<T>(
this NetworkWriter writer, ArraySegment<T> segment)
138 int length = segment.Count;
139 writer.WriteInt(length);
140 for (
int i = 0; i < length; i++)
142 writer.Write(segment.Array[segment.Offset + i]);
146 public static void WriteVector2(
this NetworkWriter writer, Vector2 value) => writer.WriteBlittable(value);
147 public static void WriteVector2Nullable(
this NetworkWriter writer, Vector2? value) => writer.WriteBlittableNullable(value);
149 public static void WriteVector3(
this NetworkWriter writer, Vector3 value) => writer.WriteBlittable(value);
150 public static void WriteVector3Nullable(
this NetworkWriter writer, Vector3? value) => writer.WriteBlittableNullable(value);
152 public static void WriteVector4(
this NetworkWriter writer, Vector4 value) => writer.WriteBlittable(value);
153 public static void WriteVector4Nullable(
this NetworkWriter writer, Vector4? value) => writer.WriteBlittableNullable(value);
155 public static void WriteVector2Int(
this NetworkWriter writer, Vector2Int value) => writer.WriteBlittable(value);
156 public static void WriteVector2IntNullable(
this NetworkWriter writer, Vector2Int? value) => writer.WriteBlittableNullable(value);
158 public static void WriteVector3Int(
this NetworkWriter writer, Vector3Int value) => writer.WriteBlittable(value);
159 public static void WriteVector3IntNullable(
this NetworkWriter writer, Vector3Int? value) => writer.WriteBlittableNullable(value);
161 public static void WriteColor(
this NetworkWriter writer, Color value) => writer.WriteBlittable(value);
162 public static void WriteColorNullable(
this NetworkWriter writer, Color? value) => writer.WriteBlittableNullable(value);
164 public static void WriteColor32(
this NetworkWriter writer, Color32 value) => writer.WriteBlittable(value);
165 public static void WriteColor32Nullable(
this NetworkWriter writer, Color32? value) => writer.WriteBlittableNullable(value);
167 public static void WriteQuaternion(
this NetworkWriter writer, Quaternion value) => writer.WriteBlittable(value);
168 public static void WriteQuaternionNullable(
this NetworkWriter writer, Quaternion? value) => writer.WriteBlittableNullable(value);
170 public static void WriteRect(
this NetworkWriter writer, Rect value) => writer.WriteBlittable(value);
171 public static void WriteRectNullable(
this NetworkWriter writer, Rect? value) => writer.WriteBlittableNullable(value);
173 public static void WritePlane(
this NetworkWriter writer, Plane value) => writer.WriteBlittable(value);
174 public static void WritePlaneNullable(
this NetworkWriter writer, Plane? value) => writer.WriteBlittableNullable(value);
176 public static void WriteRay(
this NetworkWriter writer, Ray value) => writer.WriteBlittable(value);
177 public static void WriteRayNullable(
this NetworkWriter writer, Ray? value) => writer.WriteBlittableNullable(value);
179 public static void WriteMatrix4x4(
this NetworkWriter writer, Matrix4x4 value) => writer.WriteBlittable(value);
180 public static void WriteMatrix4x4Nullable(
this NetworkWriter writer, Matrix4x4? value) => writer.WriteBlittableNullable(value);
182 public static void WriteGuid(
this NetworkWriter writer, Guid value)
184 byte[] data = value.ToByteArray();
185 writer.WriteBytes(data, 0, data.Length);
187 public static void WriteGuidNullable(
this NetworkWriter writer, Guid? value)
189 writer.WriteBool(value.HasValue);
191 writer.WriteGuid(value.Value);
209 if (value.
netId == 0)
210 Debug.LogWarning($
"Attempted to serialize unspawned GameObject: {value.name}. Prefabs and unspawned GameObjects would always be null on the other side. Please spawn it before using it in [SyncVar]s/Rpcs/Cmds/NetworkMessages etc.");
212 writer.WriteUInt(value.
netId);
222 writer.WriteUInt(value.
netId);
226 public static void WriteTransform(
this NetworkWriter writer, Transform value)
234 if (identity !=
null)
236 writer.WriteUInt(identity.
netId);
240 Debug.LogWarning($
"NetworkWriter {value} has no NetworkIdentity");
245 public static void WriteGameObject(
this NetworkWriter writer, GameObject value)
255 if (identity ==
null)
256 Debug.LogWarning($
"NetworkWriter {value} has no NetworkIdentity");
260 writer.WriteNetworkIdentity(identity);
263 public static void WriteList<T>(
this NetworkWriter writer, List<T> list)
270 writer.WriteInt(list.Count);
271 for (
int i = 0; i < list.Count; i++)
272 writer.Write(list[i]);
275 public static void WriteArray<T>(
this NetworkWriter writer, T[] array)
282 writer.WriteInt(array.Length);
283 for (
int i = 0; i < array.Length; i++)
284 writer.Write(array[i]);
287 public static void WriteUri(
this NetworkWriter writer, Uri uri)
289 writer.WriteString(uri?.ToString());
292 public static void WriteTexture2D(
this NetworkWriter writer, Texture2D texture2D)
300 if (texture2D ==
null)
302 writer.WriteShort(-1);
308 writer.WriteShort((
short)texture2D.width);
309 writer.WriteShort((
short)texture2D.height);
310 writer.WriteArray(texture2D.GetPixels32());
313 public static void WriteSprite(
this NetworkWriter writer, Sprite sprite)
320 writer.WriteTexture2D(
null);
324 writer.WriteTexture2D(sprite.texture);
325 writer.WriteRect(sprite.rect);
326 writer.WriteVector2(sprite.pivot);
Base class for networked components.
int ComponentIndex
Returns the index of the component on this object
uint netId
The unique network Id of this object (unique at runtime).
NetworkIdentity identifies objects across the network.
uint netId
The unique network Id of this object (unique at runtime).
Network Writer for most simple types like floats, ints, buffers, structs, etc. Use NetworkWriterPool....