mirror of
https://github.com/MirrorNetworking/Mirror.git
synced 2024-11-18 02:50:32 +00:00
fix: Unity 2019, 2020 support added again (#3230)
* fix: Examples/AdditiveLevels/Prefabs/Portal doesn't depend on TextMeshPro anymore (for 2019 compatibility) * packages: removed unnecessary TextMeshPro (causes errors in Unity 2019) * fix: NetworkReader byte[] constructor added again for 2019 support * fix: NetworkReader byte[] SetBuffer added again for 2019 support * fix: NetworkClient OnTimeSnapshotMessage: NetworkTime.localTime for 2019 support * fix: NetworkServer NetworkLateUpdate: NetworkTime.localTime for 2019 support * fix: Read/WriteGuid support for 2019 * fix: NetworkTransformBase: NetworkTime.localTime for 2019 support * fix: Grid2D new hashSet constructor without capacity for 2019 support * 2019 * this
This commit is contained in:
parent
e7110d3015
commit
c179d233a1
@ -49,7 +49,12 @@ public void Add(Vector2Int position, T value)
|
|||||||
// each grid entry may hold hundreds of entities.
|
// each grid entry may hold hundreds of entities.
|
||||||
// let's create the HashSet with a large initial capacity
|
// let's create the HashSet with a large initial capacity
|
||||||
// in order to avoid resizing & allocations.
|
// in order to avoid resizing & allocations.
|
||||||
|
#if !UNITY_2021_3_OR_NEWER
|
||||||
|
// Unity 2019 doesn't have "new HashSet(capacity)" yet
|
||||||
|
hashSet = new HashSet<T>();
|
||||||
|
#else
|
||||||
hashSet = new HashSet<T>(128);
|
hashSet = new HashSet<T>(128);
|
||||||
|
#endif
|
||||||
grid[position] = hashSet;
|
grid[position] = hashSet;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -113,7 +113,11 @@ protected virtual TransformSnapshot ConstructSnapshot()
|
|||||||
// NetworkTime.localTime for double precision until Unity has it too
|
// NetworkTime.localTime for double precision until Unity has it too
|
||||||
return new TransformSnapshot(
|
return new TransformSnapshot(
|
||||||
// our local time is what the other end uses as remote time
|
// our local time is what the other end uses as remote time
|
||||||
|
#if !UNITY_2020_3_OR_NEWER
|
||||||
|
NetworkTime.localTime, // Unity 2019 doesn't have timeAsDouble yet
|
||||||
|
#else
|
||||||
Time.timeAsDouble,
|
Time.timeAsDouble,
|
||||||
|
#endif
|
||||||
// the other end fills out local time itself
|
// the other end fills out local time itself
|
||||||
0,
|
0,
|
||||||
targetComponent.localPosition,
|
targetComponent.localPosition,
|
||||||
@ -304,7 +308,11 @@ protected virtual void OnServerToClientSync(Vector3? position, Quaternion? rotat
|
|||||||
// insert snapshot
|
// insert snapshot
|
||||||
SnapshotInterpolation.InsertIfNotExists(clientSnapshots, new TransformSnapshot(
|
SnapshotInterpolation.InsertIfNotExists(clientSnapshots, new TransformSnapshot(
|
||||||
timestamp, // arrival remote timestamp. NOT remote time.
|
timestamp, // arrival remote timestamp. NOT remote time.
|
||||||
Time.timeAsDouble, // local time of this client
|
#if !UNITY_2020_3_OR_NEWER
|
||||||
|
NetworkTime.localTime, // Unity 2019 doesn't have timeAsDouble yet
|
||||||
|
#else
|
||||||
|
Time.timeAsDouble,
|
||||||
|
#endif
|
||||||
position.Value,
|
position.Value,
|
||||||
rotation.Value,
|
rotation.Value,
|
||||||
scale.Value
|
scale.Value
|
||||||
|
@ -126,7 +126,13 @@ static void OnTimeSnapshotMessage(TimeSnapshotMessage _)
|
|||||||
// insert another snapshot for snapshot interpolation.
|
// insert another snapshot for snapshot interpolation.
|
||||||
// before calling OnDeserialize so components can use
|
// before calling OnDeserialize so components can use
|
||||||
// NetworkTime.time and NetworkTime.timeStamp.
|
// NetworkTime.time and NetworkTime.timeStamp.
|
||||||
|
|
||||||
|
#if !UNITY_2020_3_OR_NEWER
|
||||||
|
// Unity 2019 doesn't have Time.timeAsDouble yet
|
||||||
|
OnTimeSnapshot(new TimeSnapshot(connection.remoteTimeStamp, NetworkTime.localTime));
|
||||||
|
#else
|
||||||
OnTimeSnapshot(new TimeSnapshot(connection.remoteTimeStamp, Time.timeAsDouble));
|
OnTimeSnapshot(new TimeSnapshot(connection.remoteTimeStamp, Time.timeAsDouble));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// see comments at the top of this file
|
// see comments at the top of this file
|
||||||
|
@ -53,6 +53,14 @@ public NetworkReader(ArraySegment<byte> segment)
|
|||||||
buffer = segment;
|
buffer = segment;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if !UNITY_2021_3_OR_NEWER
|
||||||
|
// Unity 2019 doesn't have the implicit byte[] to segment conversion yet
|
||||||
|
public NetworkReader(byte[] bytes)
|
||||||
|
{
|
||||||
|
buffer = new ArraySegment<byte>(bytes, 0, bytes.Length);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// sometimes it's useful to point a reader on another buffer instead of
|
// sometimes it's useful to point a reader on another buffer instead of
|
||||||
// allocating a new reader (e.g. NetworkReaderPool)
|
// allocating a new reader (e.g. NetworkReaderPool)
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||||
@ -62,6 +70,15 @@ public void SetBuffer(ArraySegment<byte> segment)
|
|||||||
Position = 0;
|
Position = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if !UNITY_2021_3_OR_NEWER
|
||||||
|
// Unity 2019 doesn't have the implicit byte[] to segment conversion yet
|
||||||
|
public void SetBuffer(byte[] bytes)
|
||||||
|
{
|
||||||
|
buffer = new ArraySegment<byte>(bytes, 0, bytes.Length);
|
||||||
|
Position = 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// ReadBlittable<T> from DOTSNET
|
// ReadBlittable<T> from DOTSNET
|
||||||
// this is extremely fast, but only works for blittable types.
|
// this is extremely fast, but only works for blittable types.
|
||||||
// => private to make sure nobody accidentally uses it for non-blittable
|
// => private to make sure nobody accidentally uses it for non-blittable
|
||||||
|
@ -145,6 +145,10 @@ public static ArraySegment<byte> ReadBytesAndSizeSegment(this NetworkReader read
|
|||||||
|
|
||||||
public static Guid ReadGuid(this NetworkReader reader)
|
public static Guid ReadGuid(this NetworkReader reader)
|
||||||
{
|
{
|
||||||
|
#if !UNITY_2021_3_OR_NEWER
|
||||||
|
// Unity 2019 doesn't have Span yet
|
||||||
|
return new Guid(reader.ReadBytes(16));
|
||||||
|
#else
|
||||||
// ReadBlittable(Guid) isn't safe. see ReadBlittable comments.
|
// ReadBlittable(Guid) isn't safe. see ReadBlittable comments.
|
||||||
// Guid is Sequential, but we can't guarantee packing.
|
// Guid is Sequential, but we can't guarantee packing.
|
||||||
if (reader.Remaining >= 16)
|
if (reader.Remaining >= 16)
|
||||||
@ -154,6 +158,7 @@ public static Guid ReadGuid(this NetworkReader reader)
|
|||||||
return new Guid(span);
|
return new Guid(span);
|
||||||
}
|
}
|
||||||
throw new EndOfStreamException($"ReadGuid out of range: {reader}");
|
throw new EndOfStreamException($"ReadGuid out of range: {reader}");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
public static Guid? ReadGuidNullable(this NetworkReader reader) => reader.ReadBool() ? ReadGuid(reader) : default(Guid?);
|
public static Guid? ReadGuidNullable(this NetworkReader reader) => reader.ReadBool() ? ReadGuid(reader) : default(Guid?);
|
||||||
|
|
||||||
|
@ -1746,7 +1746,12 @@ internal static void NetworkLateUpdate()
|
|||||||
//
|
//
|
||||||
// during tests, we always call Broadcast() though.
|
// during tests, we always call Broadcast() though.
|
||||||
if (!Application.isPlaying ||
|
if (!Application.isPlaying ||
|
||||||
|
#if !UNITY_2020_3_OR_NEWER
|
||||||
|
// Unity 2019 doesn't have Time.timeAsDouble yet
|
||||||
|
AccurateInterval.Elapsed(NetworkTime.localTime, sendInterval, ref lastSendTime))
|
||||||
|
#else
|
||||||
AccurateInterval.Elapsed(Time.timeAsDouble, sendInterval, ref lastSendTime))
|
AccurateInterval.Elapsed(Time.timeAsDouble, sendInterval, ref lastSendTime))
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
Broadcast();
|
Broadcast();
|
||||||
}
|
}
|
||||||
|
@ -175,12 +175,18 @@ public static void WriteArraySegment<T>(this NetworkWriter writer, ArraySegment<
|
|||||||
|
|
||||||
public static void WriteGuid(this NetworkWriter writer, Guid value)
|
public static void WriteGuid(this NetworkWriter writer, Guid value)
|
||||||
{
|
{
|
||||||
|
#if !UNITY_2021_3_OR_NEWER
|
||||||
|
// Unity 2019 doesn't have Span yet
|
||||||
|
byte[] data = value.ToByteArray();
|
||||||
|
writer.WriteBytes(data, 0, data.Length);
|
||||||
|
#else
|
||||||
// WriteBlittable(Guid) isn't safe. see WriteBlittable comments.
|
// WriteBlittable(Guid) isn't safe. see WriteBlittable comments.
|
||||||
// Guid is Sequential, but we can't guarantee packing.
|
// Guid is Sequential, but we can't guarantee packing.
|
||||||
// TryWriteBytes is safe and allocation free.
|
// TryWriteBytes is safe and allocation free.
|
||||||
writer.EnsureCapacity(writer.Position + 16);
|
writer.EnsureCapacity(writer.Position + 16);
|
||||||
value.TryWriteBytes(new Span<byte>(writer.buffer, writer.Position, 16));
|
value.TryWriteBytes(new Span<byte>(writer.buffer, writer.Position, 16));
|
||||||
writer.Position += 16;
|
writer.Position += 16;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
public static void WriteGuidNullable(this NetworkWriter writer, Guid? value)
|
public static void WriteGuidNullable(this NetworkWriter writer, Guid? value)
|
||||||
{
|
{
|
||||||
|
@ -31,6 +31,7 @@ Transform:
|
|||||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||||
m_LocalPosition: {x: 0, y: 1, z: 0}
|
m_LocalPosition: {x: 0, y: 1, z: 0}
|
||||||
m_LocalScale: {x: 2, y: 2, z: 2}
|
m_LocalScale: {x: 2, y: 2, z: 2}
|
||||||
|
m_ConstrainProportionsScale: 0
|
||||||
m_Children:
|
m_Children:
|
||||||
- {fileID: 1355348187805494562}
|
- {fileID: 1355348187805494562}
|
||||||
m_Father: {fileID: 0}
|
m_Father: {fileID: 0}
|
||||||
@ -55,6 +56,7 @@ MeshRenderer:
|
|||||||
m_CastShadows: 0
|
m_CastShadows: 0
|
||||||
m_ReceiveShadows: 1
|
m_ReceiveShadows: 1
|
||||||
m_DynamicOccludee: 1
|
m_DynamicOccludee: 1
|
||||||
|
m_StaticShadowCaster: 0
|
||||||
m_MotionVectors: 1
|
m_MotionVectors: 1
|
||||||
m_LightProbeUsage: 1
|
m_LightProbeUsage: 1
|
||||||
m_ReflectionProbeUsage: 1
|
m_ReflectionProbeUsage: 1
|
||||||
@ -112,9 +114,9 @@ MonoBehaviour:
|
|||||||
m_Name:
|
m_Name:
|
||||||
m_EditorClassIdentifier:
|
m_EditorClassIdentifier:
|
||||||
sceneId: 0
|
sceneId: 0
|
||||||
|
_assetId: 1770499856
|
||||||
serverOnly: 0
|
serverOnly: 0
|
||||||
visible: 0
|
visible: 0
|
||||||
m_AssetId: c624c75494b4d7d4086b9212f897e56a
|
|
||||||
hasSpawned: 0
|
hasSpawned: 0
|
||||||
--- !u!114 &5948271423698091598
|
--- !u!114 &5948271423698091598
|
||||||
MonoBehaviour:
|
MonoBehaviour:
|
||||||
@ -132,7 +134,7 @@ MonoBehaviour:
|
|||||||
syncInterval: 0.1
|
syncInterval: 0.1
|
||||||
destinationScene:
|
destinationScene:
|
||||||
startPosition: {x: 0, y: 0, z: 0}
|
startPosition: {x: 0, y: 0, z: 0}
|
||||||
label: {fileID: 5446595135713311426}
|
label: {fileID: 8197110483235692531}
|
||||||
labelText:
|
labelText:
|
||||||
--- !u!1 &5961932215084527574
|
--- !u!1 &5961932215084527574
|
||||||
GameObject:
|
GameObject:
|
||||||
@ -144,8 +146,8 @@ GameObject:
|
|||||||
m_Component:
|
m_Component:
|
||||||
- component: {fileID: 1355348187805494562}
|
- component: {fileID: 1355348187805494562}
|
||||||
- component: {fileID: 5428053421152709616}
|
- component: {fileID: 5428053421152709616}
|
||||||
- component: {fileID: 5446595135713311426}
|
|
||||||
- component: {fileID: 3243959486819493908}
|
- component: {fileID: 3243959486819493908}
|
||||||
|
- component: {fileID: 8197110483235692531}
|
||||||
m_Layer: 9
|
m_Layer: 9
|
||||||
m_Name: Label_TMP
|
m_Name: Label_TMP
|
||||||
m_TagString: Untagged
|
m_TagString: Untagged
|
||||||
@ -163,6 +165,7 @@ RectTransform:
|
|||||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||||
|
m_ConstrainProportionsScale: 0
|
||||||
m_Children: []
|
m_Children: []
|
||||||
m_Father: {fileID: 1098173225717622921}
|
m_Father: {fileID: 1098173225717622921}
|
||||||
m_RootOrder: 0
|
m_RootOrder: 0
|
||||||
@ -183,6 +186,7 @@ MeshRenderer:
|
|||||||
m_CastShadows: 0
|
m_CastShadows: 0
|
||||||
m_ReceiveShadows: 0
|
m_ReceiveShadows: 0
|
||||||
m_DynamicOccludee: 1
|
m_DynamicOccludee: 1
|
||||||
|
m_StaticShadowCaster: 0
|
||||||
m_MotionVectors: 1
|
m_MotionVectors: 1
|
||||||
m_LightProbeUsage: 1
|
m_LightProbeUsage: 1
|
||||||
m_ReflectionProbeUsage: 1
|
m_ReflectionProbeUsage: 1
|
||||||
@ -191,7 +195,7 @@ MeshRenderer:
|
|||||||
m_RenderingLayerMask: 1
|
m_RenderingLayerMask: 1
|
||||||
m_RendererPriority: 0
|
m_RendererPriority: 0
|
||||||
m_Materials:
|
m_Materials:
|
||||||
- {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
|
- {fileID: 10100, guid: 0000000000000000e000000000000000, type: 0}
|
||||||
m_StaticBatchInfo:
|
m_StaticBatchInfo:
|
||||||
firstSubMesh: 0
|
firstSubMesh: 0
|
||||||
subMeshCount: 0
|
subMeshCount: 0
|
||||||
@ -213,98 +217,6 @@ MeshRenderer:
|
|||||||
m_SortingLayer: 0
|
m_SortingLayer: 0
|
||||||
m_SortingOrder: 0
|
m_SortingOrder: 0
|
||||||
m_AdditionalVertexStreams: {fileID: 0}
|
m_AdditionalVertexStreams: {fileID: 0}
|
||||||
--- !u!114 &5446595135713311426
|
|
||||||
MonoBehaviour:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 5961932215084527574}
|
|
||||||
m_Enabled: 1
|
|
||||||
m_EditorHideFlags: 0
|
|
||||||
m_Script: {fileID: 11500000, guid: 9541d86e2fd84c1d9990edf0852d74ab, type: 3}
|
|
||||||
m_Name:
|
|
||||||
m_EditorClassIdentifier:
|
|
||||||
m_Material: {fileID: 0}
|
|
||||||
m_Color: {r: 1, g: 1, b: 1, a: 1}
|
|
||||||
m_RaycastTarget: 1
|
|
||||||
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
|
|
||||||
m_Maskable: 1
|
|
||||||
m_OnCullStateChanged:
|
|
||||||
m_PersistentCalls:
|
|
||||||
m_Calls: []
|
|
||||||
m_text: Sub Level 2
|
|
||||||
m_isRightToLeft: 0
|
|
||||||
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
|
|
||||||
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
|
|
||||||
m_fontSharedMaterials: []
|
|
||||||
m_fontMaterial: {fileID: 0}
|
|
||||||
m_fontMaterials: []
|
|
||||||
m_fontColor32:
|
|
||||||
serializedVersion: 2
|
|
||||||
rgba: 4288619804
|
|
||||||
m_fontColor: {r: 0.108668566, g: 0.14359462, b: 0.6226415, a: 1}
|
|
||||||
m_enableVertexGradient: 0
|
|
||||||
m_colorMode: 3
|
|
||||||
m_fontColorGradient:
|
|
||||||
topLeft: {r: 1, g: 1, b: 1, a: 1}
|
|
||||||
topRight: {r: 1, g: 1, b: 1, a: 1}
|
|
||||||
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
|
|
||||||
bottomRight: {r: 1, g: 1, b: 1, a: 1}
|
|
||||||
m_fontColorGradientPreset: {fileID: 0}
|
|
||||||
m_spriteAsset: {fileID: 0}
|
|
||||||
m_tintAllSprites: 0
|
|
||||||
m_StyleSheet: {fileID: 0}
|
|
||||||
m_TextStyleHashCode: -1183493901
|
|
||||||
m_overrideHtmlColors: 0
|
|
||||||
m_faceColor:
|
|
||||||
serializedVersion: 2
|
|
||||||
rgba: 4294967295
|
|
||||||
m_fontSize: 4
|
|
||||||
m_fontSizeBase: 4
|
|
||||||
m_fontWeight: 400
|
|
||||||
m_enableAutoSizing: 0
|
|
||||||
m_fontSizeMin: 18
|
|
||||||
m_fontSizeMax: 72
|
|
||||||
m_fontStyle: 5
|
|
||||||
m_HorizontalAlignment: 2
|
|
||||||
m_VerticalAlignment: 512
|
|
||||||
m_textAlignment: 65535
|
|
||||||
m_characterSpacing: 0
|
|
||||||
m_wordSpacing: 0
|
|
||||||
m_lineSpacing: 0
|
|
||||||
m_lineSpacingMax: 0
|
|
||||||
m_paragraphSpacing: 0
|
|
||||||
m_charWidthMaxAdj: 0
|
|
||||||
m_enableWordWrapping: 1
|
|
||||||
m_wordWrappingRatios: 0.4
|
|
||||||
m_overflowMode: 0
|
|
||||||
m_linkedTextComponent: {fileID: 0}
|
|
||||||
parentLinkedComponent: {fileID: 0}
|
|
||||||
m_enableKerning: 1
|
|
||||||
m_enableExtraPadding: 1
|
|
||||||
checkPaddingRequired: 0
|
|
||||||
m_isRichText: 1
|
|
||||||
m_parseCtrlCharacters: 1
|
|
||||||
m_isOrthographic: 0
|
|
||||||
m_isCullingEnabled: 0
|
|
||||||
m_horizontalMapping: 0
|
|
||||||
m_verticalMapping: 0
|
|
||||||
m_uvLineOffset: 0
|
|
||||||
m_geometrySortingOrder: 0
|
|
||||||
m_IsTextObjectScaleStatic: 0
|
|
||||||
m_VertexBufferAutoSizeReduction: 0
|
|
||||||
m_useMaxVisibleDescender: 1
|
|
||||||
m_pageToDisplay: 1
|
|
||||||
m_margin: {x: 0, y: 0, z: 0, w: 0}
|
|
||||||
m_isUsingLegacyAnimationComponent: 0
|
|
||||||
m_isVolumetricText: 0
|
|
||||||
m_hasFontAssetChanged: 0
|
|
||||||
m_renderer: {fileID: 5428053421152709616}
|
|
||||||
m_maskType: 0
|
|
||||||
_SortingLayer: 0
|
|
||||||
_SortingLayerID: 0
|
|
||||||
_SortingOrder: 0
|
|
||||||
--- !u!114 &3243959486819493908
|
--- !u!114 &3243959486819493908
|
||||||
MonoBehaviour:
|
MonoBehaviour:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
@ -317,3 +229,25 @@ MonoBehaviour:
|
|||||||
m_Script: {fileID: 11500000, guid: cc58300ee45438a418d9e32957fdc0c0, type: 3}
|
m_Script: {fileID: 11500000, guid: cc58300ee45438a418d9e32957fdc0c0, type: 3}
|
||||||
m_Name:
|
m_Name:
|
||||||
m_EditorClassIdentifier:
|
m_EditorClassIdentifier:
|
||||||
|
--- !u!102 &8197110483235692531
|
||||||
|
TextMesh:
|
||||||
|
serializedVersion: 3
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 5961932215084527574}
|
||||||
|
m_Text:
|
||||||
|
m_OffsetZ: 0
|
||||||
|
m_CharacterSize: 0.05
|
||||||
|
m_LineSpacing: 1
|
||||||
|
m_Anchor: 4
|
||||||
|
m_Alignment: 1
|
||||||
|
m_TabSize: 4
|
||||||
|
m_FontSize: 100
|
||||||
|
m_FontStyle: 0
|
||||||
|
m_RichText: 1
|
||||||
|
m_Font: {fileID: 0}
|
||||||
|
m_Color:
|
||||||
|
serializedVersion: 2
|
||||||
|
rgba: 4294967295
|
||||||
|
@ -15,7 +15,7 @@ public class Portal : NetworkBehaviour
|
|||||||
public Vector3 startPosition;
|
public Vector3 startPosition;
|
||||||
|
|
||||||
[Tooltip("Reference to child TMP label")]
|
[Tooltip("Reference to child TMP label")]
|
||||||
public TMPro.TextMeshPro label;
|
public TextMesh label; // don't depend on TMPro. 2019 errors.
|
||||||
|
|
||||||
[SyncVar(hook = nameof(OnLabelTextChanged))]
|
[SyncVar(hook = nameof(OnLabelTextChanged))]
|
||||||
public string labelText;
|
public string labelText;
|
||||||
|
@ -109,7 +109,11 @@ void Awake()
|
|||||||
public void OnMessage(Snapshot3D snap)
|
public void OnMessage(Snapshot3D snap)
|
||||||
{
|
{
|
||||||
// set local timestamp (= when it was received on our end)
|
// set local timestamp (= when it was received on our end)
|
||||||
|
#if !UNITY_2020_3_OR_NEWER
|
||||||
|
snap.localTime = NetworkTime.localTime;
|
||||||
|
#else
|
||||||
snap.localTime = Time.timeAsDouble;
|
snap.localTime = Time.timeAsDouble;
|
||||||
|
#endif
|
||||||
|
|
||||||
// (optional) dynamic adjustment
|
// (optional) dynamic adjustment
|
||||||
if (dynamicAdjustment)
|
if (dynamicAdjustment)
|
||||||
|
@ -68,7 +68,11 @@ void Update()
|
|||||||
void Send(Vector3 position)
|
void Send(Vector3 position)
|
||||||
{
|
{
|
||||||
// create snapshot
|
// create snapshot
|
||||||
|
#if !UNITY_2020_3_OR_NEWER
|
||||||
|
Snapshot3D snap = new Snapshot3D(NetworkTime.localTime, 0, position);
|
||||||
|
#else
|
||||||
Snapshot3D snap = new Snapshot3D(Time.timeAsDouble, 0, position);
|
Snapshot3D snap = new Snapshot3D(Time.timeAsDouble, 0, position);
|
||||||
|
#endif
|
||||||
|
|
||||||
// simulate packet loss
|
// simulate packet loss
|
||||||
bool drop = random.NextDouble() < loss;
|
bool drop = random.NextDouble() < loss;
|
||||||
@ -81,7 +85,11 @@ void Send(Vector3 position)
|
|||||||
|
|
||||||
// simulate latency
|
// simulate latency
|
||||||
float simulatedLatency = SimulateLatency();
|
float simulatedLatency = SimulateLatency();
|
||||||
|
#if !UNITY_2020_3_OR_NEWER
|
||||||
|
double deliveryTime = NetworkTime.localTime + simulatedLatency;
|
||||||
|
#else
|
||||||
double deliveryTime = Time.timeAsDouble + simulatedLatency;
|
double deliveryTime = Time.timeAsDouble + simulatedLatency;
|
||||||
|
#endif
|
||||||
queue.Insert(index, (deliveryTime, snap));
|
queue.Insert(index, (deliveryTime, snap));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -92,7 +100,12 @@ void Flush()
|
|||||||
for (int i = 0; i < queue.Count; ++i)
|
for (int i = 0; i < queue.Count; ++i)
|
||||||
{
|
{
|
||||||
(double deliveryTime, Snapshot3D snap) = queue[i];
|
(double deliveryTime, Snapshot3D snap) = queue[i];
|
||||||
|
|
||||||
|
#if !UNITY_2020_3_OR_NEWER
|
||||||
|
if (NetworkTime.localTime >= deliveryTime)
|
||||||
|
#else
|
||||||
if (Time.timeAsDouble >= deliveryTime)
|
if (Time.timeAsDouble >= deliveryTime)
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
client.OnMessage(snap);
|
client.OnMessage(snap);
|
||||||
queue.RemoveAt(i);
|
queue.RemoveAt(i);
|
||||||
|
@ -236,11 +236,11 @@ public void SpawnDelegate_AddsHandlerToSpawnHandlersWithCorrectArguments(Registe
|
|||||||
Vector3 somePosition = new Vector3(10, 20, 3);
|
Vector3 somePosition = new Vector3(10, 20, 3);
|
||||||
|
|
||||||
uint assetId = AssetIdForOverload(overload);
|
uint assetId = AssetIdForOverload(overload);
|
||||||
SpawnDelegate handler = new SpawnDelegate((pos, assetId) =>
|
SpawnDelegate handler = new SpawnDelegate((pos, id) =>
|
||||||
{
|
{
|
||||||
handlerCalled++;
|
handlerCalled++;
|
||||||
Assert.That(pos, Is.EqualTo(somePosition));
|
Assert.That(pos, Is.EqualTo(somePosition));
|
||||||
Assert.That(assetId, Is.EqualTo(assetId));
|
Assert.That(id, Is.EqualTo(assetId));
|
||||||
return null;
|
return null;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -36,11 +36,11 @@ public void SpawnDelegate_AddsHandlerToSpawnHandlersWithCorrectArguments()
|
|||||||
Vector3 somePosition = new Vector3(10, 20, 3);
|
Vector3 somePosition = new Vector3(10, 20, 3);
|
||||||
|
|
||||||
uint assetId = 42;
|
uint assetId = 42;
|
||||||
SpawnDelegate spawnHandler = new SpawnDelegate((pos, assetId) =>
|
SpawnDelegate spawnHandler = new SpawnDelegate((pos, id) =>
|
||||||
{
|
{
|
||||||
handlerCalled++;
|
handlerCalled++;
|
||||||
Assert.That(pos, Is.EqualTo(somePosition));
|
Assert.That(pos, Is.EqualTo(somePosition));
|
||||||
Assert.That(assetId, Is.EqualTo(assetId));
|
Assert.That(id, Is.EqualTo(assetId));
|
||||||
return null;
|
return null;
|
||||||
});
|
});
|
||||||
UnSpawnDelegate unspawnHandler = new UnSpawnDelegate(x => {});
|
UnSpawnDelegate unspawnHandler = new UnSpawnDelegate(x => {});
|
||||||
|
@ -83,7 +83,11 @@ float SimulateLatency(int channeldId)
|
|||||||
// no spikes isn't realistic.
|
// no spikes isn't realistic.
|
||||||
// sin is too predictable / no realistic.
|
// sin is too predictable / no realistic.
|
||||||
// perlin is still deterministic and random enough.
|
// perlin is still deterministic and random enough.
|
||||||
|
#if !UNITY_2020_3_OR_NEWER
|
||||||
|
float spike = Noise((float)NetworkTime.localTime * jitterSpeed) * jitter;
|
||||||
|
#else
|
||||||
float spike = Noise((float)Time.unscaledTimeAsDouble * jitterSpeed) * jitter;
|
float spike = Noise((float)Time.unscaledTimeAsDouble * jitterSpeed) * jitter;
|
||||||
|
#endif
|
||||||
|
|
||||||
// base latency
|
// base latency
|
||||||
switch (channeldId)
|
switch (channeldId)
|
||||||
@ -116,7 +120,11 @@ void SimulateSend(
|
|||||||
{
|
{
|
||||||
connectionId = connectionId,
|
connectionId = connectionId,
|
||||||
bytes = bytes,
|
bytes = bytes,
|
||||||
|
#if !UNITY_2020_3_OR_NEWER
|
||||||
|
time = NetworkTime.localTime + latency
|
||||||
|
#else
|
||||||
time = Time.unscaledTimeAsDouble + latency
|
time = Time.unscaledTimeAsDouble + latency
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
switch (channelId)
|
switch (channelId)
|
||||||
@ -220,7 +228,11 @@ public override void ClientLateUpdate()
|
|||||||
{
|
{
|
||||||
// message ready to be sent?
|
// message ready to be sent?
|
||||||
QueuedMessage message = reliableClientToServer[i];
|
QueuedMessage message = reliableClientToServer[i];
|
||||||
|
#if !UNITY_2020_3_OR_NEWER
|
||||||
|
if (message.time <= NetworkTime.localTime)
|
||||||
|
#else
|
||||||
if (message.time <= Time.unscaledTimeAsDouble)
|
if (message.time <= Time.unscaledTimeAsDouble)
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
// send and eat
|
// send and eat
|
||||||
wrap.ClientSend(new ArraySegment<byte>(message.bytes), Channels.Reliable);
|
wrap.ClientSend(new ArraySegment<byte>(message.bytes), Channels.Reliable);
|
||||||
@ -235,7 +247,11 @@ public override void ClientLateUpdate()
|
|||||||
{
|
{
|
||||||
// message ready to be sent?
|
// message ready to be sent?
|
||||||
QueuedMessage message = unreliableClientToServer[i];
|
QueuedMessage message = unreliableClientToServer[i];
|
||||||
|
#if !UNITY_2020_3_OR_NEWER
|
||||||
|
if (message.time <= NetworkTime.localTime)
|
||||||
|
#else
|
||||||
if (message.time <= Time.unscaledTimeAsDouble)
|
if (message.time <= Time.unscaledTimeAsDouble)
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
// send and eat
|
// send and eat
|
||||||
wrap.ClientSend(new ArraySegment<byte>(message.bytes), Channels.Reliable);
|
wrap.ClientSend(new ArraySegment<byte>(message.bytes), Channels.Reliable);
|
||||||
@ -256,7 +272,11 @@ public override void ServerLateUpdate()
|
|||||||
{
|
{
|
||||||
// message ready to be sent?
|
// message ready to be sent?
|
||||||
QueuedMessage message = reliableServerToClient[i];
|
QueuedMessage message = reliableServerToClient[i];
|
||||||
|
#if !UNITY_2020_3_OR_NEWER
|
||||||
|
if (message.time <= NetworkTime.localTime)
|
||||||
|
#else
|
||||||
if (message.time <= Time.unscaledTimeAsDouble)
|
if (message.time <= Time.unscaledTimeAsDouble)
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
// send and eat
|
// send and eat
|
||||||
wrap.ServerSend(message.connectionId, new ArraySegment<byte>(message.bytes), Channels.Reliable);
|
wrap.ServerSend(message.connectionId, new ArraySegment<byte>(message.bytes), Channels.Reliable);
|
||||||
@ -272,7 +292,11 @@ public override void ServerLateUpdate()
|
|||||||
{
|
{
|
||||||
// message ready to be sent?
|
// message ready to be sent?
|
||||||
QueuedMessage message = unreliableServerToClient[i];
|
QueuedMessage message = unreliableServerToClient[i];
|
||||||
|
#if !UNITY_2020_3_OR_NEWER
|
||||||
|
if (message.time <= NetworkTime.localTime)
|
||||||
|
#else
|
||||||
if (message.time <= Time.unscaledTimeAsDouble)
|
if (message.time <= Time.unscaledTimeAsDouble)
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
// send and eat
|
// send and eat
|
||||||
wrap.ServerSend(message.connectionId, new ArraySegment<byte>(message.bytes), Channels.Reliable);
|
wrap.ServerSend(message.connectionId, new ArraySegment<byte>(message.bytes), Channels.Reliable);
|
||||||
|
@ -4,6 +4,20 @@
|
|||||||
|
|
||||||
namespace Mirror.SimpleWeb
|
namespace Mirror.SimpleWeb
|
||||||
{
|
{
|
||||||
|
#if !UNITY_2021_3_OR_NEWER
|
||||||
|
// Unity 2019 doesn't have ArraySegment.ToArray() yet.
|
||||||
|
public static class Extensions
|
||||||
|
{
|
||||||
|
public static byte[] ToArray(this ArraySegment<byte> segment)
|
||||||
|
{
|
||||||
|
byte[] array = new byte[segment.Count];
|
||||||
|
Array.Copy(segment.Array, segment.Offset, array, 0, segment.Count);
|
||||||
|
return array;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
public class WebSocketClientWebGl : SimpleWebClient
|
public class WebSocketClientWebGl : SimpleWebClient
|
||||||
{
|
{
|
||||||
static readonly Dictionary<int, WebSocketClientWebGl> instances = new Dictionary<int, WebSocketClientWebGl>();
|
static readonly Dictionary<int, WebSocketClientWebGl> instances = new Dictionary<int, WebSocketClientWebGl>();
|
||||||
|
@ -7,7 +7,6 @@
|
|||||||
"com.unity.ide.vscode": "1.2.5",
|
"com.unity.ide.vscode": "1.2.5",
|
||||||
"com.unity.test-framework": "1.1.31",
|
"com.unity.test-framework": "1.1.31",
|
||||||
"com.unity.testtools.codecoverage": "1.0.1",
|
"com.unity.testtools.codecoverage": "1.0.1",
|
||||||
"com.unity.textmeshpro": "3.0.6",
|
|
||||||
"com.unity.ugui": "1.0.0",
|
"com.unity.ugui": "1.0.0",
|
||||||
"com.unity.xr.legacyinputhelpers": "2.1.10",
|
"com.unity.xr.legacyinputhelpers": "2.1.10",
|
||||||
"com.unity.modules.ai": "1.0.0",
|
"com.unity.modules.ai": "1.0.0",
|
||||||
|
@ -72,15 +72,6 @@
|
|||||||
},
|
},
|
||||||
"url": "https://packages.unity.com"
|
"url": "https://packages.unity.com"
|
||||||
},
|
},
|
||||||
"com.unity.textmeshpro": {
|
|
||||||
"version": "3.0.6",
|
|
||||||
"depth": 0,
|
|
||||||
"source": "registry",
|
|
||||||
"dependencies": {
|
|
||||||
"com.unity.ugui": "1.0.0"
|
|
||||||
},
|
|
||||||
"url": "https://packages.unity.com"
|
|
||||||
},
|
|
||||||
"com.unity.ugui": {
|
"com.unity.ugui": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"depth": 0,
|
"depth": 0,
|
||||||
|
Loading…
Reference in New Issue
Block a user