Skip to content

Commit 9e3b301

Browse files
committed
Use NetworkSceneHandle wrapper class
1 parent b77055d commit 9e3b301

File tree

18 files changed

+267
-198
lines changed

18 files changed

+267
-198
lines changed

com.unity.netcode.gameobjects/Editor/CodeGen/CodeGenHelpers.cs

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,6 @@
1010
using Unity.CompilationPipeline.Common.Diagnostics;
1111
using Unity.CompilationPipeline.Common.ILPostProcessing;
1212
using UnityEngine;
13-
#if SCENE_MANAGEMENT_SCENE_HANDLE_AVAILABLE
14-
using UnityEngine.SceneManagement;
15-
#endif
1613
using Object = System.Object;
1714

1815
namespace Unity.Netcode.Editor.CodeGen
@@ -50,7 +47,6 @@ internal static class CodeGenHelpers
5047
public static readonly string UnityPose_FullName = typeof(Pose).FullName;
5148
public static readonly string UnityRay_FullName = typeof(Ray).FullName;
5249
public static readonly string UnityRay2D_FullName = typeof(Ray2D).FullName;
53-
public static readonly string UnitySceneHandle_FullName = typeof(SceneHandle).FullName;
5450

5551
public static uint Hash(this MethodDefinition methodDefinition)
5652
{
@@ -328,11 +324,6 @@ public static bool IsSerializable(this TypeReference typeReference)
328324
return true;
329325
}
330326

331-
if (typeReference.FullName == UnitySceneHandle_FullName)
332-
{
333-
return true;
334-
}
335-
336327
// Enum
337328
if (typeReference.GetEnumAsInt() != null)
338329
{

com.unity.netcode.gameobjects/Editor/CodeGen/NetworkBehaviourILPP.cs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,6 @@
1212
using UnityEditor;
1313
#endif
1414
using UnityEngine;
15-
#if SCENE_MANAGEMENT_SCENE_HANDLE_AVAILABLE
16-
using UnityEngine.SceneManagement;
17-
#endif
1815
using ILPPInterface = Unity.CompilationPipeline.Common.ILPostProcessing.ILPostProcessor;
1916
using MethodAttributes = Mono.Cecil.MethodAttributes;
2017
using ParameterAttributes = Mono.Cecil.ParameterAttributes;
@@ -571,7 +568,6 @@ private void CreateNetworkVariableTypeInitializers(AssemblyDefinition assembly,
571568
typeof(Color32),
572569
typeof(Ray),
573570
typeof(Ray2D),
574-
typeof(SceneHandle)
575571
};
576572
internal static readonly Type[] SpecialCaseTypes = new[]
577573
{

com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1367,12 +1367,12 @@ public bool IsNetworkVisibleTo(ulong clientId)
13671367
/// the most important part to uniquely identify in-scene
13681368
/// placed NetworkObjects
13691369
/// </summary>
1370-
internal SceneHandle SceneOriginHandle;
1370+
internal NetworkSceneHandle SceneOriginHandle;
13711371

13721372
/// <summary>
13731373
/// The server-side scene origin handle
13741374
/// </summary>
1375-
internal SceneHandle NetworkSceneHandle;
1375+
internal NetworkSceneHandle NetworkSceneHandle;
13761376

13771377
private Scene m_SceneOrigin;
13781378
/// <summary>
@@ -1393,7 +1393,7 @@ internal Scene SceneOrigin
13931393
{
13941394
// The scene origin should only be set once.
13951395
// Once set, it should never change.
1396-
if (SceneOriginHandle == SceneHandle.None && value.IsValid() && value.isLoaded)
1396+
if (SceneOriginHandle.IsEmpty() && value.IsValid() && value.isLoaded)
13971397
{
13981398
m_SceneOrigin = value;
13991399
SceneOriginHandle = value.handle;
@@ -1405,13 +1405,13 @@ internal Scene SceneOrigin
14051405
/// Helper method to return the correct scene handle
14061406
/// Note: Do not use this within NetworkSpawnManager.SpawnNetworkObjectLocallyCommon
14071407
/// </summary>
1408-
internal SceneHandle GetSceneOriginHandle()
1408+
internal NetworkSceneHandle GetSceneOriginHandle()
14091409
{
1410-
if (SceneOriginHandle == SceneHandle.None && IsSpawned && IsSceneObject != false)
1410+
if (SceneOriginHandle.IsEmpty() && IsSpawned && IsSceneObject != false)
14111411
{
14121412
throw new Exception($"{nameof(GetSceneOriginHandle)} called when {nameof(SceneOriginHandle)} is still zero but the {nameof(NetworkObject)} is already spawned!");
14131413
}
1414-
return SceneOriginHandle != SceneHandle.None ? SceneOriginHandle : gameObject.scene.handle;
1414+
return !SceneOriginHandle.IsEmpty() ? SceneOriginHandle : gameObject.scene.handle;
14151415
}
14161416

14171417
/// <summary>
@@ -2907,7 +2907,7 @@ public struct TransformData : INetworkSerializeByMemcpy
29072907
public NetworkObject OwnerObject;
29082908
public ulong TargetClientId;
29092909

2910-
public SceneHandle NetworkSceneHandle;
2910+
public NetworkSceneHandle NetworkSceneHandle;
29112911

29122912
internal int SynchronizationDataSize;
29132913

com.unity.netcode.gameobjects/Runtime/SceneManagement/DefaultSceneManagerHandler.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ internal struct SceneEntry
2020
}
2121
public bool IsIntegrationTest() { return false; }
2222

23-
internal Dictionary<string, Dictionary<SceneHandle, SceneEntry>> SceneNameToSceneHandles = new();
23+
internal Dictionary<string, Dictionary<NetworkSceneHandle, SceneEntry>> SceneNameToSceneHandles = new();
2424

2525
public AsyncOperation LoadSceneAsync(string sceneName, LoadSceneMode loadSceneMode, SceneEventProgress sceneEventProgress)
2626
{
@@ -47,7 +47,7 @@ public void ClearSceneTracking(NetworkManager networkManager)
4747
/// <summary>
4848
/// Stops tracking a specific scene
4949
/// </summary>
50-
public void StopTrackingScene(SceneHandle handle, string name, NetworkManager networkManager)
50+
public void StopTrackingScene(NetworkSceneHandle handle, string name, NetworkManager networkManager)
5151
{
5252
if (SceneNameToSceneHandles.ContainsKey(name))
5353
{
@@ -69,7 +69,7 @@ public void StartTrackingScene(Scene scene, bool assigned, NetworkManager networ
6969
{
7070
if (!SceneNameToSceneHandles.ContainsKey(scene.name))
7171
{
72-
SceneNameToSceneHandles.Add(scene.name, new Dictionary<SceneHandle, SceneEntry>());
72+
SceneNameToSceneHandles.Add(scene.name, new Dictionary<NetworkSceneHandle, SceneEntry>());
7373
}
7474

7575
if (!SceneNameToSceneHandles[scene.name].ContainsKey(scene.handle))
@@ -168,7 +168,7 @@ public Scene GetSceneFromLoadedScenes(string sceneName, NetworkManager networkMa
168168
/// same application instance is still running, the same scenes are still loaded on the client, and
169169
/// upon reconnecting the client doesn't have to unload the scenes and then reload them)
170170
/// </summary>
171-
public void PopulateLoadedScenes(ref Dictionary<SceneHandle, Scene> scenesLoaded, NetworkManager networkManager)
171+
public void PopulateLoadedScenes(ref Dictionary<NetworkSceneHandle, Scene> scenesLoaded, NetworkManager networkManager)
172172
{
173173
SceneNameToSceneHandles.Clear();
174174
var sceneCount = SceneManager.sceneCount;
@@ -177,7 +177,7 @@ public void PopulateLoadedScenes(ref Dictionary<SceneHandle, Scene> scenesLoaded
177177
var scene = SceneManager.GetSceneAt(i);
178178
if (!SceneNameToSceneHandles.ContainsKey(scene.name))
179179
{
180-
SceneNameToSceneHandles.Add(scene.name, new Dictionary<SceneHandle, SceneEntry>());
180+
SceneNameToSceneHandles.Add(scene.name, new Dictionary<NetworkSceneHandle, SceneEntry>());
181181
}
182182

183183
if (!SceneNameToSceneHandles[scene.name].ContainsKey(scene.handle))

com.unity.netcode.gameobjects/Runtime/SceneManagement/ISceneManagerHandler.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,12 @@ internal interface ISceneManagerHandler
1414

1515
AsyncOperation UnloadSceneAsync(Scene scene, SceneEventProgress sceneEventProgress);
1616

17-
void PopulateLoadedScenes(ref Dictionary<SceneHandle, Scene> scenesLoaded, NetworkManager networkManager = null);
17+
void PopulateLoadedScenes(ref Dictionary<NetworkSceneHandle, Scene> scenesLoaded, NetworkManager networkManager = null);
1818
Scene GetSceneFromLoadedScenes(string sceneName, NetworkManager networkManager = null);
1919

2020
bool DoesSceneHaveUnassignedEntry(string sceneName, NetworkManager networkManager = null);
2121

22-
void StopTrackingScene(SceneHandle handle, string name, NetworkManager networkManager = null);
22+
void StopTrackingScene(NetworkSceneHandle handle, string name, NetworkManager networkManager = null);
2323

2424
void StartTrackingScene(Scene scene, bool assigned, NetworkManager networkManager = null);
2525

Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
using System;
2+
using System.Runtime.CompilerServices;
3+
#if SCENE_MANAGEMENT_SCENE_HANDLE_AVAILABLE
4+
using UnityEngine.SceneManagement;
5+
#endif
6+
7+
namespace Unity.Netcode
8+
{
9+
internal struct NetworkSceneHandle : IEquatable<NetworkSceneHandle>, INetworkSerializable
10+
{
11+
#if SCENE_MANAGEMENT_SCENE_HANDLE_AVAILABLE
12+
private SceneHandle m_Handle;
13+
#else
14+
private int m_Handle;
15+
#endif
16+
17+
/// <summary>
18+
/// Whether this <see cref="NetworkSceneHandle"/> represents an uninitialized scene handle
19+
/// </summary>
20+
/// <returns>True if this scene handle represents the <see langword="default"/>; otherwise false.</returns>
21+
public bool IsEmpty() => Equals(default(NetworkSceneHandle));
22+
23+
public void NetworkSerialize<T>(BufferSerializer<T> serializer) where T : IReaderWriter
24+
{
25+
if (serializer.IsWriter)
26+
{
27+
var writer = serializer.GetFastBufferWriter();
28+
writer.WriteValueSafe(GetRawData());
29+
}
30+
else
31+
{
32+
var reader = serializer.GetFastBufferReader();
33+
#if SCENE_MANAGEMENT_SCENE_HANDLE_MUST_USE_ULONG
34+
reader.ReadValue(out ulong rawData);
35+
m_Handle = SceneHandle.FromRawData(rawData);
36+
#else
37+
reader.ReadValueSafe(out int rawData);
38+
m_Handle = rawData;
39+
#endif
40+
}
41+
}
42+
43+
#if SCENE_MANAGEMENT_SCENE_HANDLE_AVAILABLE
44+
internal NetworkSceneHandle(SceneHandle handle)
45+
{
46+
m_Handle = handle;
47+
}
48+
#endif
49+
50+
#if SCENE_MANAGEMENT_SCENE_HANDLE_NO_INT_CONVERSION
51+
internal NetworkSceneHandle(ulong handle)
52+
{
53+
m_Handle = SceneHandle.FromRawData(handle);
54+
}
55+
#else
56+
internal NetworkSceneHandle(int handle)
57+
{
58+
m_Handle = handle;
59+
}
60+
#endif
61+
62+
#if SCENE_MANAGEMENT_SCENE_HANDLE_MUST_USE_ULONG
63+
public ulong GetRawData() => m_Handle.GetRawData();
64+
#elif SCENE_MANAGEMENT_SCENE_HANDLE_NO_INT_CONVERSION
65+
public int GetRawData() => (int)m_Handle.GetRawData();
66+
#else
67+
public int GetRawData() => m_Handle;
68+
#endif
69+
70+
#region Implicit conversions
71+
#if SCENE_MANAGEMENT_SCENE_HANDLE_AVAILABLE
72+
/// <summary>
73+
/// Implicit conversion from <see cref="SceneHandle"/> to <see cref="NetworkSceneHandle"/>.
74+
/// </summary>
75+
/// <param name="handle"></param>
76+
public static implicit operator NetworkSceneHandle(SceneHandle handle) => new(handle);
77+
#else
78+
/// <summary>
79+
/// Implicit conversion from <see langword="int"/> to <see cref="NetworkSceneHandle"/>.
80+
/// </summary>
81+
/// <param name="handle"></param>
82+
public static implicit operator NetworkSceneHandle(int handle) => new(handle);
83+
#endif
84+
#endregion
85+
86+
#region Operators
87+
88+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
89+
public bool Equals(NetworkSceneHandle other) => m_Handle == other.m_Handle;
90+
91+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
92+
public override bool Equals(object obj) => obj is NetworkSceneHandle other && Equals(other);
93+
94+
#if SCENE_MANAGEMENT_SCENE_HANDLE_AVAILABLE
95+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
96+
private bool Equals(SceneHandle other) => m_Handle == other;
97+
#else
98+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
99+
public bool Equals(int other) => m_Handle == other;
100+
#endif
101+
102+
#if SCENE_MANAGEMENT_SCENE_HANDLE_AVAILABLE
103+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
104+
public override int GetHashCode() => m_Handle.GetHashCode();
105+
#else
106+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
107+
public override int GetHashCode() => m_Handle;
108+
#endif
109+
110+
/// <summary>
111+
/// Test for equality.
112+
/// </summary>
113+
/// <param name="left"></param>
114+
/// <param name="right"></param>
115+
/// <returns>True if the two SceneHandles are the same</returns>
116+
public static bool operator ==(NetworkSceneHandle left, NetworkSceneHandle right) => left.Equals(right);
117+
118+
/// <summary>
119+
/// Test for inequality.
120+
/// </summary>
121+
/// <param name="left"></param>
122+
/// <param name="right"></param>
123+
/// <returns>True if the two SceneHandles are different</returns>
124+
public static bool operator !=(NetworkSceneHandle left, NetworkSceneHandle right) => !left.Equals(right);
125+
126+
127+
#if SCENE_MANAGEMENT_SCENE_HANDLE_AVAILABLE
128+
public static bool operator ==(SceneHandle left, NetworkSceneHandle right) => left.Equals(right.m_Handle);
129+
public static bool operator !=(SceneHandle left, NetworkSceneHandle right) => !left.Equals(right.m_Handle);
130+
131+
public static bool operator ==(NetworkSceneHandle left, SceneHandle right) => left.Equals(right);
132+
public static bool operator !=(NetworkSceneHandle left, SceneHandle right) => !left.Equals(right);
133+
#else
134+
public static bool operator ==(int left, NetworkSceneHandle right) => left.Equals(right.m_Handle);
135+
public static bool operator !=(int left, NetworkSceneHandle right) => !left.Equals(right.m_Handle);
136+
137+
public static bool operator ==(NetworkSceneHandle left, int right) => left.Equals(right);
138+
public static bool operator !=(NetworkSceneHandle left, int right) => !left.Equals(right);
139+
#endif
140+
#endregion
141+
142+
}
143+
}

com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneHandle.cs.meta renamed to com.unity.netcode.gameobjects/Runtime/SceneManagement/NetworkSceneHandle.cs.meta

File renamed without changes.

0 commit comments

Comments
 (0)