diff --git a/com.unity.netcode.gameobjects/Editor/NetworkManagerEditor.cs b/com.unity.netcode.gameobjects/Editor/NetworkManagerEditor.cs
index c337feb5b0..563a2eeabd 100644
--- a/com.unity.netcode.gameobjects/Editor/NetworkManagerEditor.cs
+++ b/com.unity.netcode.gameobjects/Editor/NetworkManagerEditor.cs
@@ -37,7 +37,7 @@ public class NetworkManagerEditor : UnityEditor.Editor
private SerializedProperty m_LoadSceneTimeOutProperty;
private ReorderableList m_NetworkPrefabsList;
- private ReorderableList m_RegisteredScenesList;
+ private ReorderableList m_RegisteredSceneAssetsList;
private NetworkManager m_NetworkManager;
private bool m_Initialized;
@@ -145,7 +145,7 @@ private void OnEnable()
var networkOverrideProp = networkPrefab.FindPropertyRelative(nameof(NetworkPrefab.Override));
var networkOverrideInt = networkOverrideProp.enumValueIndex;
- return 10 + (networkOverrideInt == 0 ? EditorGUIUtility.singleLineHeight : (EditorGUIUtility.singleLineHeight * 2) + 5);
+ return 8 + (networkOverrideInt == 0 ? EditorGUIUtility.singleLineHeight : (EditorGUIUtility.singleLineHeight * 2) + 5);
};
m_NetworkPrefabsList.drawElementCallback = (rect, index, isActive, isFocused) =>
{
@@ -201,17 +201,29 @@ private void OnEnable()
};
m_NetworkPrefabsList.drawHeaderCallback = rect => EditorGUI.LabelField(rect, "NetworkPrefabs");
- m_RegisteredScenesList = new ReorderableList(serializedObject, serializedObject.FindProperty(nameof(NetworkManager.NetworkConfig)).FindPropertyRelative(nameof(NetworkConfig.RegisteredScenes)), true, true, true, true);
- m_RegisteredScenesList.drawElementCallback = (rect, index, isActive, isFocused) =>
+ m_RegisteredSceneAssetsList = new ReorderableList(serializedObject, serializedObject.FindProperty(nameof(NetworkManager.NetworkConfig)).FindPropertyRelative(nameof(NetworkConfig.RegisteredSceneAssets)), true, true, true, true);
+ m_RegisteredSceneAssetsList.elementHeightCallback = index =>
{
- var element = m_RegisteredScenesList.serializedProperty.GetArrayElementAtIndex(index);
- int firstLabelWidth = 50;
- int padding = 20;
+ return EditorGUIUtility.singleLineHeight + 8;
+ };
+ m_RegisteredSceneAssetsList.drawElementCallback = (rect, index, isActive, isFocused) =>
+ {
+ rect.y += 5;
- EditorGUI.LabelField(new Rect(rect.x, rect.y, firstLabelWidth, EditorGUIUtility.singleLineHeight), "Name");
- EditorGUI.PropertyField(new Rect(rect.x + firstLabelWidth, rect.y, rect.width - firstLabelWidth - padding, EditorGUIUtility.singleLineHeight), element, GUIContent.none);
+ var sceneAsset = m_RegisteredSceneAssetsList.serializedProperty.GetArrayElementAtIndex(index);
+ int firstLabelWidth = 24;
+ int padding = 2;
+
+ EditorGUI.LabelField(new Rect(rect.x, rect.y, firstLabelWidth, EditorGUIUtility.singleLineHeight), index.ToString());
+ EditorGUI.PropertyField(new Rect(rect.x + firstLabelWidth, rect.y, rect.width - firstLabelWidth - padding, EditorGUIUtility.singleLineHeight), sceneAsset, GUIContent.none);
+ };
+
+ m_RegisteredSceneAssetsList.drawHeaderCallback = rect => EditorGUI.LabelField(rect, "NetworkScenes");
+
+ m_RegisteredSceneAssetsList.onAddCallback = (registeredList) =>
+ {
+ m_NetworkManager.NetworkConfig.RegisteredSceneAssets.Add(null);
};
- m_RegisteredScenesList.drawHeaderCallback = rect => EditorGUI.LabelField(rect, "Registered Scene Names");
}
public override void OnInspectorGUI()
@@ -231,7 +243,6 @@ public override void OnInspectorGUI()
}
}
-
if (!m_NetworkManager.IsServer && !m_NetworkManager.IsClient)
{
serializedObject.Update();
@@ -248,7 +259,7 @@ public override void OnInspectorGUI()
using (new EditorGUI.DisabledScope(!m_NetworkManager.NetworkConfig.EnableSceneManagement))
{
- m_RegisteredScenesList.DoLayoutList();
+ m_RegisteredSceneAssetsList.DoLayoutList();
EditorGUILayout.Space();
}
diff --git a/com.unity.netcode.gameobjects/Runtime/Configuration/NetworkConfig.cs b/com.unity.netcode.gameobjects/Runtime/Configuration/NetworkConfig.cs
index 9eb54058a4..28567c0725 100644
--- a/com.unity.netcode.gameobjects/Runtime/Configuration/NetworkConfig.cs
+++ b/com.unity.netcode.gameobjects/Runtime/Configuration/NetworkConfig.cs
@@ -1,6 +1,9 @@
using System;
using System.Collections.Generic;
using UnityEngine;
+#if UNITY_EDITOR
+using UnityEditor;
+#endif
using System.Linq;
namespace Unity.Netcode
@@ -24,11 +27,16 @@ public class NetworkConfig
public NetworkTransport NetworkTransport = null;
///
- /// A list of SceneNames that can be used during networked games.
+ /// The list of SceneNames built from the RegisteredSceneAssets list
///
- [Tooltip("The Scenes that can be switched to by the server")]
+ [HideInInspector]
public List RegisteredScenes = new List();
+#if UNITY_EDITOR
+ [Tooltip("The Scenes that can be switched to by the server")]
+ public List RegisteredSceneAssets = new List();
+#endif
+
///
/// Whether or not runtime scene changes should be allowed and expected.
/// If this is true, clients with different initial configurations will not work together.
@@ -44,7 +52,7 @@ public class NetworkConfig
public GameObject PlayerPrefab;
///
- /// A list of spawnable prefabs
+ /// A list of prefabs that can be dynamically spawned.
///
[SerializeField]
[Tooltip("The prefabs that can be spawned across the network")]
@@ -142,9 +150,9 @@ public class NetworkConfig
public HashSize RpcHashSize = HashSize.VarIntFourBytes;
///
- /// The amount of seconds to wait on all clients to load requested scene before the SwitchSceneProgress onComplete callback, that waits for all clients to complete loading, is called anyway.
+ /// The amount of seconds to wait for all clients to load or unload a requested scene
///
- [Tooltip("The amount of seconds to wait for all clients to load a requested scene")]
+ [Tooltip("The amount of seconds to wait for all clients to load or unload a requested scene (only when EnableSceneManagement is enabled)")]
public int LoadSceneTimeOut = 120;
///
@@ -315,3 +323,4 @@ public bool CompareConfig(ulong hash)
}
}
}
+
diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs
index 298de3a51c..953f1c13f1 100644
--- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs
+++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs
@@ -3,6 +3,9 @@
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
+#if UNITY_EDITOR
+using UnityEditor;
+#endif
using Unity.Profiling;
using UnityEngine.SceneManagement;
using Debug = UnityEngine.Debug;
@@ -37,7 +40,6 @@ public class NetworkManager : MonoBehaviour, INetworkUpdateSystem
#endif
private const double k_TimeSyncFrequency = 1.0d; // sync every second, TODO will be removed once timesync is done via snapshots
-
internal MessageQueueContainer MessageQueueContainer { get; private set; }
@@ -237,7 +239,7 @@ internal void InvokeConnectionApproval(byte[] payload, ulong clientId, Connectio
[HideInInspector] public NetworkConfig NetworkConfig;
///
- /// The current hostname we are connected to, used to validate certificate
+ /// The current host name we are connected to, used to validate certificate
///
public string ConnectedHostname { get; private set; }
@@ -261,28 +263,21 @@ private void OnValidate()
}
}
- var activeScene = UnityEngine.SceneManagement.SceneManager.GetActiveScene();
- var activeSceneName = activeScene.name;
- if (!NetworkConfig.RegisteredScenes.Contains(activeSceneName))
+ if (NetworkConfig.EnableSceneManagement)
{
- if (NetworkLog.CurrentLogLevel <= LogLevel.Normal)
+ foreach (var sceneAsset in NetworkConfig.RegisteredSceneAssets)
{
- NetworkLog.LogWarning("Active scene is not registered as a network scene. Netcode has added it");
- }
-
- NetworkConfig.RegisteredScenes.Add(activeSceneName);
- UnityEditor.EditorApplication.delayCall += () =>
- {
- if (!UnityEditor.EditorApplication.isPlaying)
+ if (!NetworkConfig.RegisteredScenes.Contains(sceneAsset.name))
{
- UnityEditor.EditorUtility.SetDirty(this);
- UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty(activeScene);
+ NetworkConfig.RegisteredScenes.Add(sceneAsset.name);
}
- };
+ }
}
+ var activeScene = UnityEngine.SceneManagement.SceneManager.GetActiveScene();
+
// If the scene is not dirty or the asset database is currently updating then we can skip updating the NetworkPrefab information
- if (!activeScene.isDirty || UnityEditor.EditorApplication.isUpdating)
+ if (!activeScene.isDirty || EditorApplication.isUpdating)
{
return;
}
@@ -458,8 +453,6 @@ private void Initialize(bool server)
SceneManager.SceneIndexToString.Add((uint)i, NetworkConfig.RegisteredScenes[i]);
SceneManager.SceneNameToIndex.Add(NetworkConfig.RegisteredScenes[i], (uint)i);
}
-
- SceneManager.SetCurrentSceneIndex();
}
// This is used to remove entries not needed or invalid
@@ -468,6 +461,7 @@ private void Initialize(bool server)
// Always clear our prefab override links before building
NetworkConfig.NetworkPrefabOverrideLinks.Clear();
+ // Build the NetworkPrefabOverrideLinks dictionary
// Build the NetworkPrefabOverrideLinks dictionary
for (int i = 0; i < NetworkConfig.NetworkPrefabs.Count; i++)
{
@@ -902,7 +896,6 @@ public void Shutdown()
NetworkTickSystem = null;
}
- IsListening = false;
IsServer = false;
IsClient = false;
NetworkConfig.NetworkTransport.OnTransportEvent -= HandleRawTransportPoll;
@@ -937,8 +930,15 @@ public void Shutdown()
BehaviourUpdater = null;
}
- //The Transport is set during Init time, thus it is possible for the Transport to be null
- NetworkConfig?.NetworkTransport?.Shutdown();
+ // This is required for handling the potential scenario where multiple NetworkManager instances are created.
+ // See MTT-860 for more information
+ if (IsListening)
+ {
+ //The Transport is set during initialization, thus it is possible for the Transport to be null
+ NetworkConfig?.NetworkTransport?.Shutdown();
+ }
+
+ IsListening = false;
}
// INetworkUpdateSystem
@@ -1063,12 +1063,6 @@ private IEnumerator ApprovalTimeout(ulong clientId)
}
}
- internal IEnumerator TimeOutSwitchSceneProgress(SceneSwitchProgress switchSceneProgress)
- {
- yield return new WaitForSecondsRealtime(NetworkConfig.LoadSceneTimeOut);
- switchSceneProgress.SetTimedOut();
- }
-
private void HandleRawTransportPoll(NetworkEvent networkEvent, ulong clientId, NetworkChannel networkChannel,
ArraySegment payload, float receiveTime)
{
@@ -1150,8 +1144,7 @@ private void HandleRawTransportPoll(NetworkEvent networkEvent, ulong clientId, N
private readonly NetworkBuffer m_InputBufferWrapper = new NetworkBuffer(new byte[0]);
private readonly MessageBatcher m_MessageBatcher = new MessageBatcher();
- internal void HandleIncomingData(ulong clientId, NetworkChannel networkChannel, ArraySegment data,
- float receiveTime)
+ internal void HandleIncomingData(ulong clientId, NetworkChannel networkChannel, ArraySegment data, float receiveTime)
{
#if DEVELOPMENT_BUILD || UNITY_EDITOR
s_HandleIncomingData.Begin();
@@ -1184,8 +1177,8 @@ internal void HandleIncomingData(ulong clientId, NetworkChannel networkChannel,
#endif
}
- private void ReceiveCallback(NetworkBuffer messageBuffer, MessageQueueContainer.MessageType messageType,
- ulong clientId, float receiveTime, NetworkChannel receiveChannel)
+ private void ReceiveCallback(NetworkBuffer messageBuffer, MessageQueueContainer.MessageType messageType, ulong clientId,
+ float receiveTime, NetworkChannel receiveChannel)
{
MessageHandler.MessageReceiveQueueItem(clientId, messageBuffer, receiveTime, messageType, receiveChannel);
}
@@ -1332,7 +1325,7 @@ internal void OnClientDisconnectFromServer(ulong clientId)
}
}
- // TODO: Could(should?) be replaced with more memory per client, by storing the visiblity
+ // TODO: Could(should?) be replaced with more memory per client, by storing the visibility
foreach (var sobj in SpawnManager.SpawnedObjectsList)
{
@@ -1379,8 +1372,15 @@ private void SyncTime()
#endif
}
- private readonly List m_ObservedObjects = new List();
-
+ ///
+ /// Server Side: Handles the approval of a client
+ ///
+ /// client being approved
+ /// whether we want to create a player or not
+ /// the GlobalObjectIdHash value for the Network Prefab to create as the player
+ /// Is the player approved or not?
+ /// Used when createPlayerObject is true, position of the player when spawned
+ /// Used when createPlayerObject is true, rotation of the player when spawned
internal void HandleApproval(ulong ownerClientId, bool createPlayerObject, uint? playerPrefabHash, bool approved, Vector3? position, Quaternion? rotation)
{
if (approved)
@@ -1400,48 +1400,36 @@ internal void HandleApproval(ulong ownerClientId, bool createPlayerObject, uint?
ConnectedClients[ownerClientId].PlayerObject = networkObject;
}
- m_ObservedObjects.Clear();
-
- foreach (var sobj in SpawnManager.SpawnedObjectsList)
- {
- if (ownerClientId == ServerClientId || sobj.CheckObjectVisibility == null || sobj.CheckObjectVisibility(ownerClientId))
- {
- m_ObservedObjects.Add(sobj);
- sobj.Observers.Add(ownerClientId);
- }
- }
-
+ // Server doesn't send itself the connection approved message
if (ownerClientId != ServerClientId)
{
- // Don't send any data over the wire if the host "connected"
- ulong[] clientIds = { ownerClientId };
-
- var context = MessageQueueContainer.EnterInternalCommandContext(
- MessageQueueContainer.MessageType.ConnectionApproved, NetworkChannel.Internal,
- clientIds, NetworkUpdateStage.EarlyUpdate);
+ var context = MessageQueueContainer.EnterInternalCommandContext(MessageQueueContainer.MessageType.ConnectionApproved, NetworkChannel.Internal,
+ new ulong[] { ownerClientId }, NetworkUpdateStage.EarlyUpdate);
if (context != null)
{
using (var nonNullContext = (InternalCommandContext)context)
{
nonNullContext.NetworkWriter.WriteUInt64Packed(ownerClientId);
-
- if (NetworkConfig.EnableSceneManagement)
- {
- nonNullContext.NetworkWriter.WriteUInt32Packed(NetworkSceneManager.CurrentSceneIndex);
- nonNullContext.NetworkWriter.WriteByteArray(NetworkSceneManager.CurrentSceneSwitchProgressGuid
- .ToByteArray());
- }
-
nonNullContext.NetworkWriter.WriteInt32Packed(LocalTime.Tick);
- nonNullContext.NetworkWriter.WriteUInt32Packed((uint)m_ObservedObjects.Count);
- for (int i = 0; i < m_ObservedObjects.Count; i++)
+ // If scene management is disabled, then just serialize all client relative (observed) NetworkObjects
+ if (!NetworkConfig.EnableSceneManagement)
{
- m_ObservedObjects[i].SerializeSceneObject(nonNullContext.NetworkWriter, ownerClientId);
+ SpawnManager.SerializeObservedNetworkObjects(ownerClientId, nonNullContext.NetworkWriter);
}
}
}
+
+ // If scene management is enabled, then let NetworkSceneManager handle the initial scene and NetworkObject synchronization
+ if (NetworkConfig.EnableSceneManagement)
+ {
+ SceneManager.SynchronizeNetworkObjects(ownerClientId);
+ }
+ }
+ else // Server just adds itself as an observer to all spawned NetworkObjects
+ {
+ SpawnManager.UpdateObservedNetworkObjects(ownerClientId);
}
OnClientConnectedCallback?.Invoke(ownerClientId);
@@ -1451,67 +1439,78 @@ internal void HandleApproval(ulong ownerClientId, bool createPlayerObject, uint?
return;
}
- // Inform old clients of the new player
- foreach (KeyValuePair clientPair in ConnectedClients)
+ // Separating this into a contained function call for potential further future separation of when this notification is sent.
+ ApprovedPlayerSpawn(ownerClientId, playerPrefabHash ?? NetworkConfig.PlayerPrefab.GetComponent().GlobalObjectIdHash);
+ }
+ else
+ {
+ PendingClients.Remove(ownerClientId);
+ NetworkConfig.NetworkTransport.DisconnectRemoteClient(ownerClientId);
+ }
+ }
+
+
+
+ ///
+ /// Spawns the newly approved player
+ ///
+ /// new player client identifier
+ /// the prefab GlobalObjectIdHash value for this player
+ internal void ApprovedPlayerSpawn(ulong clientId, uint playerPrefabHash)
+ {
+ foreach (KeyValuePair clientPair in ConnectedClients)
+ {
+ if (clientPair.Key == clientId ||
+ clientPair.Key == ServerClientId || // Server already spawned it
+ ConnectedClients[clientId].PlayerObject == null ||
+ !ConnectedClients[clientId].PlayerObject.Observers.Contains(clientPair.Key))
+ {
+ continue; //The new client.
+ }
+
+ var context = MessageQueueContainer.EnterInternalCommandContext(MessageQueueContainer.MessageType.CreateObject, NetworkChannel.Internal,
+ new[] { clientPair.Key }, NetworkUpdateLoop.UpdateStage);
+ if (context != null)
{
- if (clientPair.Key == ownerClientId ||
- clientPair.Key == ServerClientId || // Server already spawned it
- ConnectedClients[ownerClientId].PlayerObject == null ||
- !ConnectedClients[ownerClientId].PlayerObject.Observers.Contains(clientPair.Key))
+ using (var nonNullContext = (InternalCommandContext)context)
{
- continue; //The new client.
- }
+ nonNullContext.NetworkWriter.WriteBool(true);
+ nonNullContext.NetworkWriter.WriteUInt64Packed(ConnectedClients[clientId].PlayerObject.NetworkObjectId);
+ nonNullContext.NetworkWriter.WriteUInt64Packed(clientId);
- var context = MessageQueueContainer.EnterInternalCommandContext(
- MessageQueueContainer.MessageType.CreateObject, NetworkChannel.Internal,
- new[] { clientPair.Key }, NetworkUpdateLoop.UpdateStage);
- if (context != null)
- {
- using (var nonNullContext = (InternalCommandContext)context)
- {
- nonNullContext.NetworkWriter.WriteBool(true);
- nonNullContext.NetworkWriter.WriteUInt64Packed(ConnectedClients[ownerClientId].PlayerObject.NetworkObjectId);
- nonNullContext.NetworkWriter.WriteUInt64Packed(ownerClientId);
+ //Does not have a parent
+ nonNullContext.NetworkWriter.WriteBool(false);
- //Does not have a parent
- nonNullContext.NetworkWriter.WriteBool(false);
+ // This is not a scene object
+ nonNullContext.NetworkWriter.WriteBool(false);
- // This is not a scene object
- nonNullContext.NetworkWriter.WriteBool(false);
+ nonNullContext.NetworkWriter.WriteUInt32Packed(playerPrefabHash);
- nonNullContext.NetworkWriter.WriteUInt32Packed(playerPrefabHash ?? NetworkConfig.PlayerPrefab.GetComponent().GlobalObjectIdHash);
+ if (ConnectedClients[clientId].PlayerObject.IncludeTransformWhenSpawning == null || ConnectedClients[clientId].PlayerObject.IncludeTransformWhenSpawning(clientId))
+ {
+ nonNullContext.NetworkWriter.WriteBool(true);
+ nonNullContext.NetworkWriter.WriteSinglePacked(ConnectedClients[clientId].PlayerObject.transform.position.x);
+ nonNullContext.NetworkWriter.WriteSinglePacked(ConnectedClients[clientId].PlayerObject.transform.position.y);
+ nonNullContext.NetworkWriter.WriteSinglePacked(ConnectedClients[clientId].PlayerObject.transform.position.z);
- if (ConnectedClients[ownerClientId].PlayerObject.IncludeTransformWhenSpawning == null || ConnectedClients[ownerClientId].PlayerObject.IncludeTransformWhenSpawning(ownerClientId))
- {
- nonNullContext.NetworkWriter.WriteBool(true);
- nonNullContext.NetworkWriter.WriteSinglePacked(ConnectedClients[ownerClientId].PlayerObject.transform.position.x);
- nonNullContext.NetworkWriter.WriteSinglePacked(ConnectedClients[ownerClientId].PlayerObject.transform.position.y);
- nonNullContext.NetworkWriter.WriteSinglePacked(ConnectedClients[ownerClientId].PlayerObject.transform.position.z);
-
- nonNullContext.NetworkWriter.WriteSinglePacked(ConnectedClients[ownerClientId].PlayerObject.transform.rotation.eulerAngles.x);
- nonNullContext.NetworkWriter.WriteSinglePacked(ConnectedClients[ownerClientId].PlayerObject.transform.rotation.eulerAngles.y);
- nonNullContext.NetworkWriter.WriteSinglePacked(ConnectedClients[ownerClientId].PlayerObject.transform.rotation.eulerAngles.z);
- }
- else
- {
- nonNullContext.NetworkWriter.WriteBool(false);
- }
+ nonNullContext.NetworkWriter.WriteSinglePacked(ConnectedClients[clientId].PlayerObject.transform.rotation.eulerAngles.x);
+ nonNullContext.NetworkWriter.WriteSinglePacked(ConnectedClients[clientId].PlayerObject.transform.rotation.eulerAngles.y);
+ nonNullContext.NetworkWriter.WriteSinglePacked(ConnectedClients[clientId].PlayerObject.transform.rotation.eulerAngles.z);
+ }
+ else
+ {
+ nonNullContext.NetworkWriter.WriteBool(false);
+ }
- nonNullContext.NetworkWriter.WriteBool(false); //No payload data
+ nonNullContext.NetworkWriter.WriteBool(false); //No payload data
- if (NetworkConfig.EnableNetworkVariable)
- {
- ConnectedClients[ownerClientId].PlayerObject.WriteNetworkVariableData(nonNullContext.NetworkWriter.GetStream(), clientPair.Key);
- }
+ if (NetworkConfig.EnableNetworkVariable)
+ {
+ ConnectedClients[clientId].PlayerObject.WriteNetworkVariableData(nonNullContext.NetworkWriter.GetStream(), clientPair.Key);
}
}
}
}
- else
- {
- PendingClients.Remove(ownerClientId);
- NetworkConfig.NetworkTransport.DisconnectRemoteClient(ownerClientId);
- }
}
private IInternalMessageHandler CreateMessageHandler()
diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs
index 05857a81ce..9b60dc3862 100644
--- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs
+++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs
@@ -394,7 +394,8 @@ public static void NetworkHide(List networkObjects, ulong clientI
private void OnDestroy()
{
- if (NetworkManager != null && NetworkManager.IsListening && NetworkManager.IsServer == false && IsSpawned)
+ if (NetworkManager != null && NetworkManager.IsListening && NetworkManager.IsServer == false && IsSpawned
+ && (IsSceneObject == null || (IsSceneObject != null && IsSceneObject.Value != true)))
{
throw new NotServerException($"Destroy a spawned {nameof(NetworkObject)} on a non-host client is not valid. Call {nameof(Destroy)} or {nameof(Despawn)} on the server/host instead.");
}
@@ -533,14 +534,14 @@ public void SpawnAsPlayerObject(ulong clientId, bool destroyWithScene = false)
}
///
- /// Despawns this GameObject and destroys it for other clients. This should be used if the object should be kept on the server
+ /// Despawns the of this and sends a destroy message for it to all connected clients.
///
+ /// (true) the will be destroyed (false) the will persist after being despawned
public void Despawn(bool destroy = false)
{
NetworkManager.SpawnManager.DespawnObject(this, destroy);
}
-
///
/// Removes all ownership of an object from any client. Can only be called from server
///
diff --git a/com.unity.netcode.gameobjects/Runtime/Messaging/IInternalMessageHandler.cs b/com.unity.netcode.gameobjects/Runtime/Messaging/IInternalMessageHandler.cs
index f6c2353280..c345ffc3a3 100644
--- a/com.unity.netcode.gameobjects/Runtime/Messaging/IInternalMessageHandler.cs
+++ b/com.unity.netcode.gameobjects/Runtime/Messaging/IInternalMessageHandler.cs
@@ -9,8 +9,7 @@ internal interface IInternalMessageHandler
void HandleConnectionApproved(ulong clientId, Stream stream, float receiveTime);
void HandleAddObject(ulong clientId, Stream stream);
void HandleDestroyObject(ulong clientId, Stream stream);
- void HandleSwitchScene(ulong clientId, Stream stream);
- void HandleClientSwitchSceneCompleted(ulong clientId, Stream stream);
+ void HandleSceneEvent(ulong clientId, Stream stream);
void HandleChangeOwner(ulong clientId, Stream stream);
void HandleTimeSync(ulong clientId, Stream stream);
void HandleNetworkVariableDelta(ulong clientId, Stream stream);
@@ -18,6 +17,5 @@ internal interface IInternalMessageHandler
void HandleUnnamedMessage(ulong clientId, Stream stream);
void HandleNamedMessage(ulong clientId, Stream stream);
void HandleNetworkLog(ulong clientId, Stream stream);
- void HandleAllClientsSwitchSceneCompleted(ulong clientId, Stream stream);
}
}
diff --git a/com.unity.netcode.gameobjects/Runtime/Messaging/InternalMessageHandler.cs b/com.unity.netcode.gameobjects/Runtime/Messaging/InternalMessageHandler.cs
index 92d680dc4e..82bb82026f 100644
--- a/com.unity.netcode.gameobjects/Runtime/Messaging/InternalMessageHandler.cs
+++ b/com.unity.netcode.gameobjects/Runtime/Messaging/InternalMessageHandler.cs
@@ -1,8 +1,6 @@
-using System;
using System.IO;
using UnityEngine;
-using UnityEngine.Events;
-using UnityEngine.SceneManagement;
+
namespace Unity.Netcode
{
@@ -52,75 +50,35 @@ public void HandleConnectionRequest(ulong clientId, Stream stream)
}
}
+ ///
+ /// Client Side: handles the connection approved message
+ ///
+ /// transport derived client identifier (currently not used)
+ /// incoming stream
+ /// time this message was received (currently not used)
public void HandleConnectionApproved(ulong clientId, Stream stream, float receiveTime)
{
using (var reader = PooledNetworkReader.Get(stream))
{
NetworkManager.LocalClientId = reader.ReadUInt64Packed();
- uint sceneIndex = 0;
- var sceneSwitchProgressGuid = new Guid();
-
- if (NetworkManager.NetworkConfig.EnableSceneManagement)
- {
- sceneIndex = reader.ReadUInt32Packed();
- sceneSwitchProgressGuid = new Guid(reader.ReadByteArray());
- }
-
- bool sceneSwitch = NetworkManager.NetworkConfig.EnableSceneManagement && NetworkManager.SceneManager.HasSceneMismatch(sceneIndex);
-
int tick = reader.ReadInt32Packed();
var time = new NetworkTime(NetworkManager.NetworkTickSystem.TickRate, tick);
NetworkManager.NetworkTimeSystem.Reset(time.Time, 0.15f); // Start with a constant RTT of 150 until we receive values from the transport.
NetworkManager.ConnectedClients.Add(NetworkManager.LocalClientId, new NetworkClient { ClientId = NetworkManager.LocalClientId });
- void DelayedSpawnAction(Stream continuationStream)
+ // Only if scene management is disabled do we handle NetworkObject synchronization at this point
+ if (!NetworkManager.NetworkConfig.EnableSceneManagement)
{
- using (var continuationReader = PooledNetworkReader.Get(continuationStream))
- {
- if (!NetworkManager.NetworkConfig.EnableSceneManagement)
- {
- NetworkManager.SpawnManager.DestroySceneObjects();
- }
- else
- {
- NetworkManager.SceneManager.PopulateScenePlacedObjects();
- }
-
- var objectCount = continuationReader.ReadUInt32Packed();
- for (int i = 0; i < objectCount; i++)
- {
- NetworkObject.DeserializeSceneObject(continuationStream as NetworkBuffer, continuationReader, m_NetworkManager);
- }
+ NetworkManager.SpawnManager.DestroySceneObjects();
- NetworkManager.IsConnectedClient = true;
- NetworkManager.InvokeOnClientConnectedCallback(NetworkManager.LocalClientId);
- }
- }
-
- if (sceneSwitch)
- {
- UnityAction onSceneLoaded = null;
-
- var continuationBuffer = new NetworkBuffer();
- continuationBuffer.CopyUnreadFrom(stream);
- continuationBuffer.Position = 0;
-
- void OnSceneLoadComplete()
+ // is not packed!
+ var objectCount = reader.ReadUInt16();
+ for (ushort i = 0; i < objectCount; i++)
{
- SceneManager.activeSceneChanged -= onSceneLoaded;
- NetworkSceneManager.IsSpawnedObjectsPendingInDontDestroyOnLoad = false;
- DelayedSpawnAction(continuationBuffer);
+ NetworkObject.DeserializeSceneObject(reader.GetStream() as NetworkBuffer, reader, m_NetworkManager);
}
-
- onSceneLoaded = (oldScene, newScene) => { OnSceneLoadComplete(); };
- SceneManager.activeSceneChanged += onSceneLoaded;
- m_NetworkManager.SceneManager.OnFirstSceneSwitchSync(sceneIndex, sceneSwitchProgressGuid);
- }
- else
- {
- DelayedSpawnAction(stream);
}
}
}
@@ -177,28 +135,16 @@ public void HandleDestroyObject(ulong clientId, Stream stream)
}
}
- public void HandleSwitchScene(ulong clientId, Stream stream)
+ ///
+ /// Called for all Scene Management related events
+ ///
+ ///
+ ///
+ public void HandleSceneEvent(ulong clientId, Stream stream)
{
- using (var reader = PooledNetworkReader.Get(stream))
- {
- uint sceneIndex = reader.ReadUInt32Packed();
- var switchSceneGuid = new Guid(reader.ReadByteArray());
-
- var objectBuffer = new NetworkBuffer();
- objectBuffer.CopyUnreadFrom(stream);
- objectBuffer.Position = 0;
-
- m_NetworkManager.SceneManager.OnSceneSwitch(sceneIndex, switchSceneGuid, objectBuffer);
- }
+ NetworkManager.SceneManager.HandleSceneEvent(clientId, stream);
}
- public void HandleClientSwitchSceneCompleted(ulong clientId, Stream stream)
- {
- using (var reader = PooledNetworkReader.Get(stream))
- {
- m_NetworkManager.SceneManager.OnClientSwitchSceneCompleted(clientId, new Guid(reader.ReadByteArray()));
- }
- }
public void HandleChangeOwner(ulong clientId, Stream stream)
{
@@ -364,15 +310,5 @@ internal static void HandleSnapshot(ulong clientId, Stream messageStream)
{
NetworkManager.Singleton.SnapshotSystem.ReadSnapshot(clientId, messageStream);
}
-
- public void HandleAllClientsSwitchSceneCompleted(ulong clientId, Stream stream)
- {
- using (var reader = PooledNetworkReader.Get(stream))
- {
- var clientIds = reader.ReadULongArray();
- var timedOutClientIds = reader.ReadULongArray();
- NetworkManager.SceneManager.AllClientsReady(clientIds, timedOutClientIds);
- }
- }
}
}
diff --git a/com.unity.netcode.gameobjects/Runtime/Messaging/MessageQueue/MessageQueueContainer.cs b/com.unity.netcode.gameobjects/Runtime/Messaging/MessageQueue/MessageQueueContainer.cs
index bfd221cf74..fec17c426e 100644
--- a/com.unity.netcode.gameobjects/Runtime/Messaging/MessageQueue/MessageQueueContainer.cs
+++ b/com.unity.netcode.gameobjects/Runtime/Messaging/MessageQueue/MessageQueueContainer.cs
@@ -32,9 +32,7 @@ public enum MessageType
ServerLog,
SnapshotData,
NetworkVariableDelta,
- SwitchScene,
- ClientSwitchSceneCompleted,
- AllClientsLoadedScene,
+ SceneEvent,
ParentSync,
None //Indicates end of frame
@@ -127,7 +125,7 @@ public uint GetStreamBufferFrameCount(MessageQueueHistoryFrame.QueueFrameType qu
return null;
}
- writer = BeginAddQueueItemToFrame(messageType, Time.realtimeSinceStartup, transportChannel, 0,
+ writer = BeginAddQueueItemToFrame(messageType, Time.realtimeSinceStartup, transportChannel, NetworkManager.LocalClientId,
clientIds, MessageQueueHistoryFrame.QueueFrameType.Outbound, NetworkUpdateStage.PostLateUpdate);
writer.WriteByte((byte)messageType);
diff --git a/com.unity.netcode.gameobjects/Runtime/Messaging/MessageQueue/MessageQueueProcessor.cs b/com.unity.netcode.gameobjects/Runtime/Messaging/MessageQueue/MessageQueueProcessor.cs
index bbe86e60c6..f6e5b49422 100644
--- a/com.unity.netcode.gameobjects/Runtime/Messaging/MessageQueue/MessageQueueProcessor.cs
+++ b/com.unity.netcode.gameobjects/Runtime/Messaging/MessageQueue/MessageQueueProcessor.cs
@@ -109,30 +109,8 @@ public void ProcessMessage(in MessageFrameItem item)
case MessageQueueContainer.MessageType.NetworkVariableDelta:
m_NetworkManager.MessageHandler.HandleNetworkVariableDelta(item.NetworkId, item.NetworkBuffer);
break;
- case MessageQueueContainer.MessageType.SwitchScene:
- if (m_NetworkManager.IsClient)
- {
- m_NetworkManager.MessageHandler.HandleSwitchScene(item.NetworkId, item.NetworkBuffer);
- }
-
- break;
- case MessageQueueContainer.MessageType.ClientSwitchSceneCompleted:
- if (m_NetworkManager.IsServer && m_NetworkManager.NetworkConfig.EnableSceneManagement)
- {
- m_NetworkManager.MessageHandler.HandleClientSwitchSceneCompleted(item.NetworkId, item.NetworkBuffer);
- }
- else if (!m_NetworkManager.NetworkConfig.EnableSceneManagement)
- {
- NetworkLog.LogWarning($"Server received {MessageQueueContainer.MessageType.ClientSwitchSceneCompleted} from client id {item.NetworkId.ToString()}");
- }
-
- break;
- case MessageQueueContainer.MessageType.AllClientsLoadedScene:
- if (m_NetworkManager.IsClient)
- {
- m_NetworkManager.MessageHandler.HandleAllClientsSwitchSceneCompleted(item.NetworkId, item.NetworkBuffer);
- }
-
+ case MessageQueueContainer.MessageType.SceneEvent:
+ m_NetworkManager.MessageHandler.HandleSceneEvent(item.NetworkId, item.NetworkBuffer);
break;
case MessageQueueContainer.MessageType.ParentSync:
if (m_NetworkManager.IsClient)
diff --git a/com.unity.netcode.gameobjects/Runtime/Profiling/InternalMessageHandlerProfilingDecorator.cs b/com.unity.netcode.gameobjects/Runtime/Profiling/InternalMessageHandlerProfilingDecorator.cs
index adf1092a63..6f627a65b7 100644
--- a/com.unity.netcode.gameobjects/Runtime/Profiling/InternalMessageHandlerProfilingDecorator.cs
+++ b/com.unity.netcode.gameobjects/Runtime/Profiling/InternalMessageHandlerProfilingDecorator.cs
@@ -9,8 +9,7 @@ internal class InternalMessageHandlerProfilingDecorator : IInternalMessageHandle
private readonly ProfilerMarker m_HandleConnectionApproved = new ProfilerMarker($"{nameof(InternalMessageHandler)}.{nameof(HandleConnectionApproved)}");
private readonly ProfilerMarker m_HandleAddObject = new ProfilerMarker($"{nameof(InternalMessageHandler)}.{nameof(HandleAddObject)}");
private readonly ProfilerMarker m_HandleDestroyObject = new ProfilerMarker($"{nameof(InternalMessageHandler)}.{nameof(HandleDestroyObject)}");
- private readonly ProfilerMarker m_HandleSwitchScene = new ProfilerMarker($"{nameof(InternalMessageHandler)}.{nameof(HandleSwitchScene)}");
- private readonly ProfilerMarker m_HandleClientSwitchSceneCompleted = new ProfilerMarker($"{nameof(InternalMessageHandler)}.{nameof(HandleClientSwitchSceneCompleted)}");
+ private readonly ProfilerMarker m_HandleSceneEvent = new ProfilerMarker($"{nameof(InternalMessageHandler)}.{nameof(HandleSceneEvent)}");
private readonly ProfilerMarker m_HandleChangeOwner = new ProfilerMarker($"{nameof(InternalMessageHandler)}.{nameof(HandleChangeOwner)}");
private readonly ProfilerMarker m_HandleTimeSync = new ProfilerMarker($"{nameof(InternalMessageHandler)}.{nameof(HandleTimeSync)}");
private readonly ProfilerMarker m_HandleNetworkVariableDelta = new ProfilerMarker($"{nameof(InternalMessageHandler)}.{nameof(HandleNetworkVariableDelta)}");
@@ -20,7 +19,6 @@ internal class InternalMessageHandlerProfilingDecorator : IInternalMessageHandle
private readonly ProfilerMarker m_MessageReceiveQueueItemServerRpc = new ProfilerMarker($"{nameof(InternalMessageHandler)}.{nameof(MessageReceiveQueueItem)}.{nameof(MessageQueueContainer.MessageType.ServerRpc)}");
private readonly ProfilerMarker m_MessageReceiveQueueItemClientRpc = new ProfilerMarker($"{nameof(InternalMessageHandler)}.{nameof(MessageReceiveQueueItem)}.{nameof(MessageQueueContainer.MessageType.ClientRpc)}");
private readonly ProfilerMarker m_MessageReceiveQueueItemInternalMessage = new ProfilerMarker($"{nameof(InternalMessageHandler)}.{nameof(MessageReceiveQueueItem)}.InternalMessage");
- private readonly ProfilerMarker m_HandleAllClientsSwitchSceneCompleted = new ProfilerMarker($"{nameof(InternalMessageHandler)}.{nameof(HandleAllClientsSwitchSceneCompleted)}");
private readonly IInternalMessageHandler m_MessageHandler;
@@ -67,23 +65,6 @@ public void HandleDestroyObject(ulong clientId, Stream stream)
m_HandleDestroyObject.End();
}
- public void HandleSwitchScene(ulong clientId, Stream stream)
- {
- m_HandleSwitchScene.Begin();
-
- m_MessageHandler.HandleSwitchScene(clientId, stream);
-
- m_HandleSwitchScene.End();
- }
-
- public void HandleClientSwitchSceneCompleted(ulong clientId, Stream stream)
- {
- m_HandleClientSwitchSceneCompleted.Begin();
-
- m_MessageHandler.HandleClientSwitchSceneCompleted(clientId, stream);
-
- m_HandleClientSwitchSceneCompleted.End();
- }
public void HandleChangeOwner(ulong clientId, Stream stream)
{
@@ -170,13 +151,13 @@ public void HandleNetworkLog(ulong clientId, Stream stream)
m_HandleNetworkLog.End();
}
- public void HandleAllClientsSwitchSceneCompleted(ulong clientId, Stream stream)
+ public void HandleSceneEvent(ulong clientId, Stream stream)
{
- m_HandleAllClientsSwitchSceneCompleted.Begin();
+ m_HandleSceneEvent.Begin();
- m_MessageHandler.HandleAllClientsSwitchSceneCompleted(clientId, stream);
+ m_MessageHandler.HandleSceneEvent(clientId, stream);
- m_HandleAllClientsSwitchSceneCompleted.End();
+ m_HandleSceneEvent.End();
}
}
}
diff --git a/com.unity.netcode.gameobjects/Runtime/SceneManagement/NetworkSceneManager.cs b/com.unity.netcode.gameobjects/Runtime/SceneManagement/NetworkSceneManager.cs
index c96e2b8f22..391fc67b43 100644
--- a/com.unity.netcode.gameobjects/Runtime/SceneManagement/NetworkSceneManager.cs
+++ b/com.unity.netcode.gameobjects/Runtime/SceneManagement/NetworkSceneManager.cs
@@ -5,104 +5,338 @@
using UnityEngine;
using UnityEngine.SceneManagement;
+
namespace Unity.Netcode
{
///
- /// Main class for managing network scenes
+ /// Used for local notifications of various scene events.
+ /// The of delegate type uses this class to provide
+ /// scene event status/state.
///
- public class NetworkSceneManager
+ public class SceneEvent
{
///
- /// Delegate for when the scene has been switched
+ /// If applicable, this will be set to the returned by
+ /// load scene and unload scene asynchronous methods.
///
- public delegate void SceneSwitchedDelegate();
+ public AsyncOperation AsyncOperation;
///
- /// Delegate for when a scene switch has been initiated
+ /// Will always be set to the current scene event type () this scene event notification pertains to
///
- public delegate void SceneSwitchStartedDelegate(AsyncOperation operation);
+ public SceneEventData.SceneEventTypes SceneEventType;
///
- /// Delegate for when a client has reported to the server that it has completed scene transition
- ///
+ /// If applicable, this reflects the type of scene loading or unloading that is occurring.
+ /// Unlike , scene unload events will have the original applied when the scene was loaded.
///
- public delegate void NotifyServerClientLoadedSceneDelegate(SceneSwitchProgress progress, ulong clientId);
+ public LoadSceneMode LoadSceneMode;
///
- /// Delegate for when all clients have reported to the server that they have completed scene transition or timed out
- ///
+ /// Excluding and
+ /// This will be set to the scene name that the event pertains to.
///
- public delegate void NotifyServerAllClientsLoadedSceneDelegate(SceneSwitchProgress progress, bool timedOut);
+ public string SceneName;
///
- /// Delegate for when the clients get notified by the server that all clients have completed their scene transitions.
- ///
+ /// When a scene is loaded, the Scene structure is returned.
///
- public delegate void NotifyClientAllClientsLoadedSceneDelegate(ulong[] clientIds, ulong[] timedOutClientIds);
+ public Scene Scene;
///
- /// Event that is invoked when the scene is switched
+ /// Events that always set to the local client identifier
+ /// and only triggered locally:
+ ///
+ ///
+ ///
+ ///
+ ///
+ /// Events that always set to the local client identifier,
+ /// are triggered locally, and a host or server will trigger externally generated
+ /// scene event message types (i.e. sent by a client):
+ ///
+ ///
+ ///
+ ///
+ /// Events that always set to the ServerId:
+ ///
+ ///
///
- public event SceneSwitchedDelegate OnSceneSwitched;
+ public ulong ClientId;
///
- /// Event that is invoked when a local scene switch has started
+ /// List of clients that completed a loading or unloading event
+ /// Applies only to:
+ ///
+ ///
///
- public event SceneSwitchStartedDelegate OnSceneSwitchStarted;
+ public List ClientsThatCompleted;
+
+ ///
+ /// List of clients that timed out during a loading or unloading event
+ /// Applies only to:
+ ///
+ ///
+ ///
+ public List ClientsThatTimedOut;
+ }
+
+ ///
+ /// Main class for managing network scenes when is enabled.
+ /// Uses the message to communicate between the server and client(s)
+ ///
+ public class NetworkSceneManager
+ {
+ // Used to be able to turn re-synchronization off for future snapshot development purposes.
+ internal static bool DisableReSynchronization;
///
- /// Event that is invoked on the server when a client completes scene transition
+ /// Used to detect if a scene event is underway
+ /// Only 1 scene event can occur on the server at a time for now.
///
- public event NotifyServerClientLoadedSceneDelegate OnNotifyServerClientLoadedScene;
+ private static bool s_IsSceneEventActive = false;
///
- /// Event that is invoked on the server when all clients have reported that they have completed scene transition
+ /// The delegate callback definition for scene event notifications
+ /// For more details review over and
///
- public event NotifyServerAllClientsLoadedSceneDelegate OnNotifyServerAllClientsLoadedScene;
+ ///
+ public delegate void SceneEventDelegate(SceneEvent sceneEvent);
///
- /// Event that is invoked on the clients after all clients have successfully completed scene transition or timed out.
- /// This event happens after fires on the server and the message is sent to the clients.
- /// It relies on MessageSender, which doesn't send events from the server to itself (which is the case for a Host client).
+ /// Event that will notify the local client or server of all scene events that take place
+ /// For more details review over , , and
///
- public event NotifyClientAllClientsLoadedSceneDelegate OnNotifyClientAllClientsLoadedScene;
+ public event SceneEventDelegate OnSceneEvent;
internal readonly HashSet RegisteredSceneNames = new HashSet();
internal readonly Dictionary SceneNameToIndex = new Dictionary();
internal readonly Dictionary SceneIndexToString = new Dictionary();
- internal readonly Dictionary SceneSwitchProgresses = new Dictionary();
- internal readonly Dictionary ScenePlacedObjects = new Dictionary();
-
- private static Scene s_LastScene;
- private static string s_NextSceneName;
- private static bool s_IsSwitching = false;
- internal static uint CurrentSceneIndex = 0;
- internal static Guid CurrentSceneSwitchProgressGuid = new Guid();
+ internal readonly Dictionary SceneEventProgressTracking = new Dictionary();
+
+ ///
+ /// Used to track in-scene placed NetworkObjects
+ /// We store them by:
+ /// [GlobalObjectIdHash][Scene.Handle][NetworkObject]
+ /// The Scene.Handle aspect allows us to distinguish duplicated in-scene placed NetworkObjects created by the loading
+ /// of the same additive scene multiple times.
+ ///
+ internal readonly Dictionary> ScenePlacedObjects = new Dictionary>();
+
+ ///
+ /// This is used for the deserialization of in-scene placed NetworkObjects in order to distinguish duplicated in-scene
+ /// placed NetworkObjects created by the loading of the same additive scene multiple times.
+ ///
+ internal Scene SceneBeingSynchronized;
+
+ ///
+ /// Used to track which scenes are currently loaded
+ /// We store the scenes as [SceneHandle][Scene] in order to handle the loading and unloading of the same scene additively
+ /// Scene handle is only unique locally. So, clients depend upon the in order
+ /// to be able to know which specific scene instance the server is instructing the client to unload.
+ /// The client links the server scene handle to the client local scene handle upon a scene being loaded
+ ///
+ ///
+ internal Dictionary ScenesLoaded = new Dictionary();
+
+ ///
+ /// Since Scene.handle is unique per client, we create a look-up table between the client and server to associate server unique scene
+ /// instances with client unique scene instances
+ ///
+ internal Dictionary ServerSceneHandleToClientSceneHandle = new Dictionary();
+
+ ///
+ /// The Condition: While a scene is asynchronously loaded in single loading scene mode, if any new NetworkObjects are spawned
+ /// they need to be moved into the do not destroy temporary scene
+ /// When it is set: Just before starting the asynchronous loading call
+ /// When it is unset: After the scene has loaded, the PopulateScenePlacedObjects is called, and all NetworkObjects in the do
+ /// not destroy temporary scene are moved into the active scene
+ ///
internal static bool IsSpawnedObjectsPendingInDontDestroyOnLoad = false;
+ ///
+ /// Client and Server:
+ /// Used for all scene event processing except for ClientSynchEventData specific events
+ ///
+ internal SceneEventData SceneEventData;
+
+ ///
+ /// Server Side:
+ /// Used specifically for scene synchronization and scene event progress related events.
+ ///
+ internal SceneEventData ClientSynchEventData;
+
private NetworkManager m_NetworkManager { get; }
+ private const MessageQueueContainer.MessageType k_MessageType = MessageQueueContainer.MessageType.SceneEvent;
+ private const NetworkChannel k_ChannelType = NetworkChannel.Internal;
+ private const NetworkUpdateStage k_NetworkUpdateStage = NetworkUpdateStage.EarlyUpdate;
+
+ ///
+ /// Constructor
+ ///
+ ///
internal NetworkSceneManager(NetworkManager networkManager)
{
m_NetworkManager = networkManager;
+ SceneEventData = new SceneEventData(networkManager);
+ ClientSynchEventData = new SceneEventData(networkManager);
}
- internal void SetCurrentSceneIndex()
+ ///
+ /// Since SceneManager.GetSceneByName only returns the first scene that matches the name
+ /// we must "find" a newly added scene by looking through all loaded scenes and determining
+ /// which scene with the same name has not yet been loaded.
+ /// In order to support loading the same additive scene within in-scene placed NetworkObjects,
+ /// we must do this to be able to soft synchronize the "right version" of the NetworkObject.
+ ///
+ ///
+ ///
+ internal Scene GetAndAddNewlyLoadedSceneByName(string sceneName)
{
- if (!SceneNameToIndex.TryGetValue(SceneManager.GetActiveScene().name, out CurrentSceneIndex))
+ for (int i = 0; i < SceneManager.sceneCount; i++)
{
- if (NetworkLog.CurrentLogLevel <= LogLevel.Normal)
+ var sceneLoaded = SceneManager.GetSceneAt(i);
+ if (sceneLoaded.name == sceneName)
+ {
+ if (!ScenesLoaded.ContainsKey(sceneLoaded.handle))
+ {
+ ScenesLoaded.Add(sceneLoaded.handle, sceneLoaded);
+ return sceneLoaded;
+ }
+ }
+ }
+
+ throw new Exception($"Failed to find any loaded scene named {sceneName}!");
+ }
+
+ ///
+ /// Client Side Only:
+ /// This takes a server scene handle that is written by the server before the scene relative
+ /// NetworkObject is serialized and converts the server scene handle to a local client handle
+ /// so it can set the appropriate SceneBeingSynchronized.
+ /// Note: This is now part of the soft synchronization process and is needed for the scenario
+ /// where a user loads the same scene additively that has an in-scene placed NetworkObject
+ /// which means each scene relative in-scene placed NetworkObject will have the identical GlobalObjectIdHash
+ /// value. Scene handles are used to distinguish between in-scene placed NetworkObjects under this situation.
+ ///
+ ///
+ internal void SetTheSceneBeingSynchronized(int serverSceneHandle)
+ {
+ var clientSceneHandle = serverSceneHandle;
+ if (ServerSceneHandleToClientSceneHandle.ContainsKey(serverSceneHandle))
+ {
+ clientSceneHandle = ServerSceneHandleToClientSceneHandle[serverSceneHandle];
+ // If we were already set, then ignore
+ if (SceneBeingSynchronized.IsValid() && SceneBeingSynchronized.isLoaded && SceneBeingSynchronized.handle == clientSceneHandle)
+ {
+ return;
+ }
+
+ // Get the scene currently being synchronized
+ SceneBeingSynchronized = ScenesLoaded.ContainsKey(clientSceneHandle) ? ScenesLoaded[clientSceneHandle] : new Scene();
+
+ // If the scene was not found (invalid) or was not loaded then throw an exception
+ if (!SceneBeingSynchronized.IsValid() || !SceneBeingSynchronized.isLoaded)
{
- NetworkLog.LogWarning($"The current scene ({SceneManager.GetActiveScene().name}) is not regisered as a network scene.");
+ throw new Exception($"[{nameof(NetworkSceneManager)}- {nameof(ScenesLoaded)}] Could not find the appropriate scene to set as being synchronized!");
}
+ }
+ else
+ {
+ // This should never happen, but in the event it does...
+ throw new Exception($"[{nameof(SceneEventData)}- Scene Handle Mismatch] {nameof(serverSceneHandle)} could not be found in {nameof(ServerSceneHandleToClientSceneHandle)}!");
+ }
+ }
+
+ ///
+ /// During soft synchronization of in-scene placed NetworkObjects, this is now used by NetworkSpawnManager.CreateLocalNetworkObject
+ ///
+ ///
+ ///
+ internal NetworkObject GetSceneRelativeInSceneNetworkObject(uint globalObjectIdHash)
+ {
+ if (ScenePlacedObjects.ContainsKey(globalObjectIdHash))
+ {
+ if (ScenePlacedObjects[globalObjectIdHash].ContainsKey(SceneBeingSynchronized.handle))
+ {
+ var inScenePlacedNetworkObject = ScenePlacedObjects[globalObjectIdHash][SceneBeingSynchronized.handle];
+ // We can only have 1 duplicated globalObjectIdHash per scene instance, so remove it once it has been returned
+ ScenePlacedObjects[globalObjectIdHash].Remove(SceneBeingSynchronized.handle);
+
+ return inScenePlacedNetworkObject;
+ }
+ }
+ return null;
+ }
+
+ ///
+ /// Generic sending of scene event data
+ ///
+ /// array of client identifiers to receive the scene event message
+ private void SendSceneEventData(ulong[] targetClientIds)
+ {
+ if (targetClientIds.Length == 0)
+ {
+ // This would be the Host/Server with no clients connected
+ // Silently return as there is nothing to be done
+ return;
+ }
+
+ var context = m_NetworkManager.MessageQueueContainer.EnterInternalCommandContext(k_MessageType, k_ChannelType, targetClientIds, k_NetworkUpdateStage);
+
+ if (context != null)
+ {
+ using (var nonNullContext = (InternalCommandContext)context)
+ {
+ SceneEventData.OnWrite(nonNullContext.NetworkWriter);
+ }
return;
}
- CurrentActiveSceneIndex = CurrentSceneIndex;
+ // This should never happen, but if it does something very bad has happened and we should throw an exception
+ throw new Exception($"{nameof(InternalCommandContext)} is null! {nameof(NetworkSceneManager)} failed to send event notification {SceneEventData.SceneEventType} to target clientIds {targetClientIds}!");
}
- internal uint CurrentActiveSceneIndex { get; private set; } = 0;
+ ///
+ /// Returns the Netcode scene index from a scene
+ ///
+ ///
+ /// Netcode Scene Index
+ private uint GetNetcodeSceneIndexFromScene(Scene scene)
+ {
+ uint index = 0;
+ if (!SceneNameToIndex.TryGetValue(scene.name, out index))
+ {
+ if (NetworkLog.CurrentLogLevel <= LogLevel.Normal)
+ {
+ NetworkLog.LogWarning($"The current scene ({scene.name}) is not registered as a network scene.");
+ }
+ //MaxValue denotes an error
+ return uint.MaxValue;
+ }
+ return index;
+ }
+
+ ///
+ /// Returns the scene name from the Netcode scene index
+ /// Note: This is not the same as the Build Settings Scenes in Build index
+ ///
+ /// Netcode Scene Index
+ /// scene name
+ private string GetSceneNameFromNetcodeSceneIndex(uint sceneIndex)
+ {
+ var sceneName = string.Empty;
+ if (!SceneIndexToString.TryGetValue(sceneIndex, out sceneName))
+ {
+ if (NetworkLog.CurrentLogLevel <= LogLevel.Normal)
+ {
+ NetworkLog.LogWarning($"The current scene index ({sceneIndex}) is not registered as a network scene.");
+ }
+ }
+ return sceneName;
+ }
///
/// Adds a scene during runtime.
@@ -123,94 +357,163 @@ public void AddRuntimeSceneName(string sceneName, uint index)
}
///
- /// Switches to a scene with a given name. Can only be called from Server
+ /// Validates the new scene event request by the server-side code.
+ /// This also initializes some commonly shared values as well as SceneEventProgress
///
- /// The name of the scene to switch to
- /// The mode to load the scene (Additive vs Single)
- /// SceneSwitchProgress
- public SceneSwitchProgress SwitchScene(string sceneName, LoadSceneMode loadSceneMode = LoadSceneMode.Single)
+ ///
+ /// that should have a of otherwise it failed.
+ private SceneEventProgress ValidateServerSceneEvent(string sceneName, bool isUnloading = false)
{
if (!m_NetworkManager.IsServer)
{
- throw new NotServerException("Only server can start a scene switch");
+ throw new NotServerException("Only server can start a scene event!");
}
if (!m_NetworkManager.NetworkConfig.EnableSceneManagement)
{
//Log message about enabling SceneManagement
- throw new Exception($"{nameof(NetworkConfig.EnableSceneManagement)} flag is not enabled in the {nameof(NetworkManager)}'s {nameof(NetworkConfig)}. Please set {nameof(NetworkConfig.EnableSceneManagement)} flag to true before calling this method.");
+ throw new Exception($"{nameof(NetworkConfig.EnableSceneManagement)} flag is not enabled in the {nameof(NetworkManager)}'s {nameof(NetworkConfig)}. " +
+ $"Please set {nameof(NetworkConfig.EnableSceneManagement)} flag to true before calling " +
+ $"{nameof(NetworkSceneManager.LoadScene)} or {nameof(NetworkSceneManager.UnloadScene)}.");
}
- if (s_IsSwitching)
+ // Return scene event already in progress if one is already in progress... :)
+ if (s_IsSceneEventActive)
{
- if (NetworkLog.CurrentLogLevel <= LogLevel.Normal)
- {
- NetworkLog.LogWarning("Scene switch already in progress");
- }
-
- return null;
+ return new SceneEventProgress(null, SceneEventProgressStatus.SceneEventInProgress);
}
+ // Return invalid scene name status if the scene name is invalid... :)
if (!RegisteredSceneNames.Contains(sceneName))
{
- if (NetworkLog.CurrentLogLevel <= LogLevel.Normal)
- {
- NetworkLog.LogWarning($"The scene {sceneName} is not registered as a switchable scene.");
- }
+ return new SceneEventProgress(null, SceneEventProgressStatus.InvalidSceneName);
+ }
- return null;
+ var sceneEventProgress = new SceneEventProgress(m_NetworkManager);
+ sceneEventProgress.SceneName = sceneName;
+ SceneEventProgressTracking.Add(sceneEventProgress.Guid, sceneEventProgress);
+
+ if (!isUnloading)
+ {
+ // The Condition: While a scene is asynchronously loaded in single loading scene mode, if any new NetworkObjects are spawned
+ // they need to be moved into the do not destroy temporary scene
+ // When it is set: Just before starting the asynchronous loading call
+ // When it is unset: After the scene has loaded, the PopulateScenePlacedObjects is called, and all NetworkObjects in the do
+ // not destroy temporary scene are moved into the active scene
+ IsSpawnedObjectsPendingInDontDestroyOnLoad = true;
}
- m_NetworkManager.SpawnManager.ServerDestroySpawnedSceneObjects(); //Destroy current scene objects before switching.
- s_IsSwitching = true;
- s_LastScene = SceneManager.GetActiveScene();
+ s_IsSceneEventActive = true;
- var switchSceneProgress = new SceneSwitchProgress(m_NetworkManager);
- SceneSwitchProgresses.Add(switchSceneProgress.Guid, switchSceneProgress);
- CurrentSceneSwitchProgressGuid = switchSceneProgress.Guid;
+ // Set our callback delegate handler for completion
+ sceneEventProgress.OnComplete = OnSceneEventProgressCompleted;
- switchSceneProgress.OnClientLoadedScene += clientId => { OnNotifyServerClientLoadedScene?.Invoke(switchSceneProgress, clientId); };
- switchSceneProgress.OnComplete += timedOut =>
- {
- OnNotifyServerAllClientsLoadedScene?.Invoke(switchSceneProgress, timedOut);
+ return sceneEventProgress;
+ }
- var context = m_NetworkManager.MessageQueueContainer.EnterInternalCommandContext(
- MessageQueueContainer.MessageType.AllClientsLoadedScene, NetworkChannel.Internal,
- new[] { NetworkManager.Singleton.ServerClientId }, NetworkUpdateLoop.UpdateStage);
- if (context != null)
+ ///
+ /// Callback for the handler
+ ///
+ ///
+ ///
+ private bool OnSceneEventProgressCompleted(SceneEventProgress sceneEventProgress)
+ {
+ // Send a message to all clients that all clients are done loading or unloading
+ var context = m_NetworkManager.MessageQueueContainer.EnterInternalCommandContext(k_MessageType, k_ChannelType, m_NetworkManager.ConnectedClientsIds, k_NetworkUpdateStage);
+ if (context != null)
+ {
+ using (var nonNullContext = (InternalCommandContext)context)
{
- using (var nonNullContext = (InternalCommandContext)context)
- {
- var doneClientIds = switchSceneProgress.DoneClients.ToArray();
- var timedOutClientIds = m_NetworkManager.ConnectedClients.Keys.Except(doneClientIds).ToArray();
-
- nonNullContext.NetworkWriter.WriteULongArray(doneClientIds, doneClientIds.Length);
- nonNullContext.NetworkWriter.WriteULongArray(timedOutClientIds, timedOutClientIds.Length);
- }
+ ClientSynchEventData.SceneEventGuid = sceneEventProgress.Guid;
+ ClientSynchEventData.SceneIndex = SceneNameToIndex[sceneEventProgress.SceneName];
+ ClientSynchEventData.SceneEventType = sceneEventProgress.SceneEventType;
+ ClientSynchEventData.ClientsCompleted = sceneEventProgress.DoneClients;
+ ClientSynchEventData.ClientsTimedOut = m_NetworkManager.ConnectedClients.Keys.Except(sceneEventProgress.DoneClients).ToList();
+ ClientSynchEventData.OnWrite(nonNullContext.NetworkWriter);
}
- };
+ }
- // Move ALL NetworkObjects to the temp scene
- MoveObjectsToDontDestroyOnLoad();
+ // Send a local notification to the server that all clients are done loading or unloading
+ OnSceneEvent?.Invoke(new SceneEvent()
+ {
+ SceneEventType = sceneEventProgress.SceneEventType,
+ SceneName = sceneEventProgress.SceneName,
+ ClientId = m_NetworkManager.ServerClientId,
+ LoadSceneMode = sceneEventProgress.LoadSceneMode,
+ ClientsThatCompleted = sceneEventProgress.DoneClients,
+ ClientsThatTimedOut = m_NetworkManager.ConnectedClients.Keys.Except(sceneEventProgress.DoneClients).ToList(),
+ });
- IsSpawnedObjectsPendingInDontDestroyOnLoad = true;
+ SceneEventProgressTracking.Remove(sceneEventProgress.Guid);
- // Switch scene
- AsyncOperation sceneLoad = SceneManager.LoadSceneAsync(sceneName, loadSceneMode);
+ return false;
+ }
+
+ ///
+ /// Server Side:
+ /// Unloads an additively loaded scene. If you want to unload a mode loaded scene load another scene.
+ /// When applicable, the is delivered within the via the
+ ///
+ /// scene name to unload
+ /// ( means it was successful)
+ public SceneEventProgressStatus UnloadScene(Scene scene)
+ {
+ var sceneName = scene.name;
+ var sceneHandle = scene.handle;
+ if (!scene.isLoaded)
+ {
+ Debug.LogWarning($"{nameof(UnloadScene)} was called, but the scene {scene.name} is not currently loaded!");
+ return SceneEventProgressStatus.SceneNotLoaded;
+ }
+
+ var sceneEventProgress = ValidateServerSceneEvent(sceneName, true);
+ if (sceneEventProgress.Status != SceneEventProgressStatus.Started)
+ {
+ return sceneEventProgress.Status;
+ }
+
+ if (!ScenesLoaded.ContainsKey(sceneHandle))
+ {
+ Debug.LogError($"{nameof(UnloadScene)} internal error! {sceneName} with handle {scene.handle} is not within the internal scenes loaded dictionary!");
+ return SceneEventProgressStatus.InternalNetcodeError;
+ }
+
+ SceneEventData.SceneEventGuid = sceneEventProgress.Guid;
+ SceneEventData.SceneEventType = SceneEventData.SceneEventTypes.S2C_Unload;
+ SceneEventData.SceneIndex = SceneNameToIndex[sceneName];
+ SceneEventData.SceneHandle = sceneHandle;
+
+ // This will be the message we send to everyone when this scene event sceneEventProgress is complete
+ sceneEventProgress.SceneEventType = SceneEventData.SceneEventTypes.S2C_UnLoadComplete;
- s_NextSceneName = sceneName;
+ ScenesLoaded.Remove(scene.handle);
- sceneLoad.completed += (AsyncOperation asyncOp2) => { OnSceneLoaded(switchSceneProgress.Guid, null); };
- switchSceneProgress.SetSceneLoadOperation(sceneLoad);
- OnSceneSwitchStarted?.Invoke(sceneLoad);
+ AsyncOperation sceneUnload = SceneManager.UnloadSceneAsync(scene);
+ sceneUnload.completed += (AsyncOperation asyncOp2) => { OnSceneUnloaded(); };
+ sceneEventProgress.SetSceneLoadOperation(sceneUnload);
- return switchSceneProgress;
+ // Notify local server that a scene is going to be unloaded
+ OnSceneEvent?.Invoke(new SceneEvent()
+ {
+ AsyncOperation = sceneUnload,
+ SceneEventType = SceneEventData.SceneEventType,
+ LoadSceneMode = SceneEventData.LoadSceneMode,
+ SceneName = sceneName,
+ ClientId = m_NetworkManager.ServerClientId // Server can only invoke this
+ });
+
+ //Return the status
+ return sceneEventProgress.Status;
}
- // Called on client
- internal void OnSceneSwitch(uint sceneIndex, Guid switchSceneGuid, Stream objectStream)
+ ///
+ /// Client Side:
+ /// Handles scene events.
+ ///
+ private void OnClientUnloadScene()
{
- if (!SceneIndexToString.TryGetValue(sceneIndex, out string sceneName) || !RegisteredSceneNames.Contains(sceneName))
+ var sceneName = GetSceneNameFromNetcodeSceneIndex(SceneEventData.SceneIndex);
+ if (sceneName == string.Empty)
{
if (NetworkLog.CurrentLogLevel <= LogLevel.Normal)
{
@@ -220,252 +523,820 @@ internal void OnSceneSwitch(uint sceneIndex, Guid switchSceneGuid, Stream object
return;
}
- s_LastScene = SceneManager.GetActiveScene();
+ if (!ServerSceneHandleToClientSceneHandle.ContainsKey(SceneEventData.SceneHandle))
+ {
+ throw new Exception($"Client failed to unload scene {GetSceneNameFromNetcodeSceneIndex(SceneEventData.SceneIndex)} " +
+ $"because we are missing the client scene handle due to the server scene handle {SceneEventData.SceneHandle} not being found!");
+ }
- // Move ALL NetworkObjects to the temp scene
- MoveObjectsToDontDestroyOnLoad();
+ var sceneHandle = ServerSceneHandleToClientSceneHandle[SceneEventData.SceneHandle];
- IsSpawnedObjectsPendingInDontDestroyOnLoad = true;
+ if (!ScenesLoaded.ContainsKey(sceneHandle))
+ {
+ // Error scene handle not found!
+ throw new Exception($"Client failed to unload scene {GetSceneNameFromNetcodeSceneIndex(SceneEventData.SceneIndex)} " +
+ $"because the client scene handle {sceneHandle} was not found in ScenesLoaded!");
+ }
+ s_IsSceneEventActive = true;
+
+ var sceneUnload = SceneManager.UnloadSceneAsync(ScenesLoaded[sceneHandle]);
+
+ sceneUnload.completed += asyncOp2 => OnSceneUnloaded();
- var sceneLoad = SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Single);
+ ScenesLoaded.Remove(sceneHandle);
+
+ // Remove our server to scene handle lookup
+ ServerSceneHandleToClientSceneHandle.Remove(SceneEventData.SceneHandle);
+
+ // Notify the local client that a scene is going to be unloaded
+ OnSceneEvent?.Invoke(new SceneEvent()
+ {
+ AsyncOperation = sceneUnload,
+ SceneEventType = SceneEventData.SceneEventType,
+ LoadSceneMode = SceneEventData.LoadSceneMode,
+ SceneName = sceneName,
+ ClientId = m_NetworkManager.LocalClientId // Server sent this message to the client, but client is executing it
+ });
- s_NextSceneName = sceneName;
- sceneLoad.completed += asyncOp2 => OnSceneLoaded(switchSceneGuid, objectStream);
- OnSceneSwitchStarted?.Invoke(sceneLoad);
}
- internal void OnFirstSceneSwitchSync(uint sceneIndex, Guid switchSceneGuid)
+ ///
+ /// Server and Client:
+ /// Invoked when an additively loaded scene is unloaded
+ ///
+ private void OnSceneUnloaded()
{
- if (!SceneIndexToString.TryGetValue(sceneIndex, out string sceneName) || !RegisteredSceneNames.Contains(sceneName))
+ // First thing we do, if we are a server, is to send the unload scene event.
+ if (m_NetworkManager.IsServer)
{
- if (NetworkLog.CurrentLogLevel <= LogLevel.Normal)
+ // Server sends the unload scene notification after unloading because it will despawn all scene relative in-scene NetworkObjects
+ // If we send this event to all clients before the server is finished unloading they will get warning about an object being
+ // despawned that no longer exists
+ SendSceneEventData(m_NetworkManager.ConnectedClientsIds.Where(c => c != m_NetworkManager.ServerClientId).ToArray());
+
+ //Second, server sets itself as having finished unloading
+ if (SceneEventProgressTracking.ContainsKey(SceneEventData.SceneEventGuid))
{
- NetworkLog.LogWarning("Server requested a scene switch to a non-registered scene");
+ SceneEventProgressTracking[SceneEventData.SceneEventGuid].AddClientAsDone(m_NetworkManager.ServerClientId);
}
-
- return;
}
- if (SceneManager.GetActiveScene().name == sceneName)
+ // Next we prepare to send local notifications for unload complete
+ SceneEventData.SceneEventType = SceneEventData.SceneEventTypes.C2S_UnloadComplete;
+
+ //Notify the client or server that a scene was unloaded
+ OnSceneEvent?.Invoke(new SceneEvent()
{
- return; //This scene is already loaded. This usually happends at first load
- }
+ SceneEventType = SceneEventData.SceneEventType,
+ LoadSceneMode = SceneEventData.LoadSceneMode,
+ SceneName = GetSceneNameFromNetcodeSceneIndex(SceneEventData.SceneIndex),
+ ClientId = m_NetworkManager.IsServer ? m_NetworkManager.ServerClientId : m_NetworkManager.LocalClientId
+ });
- s_LastScene = SceneManager.GetActiveScene();
- s_NextSceneName = sceneName;
- CurrentActiveSceneIndex = SceneNameToIndex[sceneName];
+ // Clients send a notification back to the server they have completed the unload scene event
+ if (!m_NetworkManager.IsServer)
+ {
+ SendSceneEventData(new ulong[] { m_NetworkManager.ServerClientId });
+ }
- IsSpawnedObjectsPendingInDontDestroyOnLoad = true;
- SceneManager.LoadScene(sceneName);
+ // This scene event is now considered "complete"
+ s_IsSceneEventActive = false;
+ }
- var context = m_NetworkManager.MessageQueueContainer.EnterInternalCommandContext(
- MessageQueueContainer.MessageType.ClientSwitchSceneCompleted, NetworkChannel.Internal,
- new[] { m_NetworkManager.ServerClientId }, NetworkUpdateLoop.UpdateStage);
- if (context != null)
+ ///
+ /// Clears all scenes when loading in single mode
+ /// Since we assume a single mode loaded scene will be considered the "currently active scene",
+ /// we only unload any additively loaded scenes.
+ ///
+ internal void UnloadAdditivelyLoadedScenes()
+ {
+ // Unload all additive scenes while making sure we don't try to unload the base scene ( loaded in single mode ).
+ var currentActiveScene = SceneManager.GetActiveScene();
+ foreach (var keyHandleEntry in ScenesLoaded)
{
- using (var nonNullContext = (InternalCommandContext)context)
+ if (currentActiveScene.name != keyHandleEntry.Value.name)
{
- nonNullContext.NetworkWriter.WriteByteArray(switchSceneGuid.ToByteArray());
+ OnSceneEvent?.Invoke(new SceneEvent()
+ {
+ AsyncOperation = SceneManager.UnloadSceneAsync(keyHandleEntry.Value),
+ SceneEventType = SceneEventData.SceneEventTypes.S2C_Unload,
+ LoadSceneMode = LoadSceneMode.Additive,
+ SceneName = keyHandleEntry.Value.name,
+ ClientId = m_NetworkManager.ServerClientId
+ });
}
}
-
- s_IsSwitching = false;
+ // clear out our scenes loaded list
+ ScenesLoaded.Clear();
}
+ ///
+ /// Server side:
+ /// Loads the scene name in either additive or single loading mode.
+ /// When applicable, the is delivered within the via
+ ///
+ /// the name of the scene to be loaded
+ /// ( means it was successful)
+ public SceneEventProgressStatus LoadScene(string sceneName, LoadSceneMode loadSceneMode)
+ {
+ var sceneEventProgress = ValidateServerSceneEvent(sceneName);
+ if (sceneEventProgress.Status != SceneEventProgressStatus.Started)
+ {
+ return sceneEventProgress.Status;
+ }
+ // This will be the message we send to everyone when this scene event sceneEventProgress is complete
+ sceneEventProgress.SceneEventType = SceneEventData.SceneEventTypes.S2C_LoadComplete;
+ sceneEventProgress.LoadSceneMode = loadSceneMode;
+ // Now set up the current scene event
+ SceneEventData.SceneEventGuid = sceneEventProgress.Guid;
+ SceneEventData.SceneEventType = SceneEventData.SceneEventTypes.S2C_Load;
+ SceneEventData.SceneIndex = SceneNameToIndex[sceneName];
+ SceneEventData.LoadSceneMode = loadSceneMode;
+
+ if (SceneEventData.LoadSceneMode == LoadSceneMode.Single)
+ {
+ // Destroy current scene objects before switching.
+ m_NetworkManager.SpawnManager.ServerDestroySpawnedSceneObjects();
+
+ // Preserve the objects that should not be destroyed during the scene event
+ MoveObjectsToDontDestroyOnLoad();
+
+ // Now Unload all currently additively loaded scenes
+ UnloadAdditivelyLoadedScenes();
+ }
+
+ // Now start loading the scene
+ AsyncOperation sceneLoad = SceneManager.LoadSceneAsync(sceneName, loadSceneMode);
+ sceneLoad.completed += (AsyncOperation asyncOp2) => { OnSceneLoaded(sceneName); };
+ sceneEventProgress.SetSceneLoadOperation(sceneLoad);
+
+ // Notify the local server that a scene loading event has begun
+ OnSceneEvent?.Invoke(new SceneEvent()
+ {
+ AsyncOperation = sceneLoad,
+ SceneEventType = SceneEventData.SceneEventType,
+ LoadSceneMode = SceneEventData.LoadSceneMode,
+ SceneName = sceneName,
+ ClientId = m_NetworkManager.ServerClientId
+ });
+
+ //Return our scene progress instance
+ return sceneEventProgress.Status;
+ }
///
- /// Should be invoked on both the client and server side after:
- /// -- A new scene has been loaded
- /// -- Before any "DontDestroyOnLoad" NetworkObjects have been added back into the scene.
- /// Added the ability to choose not to clear the scene placed objects for additive scene loading.
+ /// Client Side:
+ /// Handles both forms of scene loading
///
- internal void PopulateScenePlacedObjects(bool clearScenePlacedObjects = true)
+ /// Stream data associated with the event
+ private void OnClientSceneLoadingEvent(Stream objectStream)
{
- if (clearScenePlacedObjects)
+ if (!SceneIndexToString.TryGetValue(SceneEventData.SceneIndex, out string sceneName) || !RegisteredSceneNames.Contains(sceneName))
{
- ScenePlacedObjects.Clear();
+ if (NetworkLog.CurrentLogLevel <= LogLevel.Normal)
+ {
+ NetworkLog.LogWarning("Server requested a scene switch to a non-registered scene");
+ }
+
+ return;
}
- var networkObjects = UnityEngine.Object.FindObjectsOfType();
+ if (SceneEventData.LoadSceneMode == LoadSceneMode.Single)
+ {
+ // Move ALL NetworkObjects to the temp scene
+ MoveObjectsToDontDestroyOnLoad();
- // Just add every NetworkObject found that isn't already in the list
- // If any "non-in-scene placed NetworkObjects" are added to this list it shouldn't matter
- // The only thing that matters is making sure each NetworkObject is keyed off of their GlobalObjectIdHash
- foreach (var networkObjectInstance in networkObjects)
+ // Now Unload all currently additively loaded scenes
+ UnloadAdditivelyLoadedScenes();
+ }
+
+ // The Condition: While a scene is asynchronously loaded in single loading scene mode, if any new NetworkObjects are spawned
+ // they need to be moved into the do not destroy temporary scene
+ // When it is set: Just before starting the asynchronous loading call
+ // When it is unset: After the scene has loaded, the PopulateScenePlacedObjects is called, and all NetworkObjects in the do
+ // not destroy temporary scene are moved into the active scene
+ if (SceneEventData.LoadSceneMode == LoadSceneMode.Single)
{
- if (!ScenePlacedObjects.ContainsKey(networkObjectInstance.GlobalObjectIdHash))
- {
- // We check to make sure the NetworkManager instance is the same one to be "MultiInstanceHelpers" compatible
- if (networkObjectInstance.IsSceneObject == null && networkObjectInstance.NetworkManager == m_NetworkManager)
- {
- ScenePlacedObjects.Add(networkObjectInstance.GlobalObjectIdHash, networkObjectInstance);
- }
- }
+ IsSpawnedObjectsPendingInDontDestroyOnLoad = true;
}
+
+ var sceneLoad = SceneManager.LoadSceneAsync(sceneName, SceneEventData.LoadSceneMode);
+ sceneLoad.completed += asyncOp2 => OnSceneLoaded(sceneName);
+
+ OnSceneEvent?.Invoke(new SceneEvent()
+ {
+ AsyncOperation = sceneLoad,
+ SceneEventType = SceneEventData.SceneEventType,
+ LoadSceneMode = SceneEventData.LoadSceneMode,
+ SceneName = sceneName,
+ ClientId = m_NetworkManager.LocalClientId
+ });
}
- private void OnSceneLoaded(Guid switchSceneGuid, Stream objectStream)
+
+ ///
+ /// Client and Server:
+ /// Generic on scene loaded callback method to be called upon a scene loading
+ ///
+ private void OnSceneLoaded(string sceneName)
{
- CurrentActiveSceneIndex = SceneNameToIndex[s_NextSceneName];
- var nextScene = SceneManager.GetSceneByName(s_NextSceneName);
- SceneManager.SetActiveScene(nextScene);
+ var nextScene = GetAndAddNewlyLoadedSceneByName(sceneName);
+ if (!nextScene.isLoaded || !nextScene.IsValid())
+ {
+ throw new Exception($"Failed to find valid scene internal Unity.Netcode for {nameof(GameObject)}s error!");
+ }
+
+ if (SceneEventData.LoadSceneMode == LoadSceneMode.Single)
+ {
+ SceneManager.SetActiveScene(nextScene);
+ }
//Get all NetworkObjects loaded by the scene
- PopulateScenePlacedObjects();
+ PopulateScenePlacedObjects(nextScene);
- // Move all objects to the new scene
- MoveObjectsToScene(nextScene);
+ if (SceneEventData.LoadSceneMode == LoadSceneMode.Single)
+ {
+ // Move all objects to the new scene
+ MoveObjectsToScene(nextScene);
+ }
+ // The Condition: While a scene is asynchronously loaded in single loading scene mode, if any new NetworkObjects are spawned
+ // they need to be moved into the do not destroy temporary scene
+ // When it is set: Just before starting the asynchronous loading call
+ // When it is unset: After the scene has loaded, the PopulateScenePlacedObjects is called, and all NetworkObjects in the do
+ // not destroy temporary scene are moved into the active scene
IsSpawnedObjectsPendingInDontDestroyOnLoad = false;
- CurrentSceneIndex = CurrentActiveSceneIndex;
-
if (m_NetworkManager.IsServer)
{
- OnServerLoadedScene(switchSceneGuid);
+ OnServerLoadedScene(nextScene);
}
else
{
- OnClientLoadedScene(switchSceneGuid, objectStream);
+ // For the client, we make a server scene handle to client scene handle look up table
+ if (!ServerSceneHandleToClientSceneHandle.ContainsKey(SceneEventData.SceneHandle))
+ {
+ ServerSceneHandleToClientSceneHandle.Add(SceneEventData.SceneHandle, nextScene.handle);
+ }
+ else
+ {
+ // If the exact same handle exists then there are problems with using handles
+ throw new Exception($"Server Scene Handle ({SceneEventData.SceneHandle}) already exist! Happened during scene load of {nextScene.name} with Client Handle ({nextScene.handle})");
+ }
+
+ OnClientLoadedScene(nextScene);
}
}
- private void OnServerLoadedScene(Guid switchSceneGuid)
+ ///
+ /// Server side:
+ /// On scene loaded callback method invoked by OnSceneLoading only
+ ///
+ private void OnServerLoadedScene(Scene scene)
{
- // Register in-scene placed NetworkObjects with the netcode
- foreach (var keyValuePair in ScenePlacedObjects)
+ // Register in-scene placed NetworkObjects with spawn manager
+ foreach (var keyValuePairByGlobalObjectIdHash in ScenePlacedObjects)
{
- if (!keyValuePair.Value.IsPlayerObject)
+ foreach (var keyValuePairBySceneHandle in keyValuePairByGlobalObjectIdHash.Value)
{
- m_NetworkManager.SpawnManager.SpawnNetworkObjectLocally(keyValuePair.Value, m_NetworkManager.SpawnManager.GetNetworkObjectId(), true, false, null, null, false, true);
+ if (!keyValuePairBySceneHandle.Value.IsPlayerObject)
+ {
+ m_NetworkManager.SpawnManager.SpawnNetworkObjectLocally(keyValuePairBySceneHandle.Value, m_NetworkManager.SpawnManager.GetNetworkObjectId(), true, false, null, null, false, true);
+ }
}
}
+ // Set the server's scene's handle so the client can build a look up table
+ SceneEventData.SceneHandle = scene.handle;
+
+ // Send all clients the scene load event
for (int j = 0; j < m_NetworkManager.ConnectedClientsList.Count; j++)
{
- if (m_NetworkManager.ConnectedClientsList[j].ClientId != m_NetworkManager.ServerClientId)
+ var clientId = m_NetworkManager.ConnectedClientsList[j].ClientId;
+ if (clientId != m_NetworkManager.ServerClientId)
{
- var context = m_NetworkManager.MessageQueueContainer.EnterInternalCommandContext(
- MessageQueueContainer.MessageType.SwitchScene, NetworkChannel.Internal,
- new[] { m_NetworkManager.ConnectedClientsList[j].ClientId }, NetworkUpdateLoop.UpdateStage);
+ var context = m_NetworkManager.MessageQueueContainer.EnterInternalCommandContext(k_MessageType, k_ChannelType, new ulong[] { clientId }, k_NetworkUpdateStage);
if (context != null)
{
+ // Set the target client id that will be used during in scene NetworkObject serialization
+ SceneEventData.TargetClientId = clientId;
+
using (var nonNullContext = (InternalCommandContext)context)
{
- nonNullContext.NetworkWriter.WriteUInt32Packed(CurrentActiveSceneIndex);
- nonNullContext.NetworkWriter.WriteByteArray(switchSceneGuid.ToByteArray());
-
- uint sceneObjectsToSpawn = 0;
-
- foreach (var keyValuePair in ScenePlacedObjects)
- {
- if (keyValuePair.Value.Observers.Contains(m_NetworkManager.ConnectedClientsList[j].ClientId))
- {
- sceneObjectsToSpawn++;
- }
- }
-
- // Write number of scene objects to spawn
- nonNullContext.NetworkWriter.WriteUInt32Packed(sceneObjectsToSpawn);
- foreach (var keyValuePair in ScenePlacedObjects)
- {
- if (keyValuePair.Value.Observers.Contains(m_NetworkManager.ConnectedClientsList[j].ClientId))
- {
- keyValuePair.Value.SerializeSceneObject(nonNullContext.NetworkWriter, m_NetworkManager.ConnectedClientsList[j].ClientId);
- }
- }
+ SceneEventData.OnWrite(nonNullContext.NetworkWriter);
}
}
+ else
+ {
+ throw new Exception($"{nameof(NetworkSceneManager)} failed to send event notification {SceneEventData.SceneEventType} to target clientId {clientId}!");
+ }
}
}
- // Tell server that scene load is completed
- if (m_NetworkManager.IsHost)
+ s_IsSceneEventActive = false;
+
+ //First, notify local server that the scene was loaded
+ OnSceneEvent?.Invoke(new SceneEvent()
+ {
+ SceneEventType = SceneEventData.SceneEventTypes.C2S_LoadComplete,
+ LoadSceneMode = SceneEventData.LoadSceneMode,
+ SceneName = GetSceneNameFromNetcodeSceneIndex(SceneEventData.SceneIndex),
+ ClientId = m_NetworkManager.ServerClientId,
+ Scene = scene,
+ });
+
+ //Second, set the server as having loaded for the associated SceneEventProgress
+ if (SceneEventProgressTracking.ContainsKey(SceneEventData.SceneEventGuid))
{
- OnClientSwitchSceneCompleted(m_NetworkManager.LocalClientId, switchSceneGuid);
+ SceneEventProgressTracking[SceneEventData.SceneEventGuid].AddClientAsDone(m_NetworkManager.ServerClientId);
}
+ }
- s_IsSwitching = false;
+ ///
+ /// Client side:
+ /// On scene loaded callback method invoked by OnSceneLoading only
+ ///
+ private void OnClientLoadedScene(Scene scene)
+ {
+ SceneEventData.DeserializeScenePlacedObjects();
+
+ SceneEventData.SceneEventType = SceneEventData.SceneEventTypes.C2S_LoadComplete;
+ SendSceneEventData(new ulong[] { m_NetworkManager.ServerClientId });
+ s_IsSceneEventActive = false;
- OnSceneSwitched?.Invoke();
+ // Notify local client that the scene was loaded
+ OnSceneEvent?.Invoke(new SceneEvent()
+ {
+ SceneEventType = SceneEventData.SceneEventTypes.C2S_LoadComplete,
+ LoadSceneMode = SceneEventData.LoadSceneMode,
+ SceneName = GetSceneNameFromNetcodeSceneIndex(SceneEventData.SceneIndex),
+ ClientId = m_NetworkManager.LocalClientId,
+ Scene = scene,
+ });
}
- private void OnClientLoadedScene(Guid switchSceneGuid, Stream objectStream)
+ ///
+ /// Server Side:
+ /// This is used for players that have just had their connection approved and will assure they are synchronized
+ /// properly if they are late joining
+ /// Note: We write out all of the scenes to be loaded first and then all of the NetworkObjects that need to be
+ /// synchronized.
+ ///
+ /// newly joined client identifier
+ internal void SynchronizeNetworkObjects(ulong clientId)
{
- var networkObjects = UnityEngine.Object.FindObjectsOfType();
+ // Update the clients
+ m_NetworkManager.SpawnManager.UpdateObservedNetworkObjects(clientId);
+
+ ClientSynchEventData.InitializeForSynch();
+ ClientSynchEventData.TargetClientId = clientId;
+ ClientSynchEventData.LoadSceneMode = LoadSceneMode.Single;
+ var activeScene = SceneManager.GetActiveScene();
+ ClientSynchEventData.SceneEventType = SceneEventData.SceneEventTypes.S2C_Sync;
- using (var reader = PooledNetworkReader.Get(objectStream))
+ // Organize how (and when) we serialize our NetworkObjects
+ for (int i = 0; i < SceneManager.sceneCount; i++)
{
- var newObjectsCount = reader.ReadUInt32Packed();
+ var scene = SceneManager.GetSceneAt(i);
- for (int i = 0; i < newObjectsCount; i++)
+ var sceneIndex = GetNetcodeSceneIndexFromScene(scene);
+
+ if (sceneIndex == uint.MaxValue)
{
- NetworkObject.DeserializeSceneObject(objectStream as NetworkBuffer, reader, m_NetworkManager);
+ continue;
}
+ // This would depend upon whether we are additive or not
+ // If we are the base scene, then we set the root scene index;
+ if (activeScene == scene)
+ {
+ ClientSynchEventData.SceneIndex = sceneIndex;
+ ClientSynchEventData.SceneHandle = scene.handle;
+ }
+
+ ClientSynchEventData.AddSceneToSynchronize(sceneIndex, scene.handle);
}
- var context = m_NetworkManager.MessageQueueContainer.EnterInternalCommandContext(
- MessageQueueContainer.MessageType.ClientSwitchSceneCompleted, NetworkChannel.Internal,
- new[] { m_NetworkManager.ServerClientId }, NetworkUpdateLoop.UpdateStage);
+ ClientSynchEventData.AddSpawnedNetworkObjects();
+
+ var context = m_NetworkManager.MessageQueueContainer.EnterInternalCommandContext(k_MessageType, k_ChannelType, new ulong[] { clientId }, k_NetworkUpdateStage);
if (context != null)
{
using (var nonNullContext = (InternalCommandContext)context)
{
- nonNullContext.NetworkWriter.WriteByteArray(switchSceneGuid.ToByteArray());
+ ClientSynchEventData.OnWrite(nonNullContext.NetworkWriter);
}
}
- s_IsSwitching = false;
-
- OnSceneSwitched?.Invoke();
+ // Notify the local server that the client has been sent the SceneEventData.SceneEventTypes.S2C_Event_Sync event
+ OnSceneEvent?.Invoke(new SceneEvent()
+ {
+ SceneEventType = SceneEventData.SceneEventType,
+ ClientId = clientId
+ });
}
- internal bool HasSceneMismatch(uint sceneIndex) => SceneManager.GetActiveScene().name != SceneIndexToString[sceneIndex];
-
- // Called on server
- internal void OnClientSwitchSceneCompleted(ulong clientId, Guid switchSceneGuid)
+ ///
+ /// This is called when the client receives the SCENE_EVENT of type SceneEventData.SceneEventTypes.SYNC
+ /// Note: This can recurse one additional time by the client if the current scene loaded by the client
+ /// is already loaded.
+ ///
+ private void OnClientBeginSync()
{
- if (switchSceneGuid == Guid.Empty)
+ var sceneIndex = SceneEventData.GetNextSceneSynchronizationIndex();
+ var sceneHandle = SceneEventData.GetNextSceneSynchronizationHandle();
+ if (!SceneIndexToString.TryGetValue(sceneIndex, out string sceneName) || !RegisteredSceneNames.Contains(sceneName))
{
- // If Guid is empty it means the client has loaded the start scene of the server and the server would never have a switchSceneProgresses created for the start scene.
+ if (NetworkLog.CurrentLogLevel <= LogLevel.Normal)
+ {
+ NetworkLog.LogWarning("Server requested a scene switch to a non-registered scene");
+ }
+
return;
}
- if (SceneSwitchProgresses.TryGetValue(switchSceneGuid, out SceneSwitchProgress progress))
+ var activeScene = SceneManager.GetActiveScene();
+ var loadSceneMode = sceneIndex == SceneEventData.SceneIndex ? SceneEventData.LoadSceneMode : LoadSceneMode.Additive;
+
+ // If this is the beginning of the synchronization event, then send client a notification that synchronization has begun
+ if (sceneIndex == SceneEventData.SceneIndex)
+ {
+ OnSceneEvent?.Invoke(new SceneEvent()
+ {
+ SceneEventType = SceneEventData.SceneEventTypes.S2C_Sync,
+ ClientId = m_NetworkManager.LocalClientId,
+ });
+
+ // Clear the in-scene placed NetworkObjects when we load the first scene in our synchronization process
+ ScenePlacedObjects.Clear();
+ }
+
+ // Check to see if the client already has loaded the scene to be loaded
+ if (sceneName != activeScene.name)
+ {
+ // If not, then load the scene
+ var sceneLoad = SceneManager.LoadSceneAsync(sceneName, loadSceneMode);
+
+ // Notify local client that a scene load has begun
+ OnSceneEvent?.Invoke(new SceneEvent()
+ {
+ AsyncOperation = sceneLoad,
+ SceneEventType = SceneEventData.SceneEventTypes.S2C_Load,
+ LoadSceneMode = loadSceneMode,
+ SceneName = sceneName,
+ ClientId = m_NetworkManager.LocalClientId,
+ });
+
+ sceneLoad.completed += asyncOp2 => ClientLoadedSynchronization(sceneIndex, sceneHandle);
+ }
+ else
+ {
+ // If so, then pass through
+ ClientLoadedSynchronization(sceneIndex, sceneHandle);
+ }
+ }
+
+ ///
+ /// Once a scene is loaded ( or if it was already loaded) this gets called.
+ /// This handles all of the in-scene and dynamically spawned NetworkObject synchronization
+ ///
+ /// Netcode scene index that was loaded
+ private void ClientLoadedSynchronization(uint sceneIndex, int sceneHandle)
+ {
+ var sceneName = GetSceneNameFromNetcodeSceneIndex(sceneIndex);
+ var nextScene = GetAndAddNewlyLoadedSceneByName(sceneName);
+
+ if (!nextScene.isLoaded || !nextScene.IsValid())
+ {
+ throw new Exception($"Failed to find valid scene internal Unity.Netcode for {nameof(GameObject)}s error!");
+ }
+
+ var loadSceneMode = (sceneIndex == SceneEventData.SceneIndex ? SceneEventData.LoadSceneMode : LoadSceneMode.Additive);
+
+ // For now, during a synchronization event, we will make the first scene the "base/master" scene that denotes a "complete scene switch"
+ if (loadSceneMode == LoadSceneMode.Single)
+ {
+ SceneManager.SetActiveScene(nextScene);
+ }
+
+ if (!ServerSceneHandleToClientSceneHandle.ContainsKey(sceneHandle))
+ {
+ ServerSceneHandleToClientSceneHandle.Add(sceneHandle, nextScene.handle);
+ }
+ else
+ {
+ // If the exact same handle exists then there are problems with using handles
+ throw new Exception($"Server Scene Handle ({SceneEventData.SceneHandle}) already exist! Happened during scene load of {nextScene.name} with Client Handle ({nextScene.handle})");
+ }
+
+ // Apply all in-scene placed NetworkObjects loaded by the scene
+ PopulateScenePlacedObjects(nextScene, false);
+
+ // Send notification back to server that we finished loading this scene
+ ClientSynchEventData.LoadSceneMode = loadSceneMode;
+ ClientSynchEventData.SceneEventType = SceneEventData.SceneEventTypes.C2S_LoadComplete;
+ ClientSynchEventData.SceneIndex = sceneIndex;
+
+ var context = m_NetworkManager.MessageQueueContainer.EnterInternalCommandContext(k_MessageType, k_ChannelType,
+ new ulong[] { m_NetworkManager.ServerClientId }, k_NetworkUpdateStage);
+ if (context != null)
+ {
+ using (var nonNullContext = (InternalCommandContext)context)
+ {
+ ClientSynchEventData.OnWrite(nonNullContext.NetworkWriter);
+ }
+ }
+
+ // Send notification to local client that the scene has finished loading
+ OnSceneEvent?.Invoke(new SceneEvent()
+ {
+ SceneEventType = SceneEventData.SceneEventTypes.C2S_LoadComplete,
+ LoadSceneMode = loadSceneMode,
+ SceneName = sceneName,
+ Scene = nextScene,
+ ClientId = m_NetworkManager.LocalClientId,
+ });
+
+ // Check to see if we still have scenes to load and synchronize with
+ HandleClientSceneEvent(null);
+ }
+
+ ///
+ /// Client Side:
+ /// Handles incoming Scene_Event messages for clients
+ ///
+ /// data associated with the event
+ private void HandleClientSceneEvent(Stream stream)
+ {
+ switch (SceneEventData.SceneEventType)
{
- SceneSwitchProgresses[switchSceneGuid].AddClientAsDone(clientId);
+ case SceneEventData.SceneEventTypes.S2C_Load:
+ {
+ OnClientSceneLoadingEvent(stream);
+ break;
+ }
+ case SceneEventData.SceneEventTypes.S2C_Unload:
+ {
+ OnClientUnloadScene();
+ break;
+ }
+ case SceneEventData.SceneEventTypes.S2C_Sync:
+ {
+ if (!SceneEventData.IsDoneWithSynchronization())
+ {
+ OnClientBeginSync();
+ }
+ else
+ {
+ // Synchronize the NetworkObjects for this scene
+ SceneEventData.SynchronizeSceneNetworkObjects(m_NetworkManager);
+
+ SceneEventData.SceneEventType = SceneEventData.SceneEventTypes.C2S_SyncComplete;
+ SendSceneEventData(new ulong[] { m_NetworkManager.ServerClientId });
+
+ // All scenes are synchronized, let the server know we are done synchronizing
+ m_NetworkManager.IsConnectedClient = true;
+ m_NetworkManager.InvokeOnClientConnectedCallback(m_NetworkManager.LocalClientId);
+
+ // Notify the client that they have finished synchronizing
+ OnSceneEvent?.Invoke(new SceneEvent()
+ {
+ SceneEventType = SceneEventData.SceneEventType,
+ ClientId = m_NetworkManager.LocalClientId, // Client sent this to the server
+ });
+ }
+ break;
+ }
+ case SceneEventData.SceneEventTypes.S2C_ReSync:
+ {
+ // Notify the client that they have been re-synchronized after being synchronized with an in progress game session
+ OnSceneEvent?.Invoke(new SceneEvent()
+ {
+ SceneEventType = SceneEventData.SceneEventType,
+ ClientId = m_NetworkManager.ServerClientId, // Server sent this to client
+ });
+
+ break;
+ }
+ case SceneEventData.SceneEventTypes.S2C_LoadComplete:
+ case SceneEventData.SceneEventTypes.S2C_UnLoadComplete:
+ {
+ // Notify client that all clients have finished loading or unloading
+ OnSceneEvent?.Invoke(new SceneEvent()
+ {
+ SceneEventType = SceneEventData.SceneEventType,
+ SceneName = GetSceneNameFromNetcodeSceneIndex(SceneEventData.SceneIndex),
+ ClientId = m_NetworkManager.ServerClientId,
+ LoadSceneMode = SceneEventData.LoadSceneMode,
+ ClientsThatCompleted = SceneEventData.ClientsCompleted,
+ ClientsThatTimedOut = SceneEventData.ClientsTimedOut,
+ });
+ break;
+ }
+ default:
+ {
+ Debug.LogWarning($"{SceneEventData.SceneEventType} is not currently supported!");
+ break;
+ }
}
}
+ ///
+ /// Server Side:
+ /// Handles incoming Scene_Event messages for host or server
+ ///
+ /// client who sent the event
+ /// data associated with the event
+ private void HandleServerSceneEvent(ulong clientId, Stream stream)
+ {
+ switch (SceneEventData.SceneEventType)
+ {
+ case SceneEventData.SceneEventTypes.C2S_LoadComplete:
+ {
+ // Notify the local server that the client has finished loading a scene
+ OnSceneEvent?.Invoke(new SceneEvent()
+ {
+ SceneEventType = SceneEventData.SceneEventType,
+ LoadSceneMode = SceneEventData.LoadSceneMode,
+ SceneName = GetSceneNameFromNetcodeSceneIndex(SceneEventData.SceneIndex),
+ ClientId = clientId
+ });
+
+ if (SceneEventProgressTracking.ContainsKey(SceneEventData.SceneEventGuid))
+ {
+ SceneEventProgressTracking[SceneEventData.SceneEventGuid].AddClientAsDone(clientId);
+ }
+
+ break;
+ }
+ case SceneEventData.SceneEventTypes.C2S_UnloadComplete:
+ {
+ if (SceneEventProgressTracking.ContainsKey(SceneEventData.SceneEventGuid))
+ {
+ SceneEventProgressTracking[SceneEventData.SceneEventGuid].AddClientAsDone(clientId);
+ }
+ // Notify the local server that the client has finished unloading a scene
+ OnSceneEvent?.Invoke(new SceneEvent()
+ {
+ SceneEventType = SceneEventData.SceneEventType,
+ LoadSceneMode = SceneEventData.LoadSceneMode,
+ SceneName = GetSceneNameFromNetcodeSceneIndex(SceneEventData.SceneIndex),
+ ClientId = clientId
+ });
- internal void RemoveClientFromSceneSwitchProgresses(ulong clientId)
+ break;
+ }
+ case SceneEventData.SceneEventTypes.C2S_SyncComplete:
+ {
+ // Notify the local server that a client has finished synchronizing
+ OnSceneEvent?.Invoke(new SceneEvent()
+ {
+ SceneEventType = SceneEventData.SceneEventType,
+ SceneName = string.Empty,
+ ClientId = clientId
+ });
+
+ if (SceneEventData.ClientNeedsReSynchronization() && !DisableReSynchronization)
+ {
+ SceneEventData.SceneEventType = SceneEventData.SceneEventTypes.S2C_ReSync;
+ SendSceneEventData(new ulong[] { clientId });
+
+ OnSceneEvent?.Invoke(new SceneEvent()
+ {
+ SceneEventType = SceneEventData.SceneEventType,
+ SceneName = string.Empty,
+ ClientId = clientId
+ });
+ }
+
+ break;
+ }
+ default:
+ {
+ Debug.LogWarning($"{SceneEventData.SceneEventType} is not currently supported!");
+ break;
+ }
+ }
+ }
+
+ ///
+ /// Both Client and Server: Incoming scene event entry point
+ ///
+ /// client who sent the scene event
+ /// data associated with the scene event
+ internal void HandleSceneEvent(ulong clientId, Stream stream)
{
- foreach (var switchSceneProgress in SceneSwitchProgresses.Values)
+ if (m_NetworkManager != null)
+ {
+ if (stream != null)
+ {
+ var reader = NetworkReaderPool.GetReader(stream);
+ SceneEventData.OnRead(reader);
+ NetworkReaderPool.PutBackInPool(reader);
+ if (SceneEventData.IsSceneEventClientSide())
+ {
+ HandleClientSceneEvent(stream);
+ }
+ else
+ {
+ HandleServerSceneEvent(clientId, stream);
+ }
+ }
+ else
+ {
+ Debug.LogError($"Scene Event {nameof(OnClientSceneLoadingEvent)} was invoked with a null stream!");
+ return;
+ }
+ }
+ else
{
- switchSceneProgress.RemoveClientAsDone(clientId);
+ Debug.LogError($"{nameof(NetworkSceneManager.HandleSceneEvent)} was invoked but {nameof(NetworkManager)} reference was null!");
}
}
+ ///
+ /// Moves all NetworkObjects that don't have the set to
+ /// the "Do not destroy on load" scene.
+ ///
private void MoveObjectsToDontDestroyOnLoad()
{
// Move ALL NetworkObjects to the temp scene
- var objectsToKeep = m_NetworkManager.SpawnManager.SpawnedObjectsList;
+ var objectsToKeep = new HashSet(m_NetworkManager.SpawnManager.SpawnedObjectsList);
foreach (var sobj in objectsToKeep)
{
- //In case an object has been set as a child of another object it has to be unchilded in order to be moved from one scene to another.
+ //In case an object has been set as a child of another object it has to be removed from the parent in order to be moved from one scene to another.
if (sobj.gameObject.transform.parent != null)
{
sobj.gameObject.transform.parent = null;
}
- UnityEngine.Object.DontDestroyOnLoad(sobj.gameObject);
+ if (!sobj.DestroyWithScene)
+ {
+ UnityEngine.Object.DontDestroyOnLoad(sobj.gameObject);
+ }
+ else if (m_NetworkManager.IsServer)
+ {
+ sobj.Despawn(true);
+ }
}
}
+ ///
+ /// Should be invoked on both the client and server side after:
+ /// -- A new scene has been loaded
+ /// -- Before any "DontDestroyOnLoad" NetworkObjects have been added back into the scene.
+ /// Added the ability to choose not to clear the scene placed objects for additive scene loading.
+ /// We organize our ScenePlacedObjects by:
+ /// [GlobalObjectIdHash][SceneHandle][NetworkObject]
+ /// Using the local scene relative Scene.handle as a sub-key to the root dictionary allows us to
+ /// distinguish between duplicate in-scene placed NetworkObjects
+ ///
+ private void PopulateScenePlacedObjects(Scene sceneToFilterBy, bool clearScenePlacedObjects = true)
+ {
+ if (clearScenePlacedObjects)
+ {
+ ScenePlacedObjects.Clear();
+ }
+
+ var networkObjects = UnityEngine.Object.FindObjectsOfType();
+
+ // Just add every NetworkObject found that isn't already in the list
+ // With additive scenes, we can have multiple in-scene placed NetworkObjects with the same GlobalObjectIdHash value
+ // During Client Side Synchronization: We add them on a FIFO basis, for each scene loaded without clearing, and then
+ // at the end of scene loading we use this list to soft synchronize all in-scene placed NetworkObjects
+ foreach (var networkObjectInstance in networkObjects)
+ {
+ // We check to make sure the NetworkManager instance is the same one to be "MultiInstanceHelpers" compatible and filter the list on a per scene basis (additive scenes)
+ if (networkObjectInstance.IsSceneObject == null && networkObjectInstance.NetworkManager == m_NetworkManager && networkObjectInstance.gameObject.scene == sceneToFilterBy &&
+ networkObjectInstance.gameObject.scene.handle == sceneToFilterBy.handle)
+ {
+ if (!ScenePlacedObjects.ContainsKey(networkObjectInstance.GlobalObjectIdHash))
+ {
+ ScenePlacedObjects.Add(networkObjectInstance.GlobalObjectIdHash, new Dictionary());
+ }
+
+ if (!ScenePlacedObjects[networkObjectInstance.GlobalObjectIdHash].ContainsKey(networkObjectInstance.gameObject.scene.handle))
+ {
+ ScenePlacedObjects[networkObjectInstance.GlobalObjectIdHash].Add(networkObjectInstance.gameObject.scene.handle, networkObjectInstance);
+ }
+ else
+ {
+ var exitingEntryName = ScenePlacedObjects[networkObjectInstance.GlobalObjectIdHash][networkObjectInstance.gameObject.scene.handle] != null ?
+ ScenePlacedObjects[networkObjectInstance.GlobalObjectIdHash][networkObjectInstance.gameObject.scene.handle].name : "Null Entry";
+ throw new Exception($"{networkObjectInstance.name} tried to registered with {nameof(ScenePlacedObjects)} which already contains " +
+ $"the same {nameof(NetworkObject.GlobalObjectIdHash)} value {networkObjectInstance.GlobalObjectIdHash} for {exitingEntryName}!");
+ }
+ }
+ }
+ }
+
+ ///
+ /// Moves all spawned NetworkObjects (from do not destroy on load) to the scene specified
+ ///
+ /// scene to move the NetworkObjects to
private void MoveObjectsToScene(Scene scene)
{
// Move ALL NetworkObjects to the temp scene
@@ -473,7 +1344,7 @@ private void MoveObjectsToScene(Scene scene)
foreach (var sobj in objectsToKeep)
{
- //In case an object has been set as a child of another object it has to be unchilded in order to be moved from one scene to another.
+ //In case an object has been set as a child of another object it has to be removed from the parent in order to be moved from one scene to another.
if (sobj.gameObject.transform.parent != null)
{
sobj.gameObject.transform.parent = null;
@@ -482,10 +1353,5 @@ private void MoveObjectsToScene(Scene scene)
SceneManager.MoveGameObjectToScene(sobj.gameObject, scene);
}
}
-
- internal void AllClientsReady(ulong[] clientIds, ulong[] timedOutClientIds)
- {
- OnNotifyClientAllClientsLoadedScene?.Invoke(clientIds, timedOutClientIds);
- }
}
}
diff --git a/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs b/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs
new file mode 100644
index 0000000000..2144dfc79d
--- /dev/null
+++ b/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs
@@ -0,0 +1,766 @@
+using System.Collections.Generic;
+using System;
+using System.Linq;
+using UnityEngine;
+using UnityEngine.SceneManagement;
+
+
+namespace Unity.Netcode
+{
+ ///
+ /// Used by for messages
+ /// Note: This is only when is enabled
+ ///
+ public class SceneEventData : IDisposable
+ {
+ ///
+ /// The different types of scene events communicated between a server and client.
+ /// Scene event types can be:
+ /// A Server To Client Event (S2C)
+ /// A Client to Server Event (C2S)
+ ///
+ public enum SceneEventTypes
+ {
+ ///
+ /// Load a scene
+ /// Invocation: Server Side
+ /// Message Flow: Server to client
+ /// Event Notification: Both server and client are notified a load scene event started
+ ///
+ S2C_Load,
+ ///
+ /// Unload a scene
+ /// Invocation: Server Side
+ /// Message Flow: Server to client
+ /// Event Notification: Both server and client are notified an unload scene event started
+ ///
+ S2C_Unload,
+ ///
+ /// Synchronize current game session state for approved clients
+ /// Invocation: Server Side
+ /// Message Flow: Server to client
+ /// Event Notification: Server and Client receives a local notification (server receives the ClientId being synchronized)
+ ///
+ S2C_Sync,
+ ///
+ /// Game session re-synchronization of NetworkOjects that were destroyed during a event
+ /// Invocation: Server Side
+ /// Message Flow: Server to client
+ /// Event Notification: Both server and client receive a local notification
+ ///
+ S2C_ReSync,
+ ///
+ /// All clients have finished loading a scene
+ /// Invocation: Server Side
+ /// Message Flow: Server to Client
+ /// Event Notification: Both server and client receive a local notification containing the clients that finished
+ /// as well as the clients that timed out (if any).
+ ///
+ S2C_LoadComplete,
+ ///
+ /// All clients have unloaded a scene
+ /// Invocation: Server Side
+ /// Message Flow: Server to Client
+ /// Event Notification: Both server and client receive a local notification containing the clients that finished
+ /// as well as the clients that timed out (if any).
+ ///
+ S2C_UnLoadComplete,
+ ///
+ /// A client has finished loading a scene
+ /// Invocation: Client Side
+ /// Message Flow: Client to Server
+ /// Event Notification: Both server and client receive a local notification
+ ///
+ C2S_LoadComplete,
+ ///
+ /// A client has finished unloading a scene
+ /// Invocation: Client Side
+ /// Message Flow: Client to Server
+ /// Event Notification: Both server and client receive a local notification
+ ///
+ C2S_UnloadComplete,
+ ///
+ /// A client has finished synchronizing from a event
+ /// Invocation: Client Side
+ /// Message Flow: Client to Server
+ /// Event Notification: Both server and client receive a local notification
+ ///
+ C2S_SyncComplete,
+ }
+
+ internal SceneEventTypes SceneEventType;
+ internal LoadSceneMode LoadSceneMode;
+ internal Guid SceneEventGuid;
+
+ internal uint SceneIndex;
+ internal int SceneHandle;
+
+ /// Only used for S2C_Synch scene events, this assures permissions when writing
+ /// NetworkVariable information. If that process changes, then we need to update
+ /// this
+ internal ulong TargetClientId;
+
+ private Dictionary> m_SceneNetworkObjects;
+ private Dictionary m_SceneNetworkObjectDataOffsets;
+
+ ///
+ /// Client or Server Side:
+ /// Client side: Generates a list of all NetworkObjects by their NetworkObjectId that was spawned during th synchronization process
+ /// Server side: Compares list from client to make sure client didn't drop a message about a NetworkObject being despawned while it
+ /// was synchronizing (if so server will send another message back to the client informing the client of NetworkObjects to remove)
+ /// spawned during an initial synchronization.
+ ///
+ private List m_NetworkObjectsSync = new List();
+
+ ///
+ /// Server Side Re-Synchronization:
+ /// If there happens to be NetworkObjects in the final Event_Sync_Complete message that are no longer spawned,
+ /// the server will compile a list and send back an Event_ReSync message to the client.
+ ///
+ private List m_NetworkObjectsToBeRemoved = new List();
+
+ internal PooledNetworkBuffer InternalBuffer;
+
+ private NetworkManager m_NetworkManager;
+
+ ///
+ /// Client side and only applies to the following scene event types:
+ ///
+ ///
+ ///
+ internal SceneEvent SceneEvent;
+
+ internal List ClientsCompleted;
+ internal List ClientsTimedOut;
+
+ internal Queue ScenesToSynchronize;
+ internal Queue SceneHandlesToSynchronize;
+
+
+ ///
+ /// Server Side:
+ /// Add a scene and its handle to the list of scenes the client should load before synchronizing
+ /// Since scene handles are not the same per instance, the client builds a server scene handle to
+ /// client scene handle lookup table.
+ /// Why include the scene handle? In order to support loading of the same additive scene more than once
+ /// we must distinguish which scene we are talking about when the server tells the client to unload a scene.
+ /// The server will always communicate its local relative scene's handle and the client will determine its
+ /// local relative handle from the table being built.
+ /// Look for usage to see where
+ /// entries are being added to or removed from the table
+ ///
+ ///
+ ///
+ internal void AddSceneToSynchronize(uint sceneIndex, int sceneHandle)
+ {
+ ScenesToSynchronize.Enqueue(sceneIndex);
+ SceneHandlesToSynchronize.Enqueue((uint)sceneHandle);
+ }
+
+ ///
+ /// Client Side:
+ /// Gets the next scene index to be loaded for approval and/or late joining
+ ///
+ ///
+ internal uint GetNextSceneSynchronizationIndex()
+ {
+ return ScenesToSynchronize.Dequeue();
+ }
+
+ ///
+ /// Client Side:
+ /// Gets the next scene handle to be loaded for approval and/or late joining
+ ///
+ ///
+ internal int GetNextSceneSynchronizationHandle()
+ {
+ return (int)SceneHandlesToSynchronize.Dequeue();
+ }
+
+ ///
+ /// Client Side:
+ /// Determines if all scenes have been processed during the synchronization process
+ ///
+ /// true/false
+ internal bool IsDoneWithSynchronization()
+ {
+ if (ScenesToSynchronize.Count == 0 && SceneHandlesToSynchronize.Count == 0)
+ {
+ return true;
+ }
+ else if (ScenesToSynchronize.Count != SceneHandlesToSynchronize.Count)
+ {
+ // This should never happen, but in the event it does...
+ throw new Exception($"[{nameof(SceneEventData)}-Internal Mismatch Error] {nameof(ScenesToSynchronize)} count != {nameof(SceneHandlesToSynchronize)} count!");
+ }
+ return false;
+ }
+
+ ///
+ /// Server Side:
+ /// Called just before the synchronization process
+ ///
+ internal void InitializeForSynch()
+ {
+ if (m_SceneNetworkObjects == null)
+ {
+ m_SceneNetworkObjects = new Dictionary>();
+ }
+ else
+ {
+ m_SceneNetworkObjects.Clear();
+ }
+
+ if (ScenesToSynchronize == null)
+ {
+ ScenesToSynchronize = new Queue();
+ }
+ else
+ {
+ ScenesToSynchronize.Clear();
+ }
+
+ if (SceneHandlesToSynchronize == null)
+ {
+ SceneHandlesToSynchronize = new Queue();
+ }
+ else
+ {
+ SceneHandlesToSynchronize.Clear();
+ }
+ }
+
+ internal void AddSpawnedNetworkObjects()
+ {
+ m_NetworkObjectsSync = m_NetworkManager.SpawnManager.SpawnedObjectsList.ToList();
+ m_NetworkObjectsSync.Sort(SortNetworkObjects);
+ }
+
+ ///
+ /// Server Side:
+ /// Used during the synchronization process to associate NetworkObjects with scenes
+ ///
+ ///
+ ///
+ internal void AddNetworkObjectForSynch(uint sceneIndex, NetworkObject networkObject)
+ {
+ if (!m_SceneNetworkObjects.ContainsKey(sceneIndex))
+ {
+ m_SceneNetworkObjects.Add(sceneIndex, new List());
+ }
+
+ m_SceneNetworkObjects[sceneIndex].Add(networkObject);
+ }
+
+ ///
+ /// Client and Server:
+ /// Determines if the scene event type was intended for the client ( or server )
+ ///
+ /// true (client should handle this message) false (server should handle this message)
+ internal bool IsSceneEventClientSide()
+ {
+ switch (SceneEventType)
+ {
+ case SceneEventTypes.S2C_Load:
+ case SceneEventTypes.S2C_Unload:
+ case SceneEventTypes.S2C_Sync:
+ case SceneEventTypes.S2C_ReSync:
+ case SceneEventTypes.S2C_LoadComplete:
+ case SceneEventTypes.S2C_UnLoadComplete:
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ ///
+ /// Server Side:
+ /// Sorts the NetworkObjects to assure proper instantiation order of operations for
+ /// registered INetworkPrefabInstanceHandler implementations
+ ///
+ ///
+ ///
+ ///
+ private int SortNetworkObjects(NetworkObject first, NetworkObject second)
+ {
+ var doesFirstHaveHandler = m_NetworkManager.PrefabHandler.ContainsHandler(first);
+ var doesSecondHaveHandler = m_NetworkManager.PrefabHandler.ContainsHandler(second);
+ if (doesFirstHaveHandler != doesSecondHaveHandler)
+ {
+ if (doesFirstHaveHandler)
+ {
+ return 1;
+ }
+ else
+ {
+ return -1;
+ }
+ }
+ return 0;
+ }
+
+ ///
+ /// Client and Server Side:
+ /// Serializes data based on the SceneEvent type ()
+ ///
+ /// to write the scene event data
+ internal void OnWrite(NetworkWriter writer)
+ {
+ // Write the scene event type
+ writer.WriteByte((byte)SceneEventType);
+
+ // Write the scene loading mode
+ writer.WriteByte((byte)LoadSceneMode);
+
+ // Write the scene event progress Guid
+ if (SceneEventType != SceneEventTypes.S2C_Sync)
+ {
+ writer.WriteByteArray(SceneEventGuid.ToByteArray());
+ }
+
+ // Write the scene index and handle
+ writer.WriteUInt32Packed(SceneIndex);
+ writer.WriteInt32Packed(SceneHandle);
+
+ switch (SceneEventType)
+ {
+ case SceneEventTypes.S2C_Sync:
+ {
+ WriteSceneSynchronizationData(writer);
+ break;
+ }
+ case SceneEventTypes.S2C_Load:
+ {
+ SerializeScenePlacedObjects(writer);
+ break;
+ }
+ case SceneEventTypes.C2S_SyncComplete:
+ {
+ WriteClientSynchronizationResults(writer);
+ break;
+ }
+ case SceneEventTypes.S2C_ReSync:
+ {
+ WriteClientReSynchronizationData(writer);
+ break;
+ }
+ case SceneEventTypes.S2C_LoadComplete:
+ case SceneEventTypes.S2C_UnLoadComplete:
+ {
+ WriteSceneEventProgressDone(writer);
+ break;
+ }
+ }
+ }
+
+ ///
+ /// Server Side:
+ /// Called at the end of an S2C_Load event once the scene is loaded and scene placed NetworkObjects
+ /// have been locally spawned
+ ///
+ internal void WriteSceneSynchronizationData(NetworkWriter writer)
+ {
+ // Write the scenes we want to load, in the order we want to load them
+ writer.WriteUIntArrayPacked(ScenesToSynchronize.ToArray());
+ writer.WriteUIntArrayPacked(SceneHandlesToSynchronize.ToArray());
+
+ // Store our current position in the stream to come back and say how much data we have written
+ var positionStart = writer.GetStream().Position;
+
+ // Size Place Holder -- Start
+ // !!NOTE!!: Since this is a placeholder to be set after we know how much we have written,
+ // for stream offset purposes this MUST not be a packed value!
+ writer.WriteUInt32(0);
+ var totalBytes = 0;
+
+ // Write the number of NetworkObjects we are serializing
+ writer.WriteInt32Packed(m_NetworkObjectsSync.Count());
+
+ foreach (var networkObject in m_NetworkObjectsSync)
+ {
+ var noStart = writer.GetStream().Position;
+ writer.WriteInt32Packed(networkObject.gameObject.scene.handle);
+ networkObject.SerializeSceneObject(writer, TargetClientId);
+ var noStop = writer.GetStream().Position;
+ totalBytes += (int)(noStop - noStart);
+ }
+
+ // Size Place Holder -- End
+ var positionEnd = writer.GetStream().Position;
+ var bytesWritten = (uint)(positionEnd - (positionStart + sizeof(uint)));
+ writer.GetStream().Position = positionStart;
+ // Write the total size written to the stream by NetworkObjects being serialized
+ writer.WriteUInt32(bytesWritten);
+ writer.GetStream().Position = positionEnd;
+ }
+
+ ///
+ /// Server Side:
+ /// Called at the end of an S2C_Load event once the scene is loaded and scene placed NetworkObjects
+ /// have been locally spawned
+ /// Maximum number of objects that could theoretically be synchronized is 65536
+ ///
+ internal void SerializeScenePlacedObjects(NetworkWriter writer)
+ {
+ var numberOfObjects = (ushort)0;
+ var stream = writer.GetStream();
+ var headPosition = stream.Position;
+
+ // Write our count place holder (must not be packed!)
+ writer.WriteUInt16(0);
+
+ foreach (var keyValuePairByGlobalObjectIdHash in m_NetworkManager.SceneManager.ScenePlacedObjects)
+ {
+ foreach (var keyValuePairBySceneHandle in keyValuePairByGlobalObjectIdHash.Value)
+ {
+ if (keyValuePairBySceneHandle.Value.Observers.Contains(TargetClientId))
+ {
+ // Write our server relative scene handle for the NetworkObject being serialized
+ writer.WriteInt32Packed(keyValuePairBySceneHandle.Key);
+ // Serialize the NetworkObject
+ keyValuePairBySceneHandle.Value.SerializeSceneObject(writer, TargetClientId);
+ numberOfObjects++;
+ }
+ }
+ }
+
+ var tailPosition = stream.Position;
+ // Reposition to our count position to the head before we wrote our object count
+ stream.Position = headPosition;
+ // Write number of NetworkObjects serialized (must not be packed!)
+ writer.WriteUInt16(numberOfObjects);
+ // Set our position back to the tail
+ stream.Position = tailPosition;
+ }
+
+ ///
+ /// Client and Server Side:
+ /// Deserialize data based on the SceneEvent type.
+ ///
+ ///
+ internal void OnRead(NetworkReader reader)
+ {
+ var sceneEventTypeValue = reader.ReadByte();
+
+ if (Enum.IsDefined(typeof(SceneEventTypes), sceneEventTypeValue))
+ {
+ SceneEventType = (SceneEventTypes)sceneEventTypeValue;
+ }
+ else
+ {
+ Debug.LogError($"Serialization Read Error: {nameof(SceneEventType)} vale {sceneEventTypeValue} is not within the range of the defined {nameof(SceneEventTypes)} enumerator!");
+ }
+
+ var loadSceneModeValue = reader.ReadByte();
+
+ if (Enum.IsDefined(typeof(LoadSceneMode), loadSceneModeValue))
+ {
+ LoadSceneMode = (LoadSceneMode)loadSceneModeValue;
+ }
+ else
+ {
+ Debug.LogError($"Serialization Read Error: {nameof(LoadSceneMode)} vale {loadSceneModeValue} is not within the range of the defined {nameof(LoadSceneMode)} enumerator!");
+ }
+
+ if (SceneEventType != SceneEventTypes.S2C_Sync)
+ {
+ SceneEventGuid = new Guid(reader.ReadByteArray());
+ }
+
+ SceneIndex = reader.ReadUInt32Packed();
+ SceneHandle = reader.ReadInt32Packed();
+
+ switch (SceneEventType)
+ {
+ case SceneEventTypes.S2C_Sync:
+ {
+ CopySceneSyncrhonizationData(reader);
+ break;
+ }
+ case SceneEventTypes.C2S_SyncComplete:
+ {
+ CheckClientSynchronizationResults(reader);
+ break;
+ }
+ case SceneEventTypes.S2C_Load:
+ {
+ // We store off the trailing in-scene placed serialized NetworkObject data to
+ // be processed once we are done loading.
+ InternalBuffer.Position = 0;
+ InternalBuffer.CopyUnreadFrom(reader.GetStream());
+ InternalBuffer.Position = 0;
+ break;
+ }
+ case SceneEventTypes.S2C_ReSync:
+ {
+ ReadClientReSynchronizationData(reader);
+ break;
+ }
+ case SceneEventTypes.S2C_LoadComplete:
+ case SceneEventTypes.S2C_UnLoadComplete:
+ {
+ ReadSceneEventProgressDone(reader);
+ break;
+ }
+ }
+ }
+
+ ///
+ /// Client Side:
+ /// Prepares for a scene synchronization event and copies the scene synchronization data
+ /// into the internal buffer to be used throughout the synchronization process.
+ ///
+ ///
+ internal void CopySceneSyncrhonizationData(NetworkReader reader)
+ {
+ m_NetworkObjectsSync.Clear();
+
+ ScenesToSynchronize = new Queue(reader.ReadUIntArrayPacked());
+ SceneHandlesToSynchronize = new Queue(reader.ReadUIntArrayPacked());
+ InternalBuffer.Position = 0;
+
+ // is not packed!
+ var sizeToCopy = reader.ReadUInt32();
+
+ using (var writer = PooledNetworkWriter.Get(InternalBuffer))
+ {
+ writer.ReadAndWrite(reader, (long)sizeToCopy);
+ }
+
+ InternalBuffer.Position = 0;
+ }
+
+ ///
+ /// Client Side:
+ /// This needs to occur at the end of a S2C_Load event when the scene has finished loading
+ /// Maximum number of objects that could theoretically be synchronized is 65536
+ ///
+ internal void DeserializeScenePlacedObjects()
+ {
+ using (var reader = PooledNetworkReader.Get(InternalBuffer))
+ {
+ // is not packed!
+ var newObjectsCount = reader.ReadUInt16();
+
+ for (ushort i = 0; i < newObjectsCount; i++)
+ {
+ // Set our relative scene to the NetworkObject
+ m_NetworkManager.SceneManager.SetTheSceneBeingSynchronized(reader.ReadInt32Packed());
+
+ // Deserialize the NetworkObject
+ NetworkObject.DeserializeSceneObject(InternalBuffer as NetworkBuffer, reader, m_NetworkManager);
+ }
+ }
+ }
+
+ ///
+ /// Client Side:
+ /// If there happens to be NetworkObjects in the final Event_Sync_Complete message that are no longer spawned,
+ /// the server will compile a list and send back an Event_ReSync message to the client. This is where the
+ /// client handles any returned values by the server.
+ ///
+ ///
+ internal void ReadClientReSynchronizationData(NetworkReader reader)
+ {
+ var networkObjectsToRemove = reader.ReadULongArrayPacked();
+
+ if (networkObjectsToRemove.Length > 0)
+ {
+ var networkObjects = UnityEngine.Object.FindObjectsOfType();
+ var networkObjectIdToNetworkObject = new Dictionary();
+ foreach (var networkObject in networkObjects)
+ {
+ if (!networkObjectIdToNetworkObject.ContainsKey(networkObject.NetworkObjectId))
+ {
+ networkObjectIdToNetworkObject.Add(networkObject.NetworkObjectId, networkObject);
+ }
+ }
+
+ foreach (var networkObjectId in networkObjectsToRemove)
+ {
+ if (networkObjectIdToNetworkObject.ContainsKey(networkObjectId))
+ {
+ var networkObject = networkObjectIdToNetworkObject[networkObjectId];
+ networkObjectIdToNetworkObject.Remove(networkObjectId);
+
+ networkObject.IsSpawned = false;
+ if (m_NetworkManager.PrefabHandler.ContainsHandler(networkObject))
+ {
+ // Since this is the client side and we have missed the delete message, until the Snapshot system is in place for spawn and despawn handling
+ // we have to remove this from the list of spawned objects manually or when a NetworkObjectId is recycled the client will throw an error
+ // about the id already being assigned.
+ if (m_NetworkManager.SpawnManager.SpawnedObjects.ContainsKey(networkObjectId))
+ {
+ m_NetworkManager.SpawnManager.SpawnedObjects.Remove(networkObjectId);
+ }
+ if (m_NetworkManager.SpawnManager.SpawnedObjectsList.Contains(networkObject))
+ {
+ m_NetworkManager.SpawnManager.SpawnedObjectsList.Remove(networkObject);
+ }
+ NetworkManager.Singleton.PrefabHandler.HandleNetworkPrefabDestroy(networkObject);
+ }
+ else
+ {
+ UnityEngine.Object.DestroyImmediate(networkObject.gameObject);
+ }
+ }
+ }
+ }
+ }
+
+ ///
+ /// Server Side:
+ /// If there happens to be NetworkObjects in the final Event_Sync_Complete message that are no longer spawned,
+ /// the server will compile a list and send back an Event_ReSync message to the client.
+ ///
+ ///
+ internal void WriteClientReSynchronizationData(NetworkWriter writer)
+ {
+ //Write how many objects need to be removed
+ writer.WriteULongArrayPacked(m_NetworkObjectsToBeRemoved.ToArray());
+ }
+
+ ///
+ /// Server Side:
+ /// Determines if the client needs to be slightly re-synchronized if during the deserialization
+ /// process the server finds NetworkObjects that the client still thinks are spawned.
+ ///
+ ///
+ internal bool ClientNeedsReSynchronization()
+ {
+ return (m_NetworkObjectsToBeRemoved.Count > 0);
+ }
+
+ ///
+ /// Server Side:
+ /// Determines if the client needs to be re-synchronized if during the deserialization
+ /// process the server finds NetworkObjects that the client still thinks are spawned but
+ /// have since been despawned.
+ ///
+ ///
+ internal void CheckClientSynchronizationResults(NetworkReader reader)
+ {
+ m_NetworkObjectsToBeRemoved.Clear();
+ var networkObjectIdCount = reader.ReadUInt32Packed();
+ for (int i = 0; i < networkObjectIdCount; i++)
+ {
+ var networkObjectId = (ulong)reader.ReadUInt32Packed();
+ if (!m_NetworkManager.SpawnManager.SpawnedObjects.ContainsKey(networkObjectId))
+ {
+ m_NetworkObjectsToBeRemoved.Add(networkObjectId);
+ }
+ }
+ }
+
+ ///
+ /// Client Side:
+ /// During the deserialization process of the servers Event_Sync, the client builds a list of
+ /// all NetworkObjectIds that were spawned. Upon responding to the server with the Event_Sync_Complete
+ /// this list is included for the server to review over and determine if the client needs a minor resynchronization
+ /// of NetworkObjects that might have been despawned while the client was processing the Event_Sync.
+ ///
+ ///
+ internal void WriteClientSynchronizationResults(NetworkWriter writer)
+ {
+ //Write how many objects were spawned
+ writer.WriteUInt32Packed((uint)m_NetworkObjectsSync.Count);
+ foreach (var networkObject in m_NetworkObjectsSync)
+ {
+ writer.WriteUInt32Packed((uint)networkObject.NetworkObjectId);
+ }
+ }
+
+ ///
+ /// Client Side:
+ /// During the processing of a server sent Event_Sync, this method will be called for each scene once
+ /// it is finished loading. The client will also build a list of NetworkObjects that it spawned during
+ /// this process which will be used as part of the Event_Sync_Complete response.
+ ///
+ ///
+ ///
+ internal void SynchronizeSceneNetworkObjects(NetworkManager networkManager)
+ {
+ using (var reader = PooledNetworkReader.Get(InternalBuffer))
+ {
+ // Process all NetworkObjects for this scene
+ var newObjectsCount = reader.ReadInt32Packed();
+
+ for (int i = 0; i < newObjectsCount; i++)
+ {
+ /// We want to make sure for each NetworkObject we have the appropriate scene selected as the scene that is
+ /// currently being synchronized. This assures in-scene placed NetworkObjects will use the right NetworkObject
+ /// from the list of populated
+ m_NetworkManager.SceneManager.SetTheSceneBeingSynchronized(reader.ReadInt32Packed());
+
+ var spawnedNetworkObject = NetworkObject.DeserializeSceneObject(InternalBuffer, reader, networkManager);
+ if (!m_NetworkObjectsSync.Contains(spawnedNetworkObject))
+ {
+ m_NetworkObjectsSync.Add(spawnedNetworkObject);
+ }
+ }
+ }
+ }
+
+ ///
+ /// Writes the all clients loaded or unloaded completed and timed out lists
+ ///
+ ///
+ internal void WriteSceneEventProgressDone(NetworkWriter writer)
+ {
+ writer.WriteUInt16Packed((ushort)ClientsCompleted.Count);
+ foreach (var clientId in ClientsCompleted)
+ {
+ writer.WriteUInt64Packed(clientId);
+ }
+
+ writer.WriteUInt16Packed((ushort)ClientsTimedOut.Count);
+ foreach (var clientId in ClientsTimedOut)
+ {
+ writer.WriteUInt64Packed(clientId);
+ }
+ }
+
+ ///
+ /// Reads the all clients loaded or unloaded completed and timed out lists
+ ///
+ ///
+ internal void ReadSceneEventProgressDone(NetworkReader reader)
+ {
+ var completedCount = reader.ReadUInt16Packed();
+ ClientsCompleted = new List();
+ for (int i = 0; i < completedCount; i++)
+ {
+ ClientsCompleted.Add(reader.ReadUInt64Packed());
+ }
+
+ var timedOutCount = reader.ReadUInt16Packed();
+ ClientsTimedOut = new List();
+ for (int i = 0; i < timedOutCount; i++)
+ {
+ ClientsTimedOut.Add(reader.ReadUInt64Packed());
+ }
+ }
+
+ ///
+ /// Used to release the pooled network buffer
+ ///
+ public void Dispose()
+ {
+ if (InternalBuffer != null)
+ {
+ NetworkBufferPool.PutBackInPool(InternalBuffer);
+ InternalBuffer = null;
+ }
+ }
+
+ ///
+ /// Constructor
+ ///
+ internal SceneEventData(NetworkManager networkManager)
+ {
+ m_NetworkManager = networkManager;
+ InternalBuffer = NetworkBufferPool.GetBuffer();
+ }
+ }
+}
diff --git a/testproject/Assets/Tests/Manual/Scripts/NetworkSceneManagerCallbackTests.cs.meta b/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs.meta
similarity index 83%
rename from testproject/Assets/Tests/Manual/Scripts/NetworkSceneManagerCallbackTests.cs.meta
rename to com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs.meta
index 3adbd8ca8e..1d7827c50a 100644
--- a/testproject/Assets/Tests/Manual/Scripts/NetworkSceneManagerCallbackTests.cs.meta
+++ b/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventData.cs.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
-guid: f7cbaa25ecc57a2468dfb25c155cae9b
+guid: d4e25f9d4b699684183b2a06c55349fe
MonoImporter:
externalObjects: {}
serializedVersion: 2
diff --git a/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventProgress.cs b/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventProgress.cs
new file mode 100644
index 0000000000..d8db7d3476
--- /dev/null
+++ b/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventProgress.cs
@@ -0,0 +1,154 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.SceneManagement;
+using AsyncOperation = UnityEngine.AsyncOperation;
+
+namespace Unity.Netcode
+{
+ ///
+ /// Used by to determine if a server invoked scene event has started.
+ /// The returned status is stored in the property.
+ /// Note: This was formally known as SwitchSceneProgress which contained the .
+ /// All s are now delivered by the event handler
+ /// via the parameter.
+ ///
+ public enum SceneEventProgressStatus
+ {
+ ///
+ /// No scene event progress status can be used to initialize a variable that will be checked over time.
+ ///
+ None,
+ ///
+ /// The scene event was successfully started
+ ///
+ Started,
+ ///
+ /// Returned if you try to unload a scene that was not yet loaded
+ ///
+ SceneNotLoaded,
+ ///
+ /// Returned if you try to start a new scene event before a previous one is finished
+ ///
+ SceneEventInProgress,
+ ///
+ /// Returned if the scene name used with
+ /// or is invalid
+ ///
+ InvalidSceneName,
+
+ ///
+ /// This is used for internal error notifications.
+ /// If you receive this event then it is most likely due to a bug.
+ /// If you receive this event repeatedly, then please open a GitHub issue with steps to replicate
+ ///
+ InternalNetcodeError,
+ }
+
+ ///
+ /// Server side only:
+ /// This tracks the progress of clients during a load or unload scene event
+ ///
+ internal class SceneEventProgress
+ {
+ ///
+ /// List of clientIds of those clients that is done loading the scene.
+ ///
+ internal List DoneClients { get; } = new List();
+
+ ///
+ /// The NetworkTime at the moment the scene switch was initiated by the server.
+ ///
+ internal NetworkTime TimeAtInitiation { get; }
+
+ ///
+ /// Delegate type for when the switch scene progress is completed. Either by all clients done loading the scene or by time out.
+ ///
+ internal delegate bool OnCompletedDelegate(SceneEventProgress sceneEventProgress);
+
+ ///
+ /// The callback invoked when the switch scene progress is completed. Either by all clients done loading the scene or by time out.
+ ///
+ internal OnCompletedDelegate OnComplete;
+
+ ///
+ /// Is this scene switch progresses completed, all clients are done loading the scene or a timeout has occurred.
+ ///
+ internal bool IsCompleted { get; private set; }
+
+ internal bool TimedOut { get; private set; }
+
+ ///
+ /// If all clients are done loading the scene, at the moment of completed.
+ ///
+ internal bool AreAllClientsDoneLoading { get; private set; }
+
+ internal string SceneName { get; set; }
+
+ internal Guid Guid { get; } = Guid.NewGuid();
+
+ private Coroutine m_TimeOutCoroutine;
+ private AsyncOperation m_SceneLoadOperation;
+
+ private NetworkManager m_NetworkManager { get; }
+
+ internal SceneEventProgressStatus Status { get; set; }
+
+ internal SceneEventData.SceneEventTypes SceneEventType { get; set; }
+
+ internal LoadSceneMode LoadSceneMode;
+
+ internal SceneEventProgress(NetworkManager networkManager, SceneEventProgressStatus status = SceneEventProgressStatus.Started)
+ {
+ if (status == SceneEventProgressStatus.Started)
+ {
+ m_NetworkManager = networkManager;
+ m_TimeOutCoroutine = m_NetworkManager.StartCoroutine(TimeOutSceneEventProgress());
+ TimeAtInitiation = networkManager.LocalTime;
+ }
+ Status = status;
+ }
+
+ internal IEnumerator TimeOutSceneEventProgress()
+ {
+ yield return new WaitForSecondsRealtime(m_NetworkManager.NetworkConfig.LoadSceneTimeOut);
+ TimedOut = true;
+ CheckCompletion();
+ }
+
+ internal void AddClientAsDone(ulong clientId)
+ {
+ DoneClients.Add(clientId);
+ CheckCompletion();
+ }
+
+ internal void RemoveClientAsDone(ulong clientId)
+ {
+ DoneClients.Remove(clientId);
+ CheckCompletion();
+ }
+
+ internal void SetSceneLoadOperation(AsyncOperation sceneLoadOperation)
+ {
+ m_SceneLoadOperation = sceneLoadOperation;
+ m_SceneLoadOperation.completed += operation => CheckCompletion();
+ }
+
+ internal void CheckCompletion()
+ {
+ if ((!IsCompleted && DoneClients.Count == m_NetworkManager.ConnectedClientsList.Count && m_SceneLoadOperation.isDone) || (!IsCompleted && TimedOut))
+ {
+ IsCompleted = true;
+ AreAllClientsDoneLoading = true;
+
+ // If OnComplete is not registered or it is and returns true then remove this from the progress tracking
+ if (OnComplete == null || (OnComplete != null && OnComplete.Invoke(this)))
+ {
+ m_NetworkManager.SceneManager.SceneEventProgressTracking.Remove(Guid);
+ }
+ m_NetworkManager.StopCoroutine(m_TimeOutCoroutine);
+ }
+ }
+ }
+}
diff --git a/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneSwitchProgress.cs.meta b/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventProgress.cs.meta
similarity index 100%
rename from com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneSwitchProgress.cs.meta
rename to com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventProgress.cs.meta
diff --git a/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneSwitchProgress.cs b/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneSwitchProgress.cs
deleted file mode 100644
index 39b24e8bd6..0000000000
--- a/com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneSwitchProgress.cs
+++ /dev/null
@@ -1,109 +0,0 @@
-using System;
-using System.Collections.Generic;
-using UnityEngine;
-using AsyncOperation = UnityEngine.AsyncOperation;
-
-namespace Unity.Netcode
-{
- ///
- /// Class for tracking scene switching progress by server and clients.
- ///
- public class SceneSwitchProgress
- {
- ///
- /// List of clientIds of those clients that is done loading the scene.
- ///
- public List DoneClients { get; } = new List();
-
- ///
- /// The NetworkTime at the moment the scene switch was initiated by the server.
- ///
- public NetworkTime TimeAtInitiation { get; }
-
- ///
- /// Delegate type for when the switch scene progress is completed. Either by all clients done loading the scene or by time out.
- ///
- public delegate void OnCompletedDelegate(bool timedOut);
-
- ///
- /// The callback invoked when the switch scene progress is completed. Either by all clients done loading the scene or by time out.
- ///
- public event OnCompletedDelegate OnComplete;
-
- ///
- /// Is this scene switch progresses completed, all clients are done loading the scene or a timeout has occured.
- ///
- public bool IsCompleted { get; private set; }
-
- ///
- /// If all clients are done loading the scene, at the moment of completed.
- ///
- public bool IsAllClientsDoneLoading { get; private set; }
-
- ///
- /// Delegate type for when a client is done loading the scene.
- ///
- public delegate void OnClientLoadedSceneDelegate(ulong clientId);
-
- ///
- /// The callback invoked when a client is done loading the scene.
- ///
- public event OnClientLoadedSceneDelegate OnClientLoadedScene;
-
- internal Guid Guid { get; } = Guid.NewGuid();
-
- private Coroutine m_TimeOutCoroutine;
- private AsyncOperation m_SceneLoadOperation;
-
- private NetworkManager m_NetworkManager { get; }
-
- internal SceneSwitchProgress(NetworkManager networkManager)
- {
- m_NetworkManager = networkManager;
- m_TimeOutCoroutine = m_NetworkManager.StartCoroutine(m_NetworkManager.TimeOutSwitchSceneProgress(this));
- TimeAtInitiation = networkManager.LocalTime;
- }
-
- internal void AddClientAsDone(ulong clientId)
- {
- DoneClients.Add(clientId);
- OnClientLoadedScene?.Invoke(clientId);
- CheckCompletion();
- }
-
- internal void RemoveClientAsDone(ulong clientId)
- {
- DoneClients.Remove(clientId);
- CheckCompletion();
- }
-
- internal void SetSceneLoadOperation(AsyncOperation sceneLoadOperation)
- {
- m_SceneLoadOperation = sceneLoadOperation;
- m_SceneLoadOperation.completed += operation => CheckCompletion();
- }
-
- internal void CheckCompletion()
- {
- if (!IsCompleted && DoneClients.Count == m_NetworkManager.ConnectedClientsList.Count && m_SceneLoadOperation.isDone)
- {
- IsCompleted = true;
- IsAllClientsDoneLoading = true;
- m_NetworkManager.SceneManager.SceneSwitchProgresses.Remove(Guid);
- OnComplete?.Invoke(false);
-
- m_NetworkManager.StopCoroutine(m_TimeOutCoroutine);
- }
- }
-
- internal void SetTimedOut()
- {
- if (!IsCompleted)
- {
- IsCompleted = true;
- m_NetworkManager.SceneManager.SceneSwitchProgresses.Remove(Guid);
- OnComplete?.Invoke(true);
- }
- }
- }
-}
diff --git a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs
index 0af4537cd3..1e38683f7b 100644
--- a/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs
+++ b/com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs
@@ -267,7 +267,9 @@ internal NetworkObject CreateLocalNetworkObject(bool isSceneObject, uint globalO
}
else
{
- if (!NetworkManager.SceneManager.ScenePlacedObjects.TryGetValue(globalObjectIdHash, out NetworkObject networkObject))
+ var networkObject = NetworkManager.SceneManager.GetSceneRelativeInSceneNetworkObject(globalObjectIdHash);
+
+ if (networkObject == null)
{
if (NetworkLog.CurrentLogLevel <= LogLevel.Error)
{
@@ -276,10 +278,6 @@ internal NetworkObject CreateLocalNetworkObject(bool isSceneObject, uint globalO
return null;
}
- else
- {
- NetworkManager.SceneManager.ScenePlacedObjects.Remove(globalObjectIdHash);
- }
if (parentNetworkObject != null)
{
@@ -310,6 +308,7 @@ internal void SpawnNetworkObjectLocally(NetworkObject networkObject, ulong netwo
if (SpawnedObjects.ContainsKey(networkId))
{
+ Debug.LogWarning($"Trying to spawn {nameof(NetworkObject.NetworkObjectId)} {networkId} that already exists!");
return;
}
@@ -501,21 +500,10 @@ internal void ServerDestroySpawnedSceneObjects()
foreach (var sobj in spawnedObjects)
{
- if ((sobj.IsSceneObject != null && sobj.IsSceneObject == true) || sobj.DestroyWithScene)
+ if (sobj.IsSceneObject != null && sobj.IsSceneObject.Value)
{
- // This **needs** to be here until we overhaul NetworkSceneManager due to dependencies
- // that occur shortly after NetworkSceneManager invokes ServerDestroySpawnedSceneObjects
- // within the NetworkSceneManager.SwitchScene method.
-
- if (NetworkManager.PrefabHandler != null && NetworkManager.PrefabHandler.ContainsHandler(sobj))
- {
- NetworkManager.PrefabHandler.HandleNetworkPrefabDestroy(sobj);
- }
- else
- {
- SpawnedObjectsList.Remove(sobj);
- UnityEngine.Object.Destroy(sobj.gameObject);
- }
+ SpawnedObjectsList.Remove(sobj);
+ UnityEngine.Object.Destroy(sobj.gameObject);
}
}
}
@@ -533,11 +521,7 @@ internal void DestroyNonSceneObjects()
if (NetworkManager.PrefabHandler.ContainsHandler(networkObjects[i]))
{
NetworkManager.PrefabHandler.HandleNetworkPrefabDestroy(networkObjects[i]);
-
- if (SpawnedObjects.ContainsKey(networkObjects[i].NetworkObjectId))
- {
- OnDespawnObject(networkObjects[i], false);
- }
+ OnDespawnObject(networkObjects[i], false);
}
else
{
@@ -710,5 +694,70 @@ internal void OnDespawnObject(NetworkObject networkObject, bool destroyGameObjec
}
}
}
+
+ ///
+ /// This will write all client observable NetworkObjects to the 's stream while also
+ /// adding the client to each 's list only if
+ /// observable to the client.
+ /// Maximum number of objects that could theoretically be serialized is 65536 for now
+ ///
+ /// the client identifier used to determine if a spawned NetworkObject is observable
+ /// contains the writer used for serialization
+ internal void SerializeObservedNetworkObjects(ulong clientId, NetworkWriter writer)
+ {
+ var stream = writer.GetStream();
+ var headPosition = stream.Position;
+ var numberOfObjects = (ushort)0;
+
+ // Write our count place holder(must not be packed!)
+ writer.WriteUInt16(0);
+
+ foreach (var sobj in SpawnedObjectsList)
+ {
+ if (sobj.CheckObjectVisibility == null || sobj.CheckObjectVisibility(clientId))
+ {
+ sobj.Observers.Add(clientId);
+ sobj.SerializeSceneObject(writer, clientId);
+ numberOfObjects++;
+ }
+ }
+
+ var tailPosition = stream.Position;
+ // Reposition to our count position to the head before we wrote our object count
+ stream.Position = headPosition;
+ // Write number of NetworkObjects serialized (must not be packed!)
+ writer.WriteUInt16(numberOfObjects);
+ // Set our position back to the tail
+ stream.Position = tailPosition;
+ }
+
+ ///
+ /// Updates all spawned for the specified client
+ /// Note: if the clientId is the server then it is observable to all spawned 's
+ ///
+ internal void UpdateObservedNetworkObjects(ulong clientId)
+ {
+ foreach (var sobj in SpawnedObjectsList)
+ {
+ if (sobj.CheckObjectVisibility == null || NetworkManager.IsServer)
+ {
+ if (!sobj.Observers.Contains(clientId))
+ {
+ sobj.Observers.Add(clientId);
+ }
+ }
+ else
+ {
+ if (sobj.CheckObjectVisibility(clientId))
+ {
+ sobj.Observers.Add(clientId);
+ }
+ else if (sobj.Observers.Contains(clientId))
+ {
+ sobj.Observers.Remove(clientId);
+ }
+ }
+ }
+ }
}
}
diff --git a/com.unity.netcode.gameobjects/Tests/Editor/DummyMessageHandler.cs b/com.unity.netcode.gameobjects/Tests/Editor/DummyMessageHandler.cs
index 7acb8ad5df..974d77a656 100644
--- a/com.unity.netcode.gameobjects/Tests/Editor/DummyMessageHandler.cs
+++ b/com.unity.netcode.gameobjects/Tests/Editor/DummyMessageHandler.cs
@@ -20,9 +20,7 @@ public DummyMessageHandler(NetworkManager networkManager)
public void HandleDestroyObject(ulong clientId, Stream stream) => VerifyCalled(nameof(HandleDestroyObject));
- public void HandleSwitchScene(ulong clientId, Stream stream) => VerifyCalled(nameof(HandleSwitchScene));
-
- public void HandleClientSwitchSceneCompleted(ulong clientId, Stream stream) => VerifyCalled(nameof(HandleClientSwitchSceneCompleted));
+ public void HandleSceneEvent(ulong clientId, Stream stream) => VerifyCalled(nameof(HandleSceneEvent));
public void HandleChangeOwner(ulong clientId, Stream stream) => VerifyCalled(nameof(HandleChangeOwner));
diff --git a/com.unity.netcode.gameobjects/Tests/Editor/NetworkManagerMessageHandlerTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/NetworkManagerMessageHandlerTests.cs
index 087999ca2a..3641cc7836 100644
--- a/com.unity.netcode.gameobjects/Tests/Editor/NetworkManagerMessageHandlerTests.cs
+++ b/com.unity.netcode.gameobjects/Tests/Editor/NetworkManagerMessageHandlerTests.cs
@@ -80,7 +80,8 @@ public void MessageHandlerReceivedMessageServerClient()
// Should not cause log (client only)
// Everything should log MessageReceiveQueueItem even if ignored
LogAssert.Expect(LogType.Log, nameof(DummyMessageHandler.MessageReceiveQueueItem));
- using (var messageStream = MessagePacker.WrapMessage(MessageQueueContainer.MessageType.SwitchScene, inputBuffer, networkManager.MessageQueueContainer.IsUsingBatching()))
+ LogAssert.Expect(LogType.Log, nameof(DummyMessageHandler.HandleSceneEvent));
+ using (var messageStream = MessagePacker.WrapMessage(MessageQueueContainer.MessageType.SceneEvent, inputBuffer, networkManager.MessageQueueContainer.IsUsingBatching()))
{
networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0);
}
@@ -128,15 +129,6 @@ public void MessageHandlerReceivedMessageServerClient()
networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0);
}
- // Should cause log (server only)
- // Everything should log MessageReceiveQueueItem even if ignored
- LogAssert.Expect(LogType.Log, nameof(DummyMessageHandler.MessageReceiveQueueItem));
- LogAssert.Expect(LogType.Log, nameof(DummyMessageHandler.HandleClientSwitchSceneCompleted));
- using (var messageStream = MessagePacker.WrapMessage(MessageQueueContainer.MessageType.ClientSwitchSceneCompleted, inputBuffer, networkManager.MessageQueueContainer.IsUsingBatching()))
- {
- networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0);
- }
-
// Should cause log (server only)
// Everything should log MessageReceiveQueueItem even if ignored
LogAssert.Expect(LogType.Log, nameof(DummyMessageHandler.MessageReceiveQueueItem));
@@ -197,8 +189,8 @@ public void MessageHandlerReceivedMessageServerClient()
// Should cause log (client only)
// Everything should log MessageReceiveQueueItem even if ignored
LogAssert.Expect(LogType.Log, nameof(DummyMessageHandler.MessageReceiveQueueItem));
- LogAssert.Expect(LogType.Log, nameof(DummyMessageHandler.HandleSwitchScene));
- using (var messageStream = MessagePacker.WrapMessage(MessageQueueContainer.MessageType.SwitchScene, inputBuffer, networkManager.MessageQueueContainer.IsUsingBatching()))
+ LogAssert.Expect(LogType.Log, nameof(DummyMessageHandler.HandleSceneEvent));
+ using (var messageStream = MessagePacker.WrapMessage(MessageQueueContainer.MessageType.SceneEvent, inputBuffer, networkManager.MessageQueueContainer.IsUsingBatching()))
{
networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0);
}
@@ -248,14 +240,6 @@ public void MessageHandlerReceivedMessageServerClient()
networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0);
}
- // Should not cause log (server only)
- // Everything should log MessageReceiveQueueItem even if ignored
- LogAssert.Expect(LogType.Log, nameof(DummyMessageHandler.MessageReceiveQueueItem));
- using (var messageStream = MessagePacker.WrapMessage(MessageQueueContainer.MessageType.ClientSwitchSceneCompleted, inputBuffer, networkManager.MessageQueueContainer.IsUsingBatching()))
- {
- networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream.GetBuffer(), 0, (int)messageStream.Length), 0);
- }
-
// Should not cause log (server only)
// Everything should log MessageReceiveQueueItem even if ignored
LogAssert.Expect(LogType.Log, nameof(DummyMessageHandler.MessageReceiveQueueItem));
diff --git a/com.unity.netcode.gameobjects/Tests/Editor/Profiling/InternalMessageHandlerProfilingDecoratorTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/Profiling/InternalMessageHandlerProfilingDecoratorTests.cs
index 039fcd94a2..e9b119ec05 100644
--- a/com.unity.netcode.gameobjects/Tests/Editor/Profiling/InternalMessageHandlerProfilingDecoratorTests.cs
+++ b/com.unity.netcode.gameobjects/Tests/Editor/Profiling/InternalMessageHandlerProfilingDecoratorTests.cs
@@ -47,19 +47,11 @@ public void HandleDestroyObjectCallsUnderlyingHandler()
}
[Test]
- public void HandleSwitchSceneCallsUnderlyingHandler()
+ public void HandleSceneEventCallsUnderlyingHandler()
{
- m_Decorator.HandleSwitchScene(0, null);
+ m_Decorator.HandleSceneEvent(0, null);
- LogAssert.Expect(LogType.Log, nameof(m_Decorator.HandleSwitchScene));
- }
-
- [Test]
- public void HandleClientSwitchSceneCompletedCallsUnderlyingHandler()
- {
- m_Decorator.HandleClientSwitchSceneCompleted(0, null);
-
- LogAssert.Expect(LogType.Log, nameof(m_Decorator.HandleClientSwitchSceneCompleted));
+ LogAssert.Expect(LogType.Log, nameof(m_Decorator.HandleSceneEvent));
}
[Test]
@@ -109,13 +101,5 @@ public void MessageReceiveQueueItemCallsUnderlyingHandler()
LogAssert.Expect(LogType.Log, nameof(m_Decorator.MessageReceiveQueueItem));
}
-
- [Test]
- public void HandleAllClientsSwitchSceneCompleted()
- {
- m_Decorator.HandleAllClientsSwitchSceneCompleted(0, null);
-
- LogAssert.Expect(LogType.Log, nameof(m_Decorator.HandleAllClientsSwitchSceneCompleted));
- }
}
}
diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/BaseMultiInstanceTest.cs b/com.unity.netcode.gameobjects/Tests/Runtime/BaseMultiInstanceTest.cs
index de17e9e94e..df3d8d30ee 100644
--- a/com.unity.netcode.gameobjects/Tests/Runtime/BaseMultiInstanceTest.cs
+++ b/com.unity.netcode.gameobjects/Tests/Runtime/BaseMultiInstanceTest.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections;
+using System.Linq;
using NUnit.Framework;
using UnityEngine;
using UnityEngine.TestTools;
@@ -13,6 +14,8 @@ public abstract class BaseMultiInstanceTest
protected NetworkManager m_ServerNetworkManager;
protected NetworkManager[] m_ClientNetworkManagers;
+ internal static uint DefaultPayerGlobalObjectIdHashValue = 7777777;
+
protected abstract int NbClients { get; }
[UnitySetUp]
@@ -39,6 +42,15 @@ public virtual IEnumerator Teardown()
}
}
+ // Make sure any NetworkObject with a GlobalObjectIdHash value of 0 is destroyed
+ // If we are tearing down, we don't want to leave NetworkObjects hanging around
+ var networkObjects = Object.FindObjectsOfType().ToList();
+ var networkObjectsList = networkObjects.Where(c => c.GlobalObjectIdHash == 0);
+ foreach (var networkObject in networkObjectsList)
+ {
+ Object.DestroyImmediate(networkObject);
+ }
+
// wait for next frame so everything is destroyed, so following tests can execute from clean environment
int nextFrameNumber = Time.frameCount + 1;
yield return new WaitUntil(() => Time.frameCount >= nextFrameNumber);
@@ -53,6 +65,16 @@ public virtual IEnumerator Teardown()
///
public IEnumerator StartSomeClientsAndServerWithPlayers(bool useHost, int nbClients, Action updatePlayerPrefab, int targetFrameRate = 60)
{
+ // Make sure any NetworkObject with a GlobalObjectIdHash value of 0 is destroyed
+ // If we are tearing down, we don't want to leave NetworkObjects hanging around
+ var networkObjects = Object.FindObjectsOfType().ToList();
+ var networkObjectsList = networkObjects.Where(c => c.GlobalObjectIdHash == 0);
+ foreach (var netObject in networkObjects)
+ {
+ Object.DestroyImmediate(netObject);
+ }
+
+
// Create multiple NetworkManager instances
if (!MultiInstanceHelpers.Create(nbClients, out NetworkManager server, out NetworkManager[] clients, targetFrameRate))
{
@@ -66,7 +88,6 @@ public IEnumerator StartSomeClientsAndServerWithPlayers(bool useHost, int nbClie
// Create playerPrefab
m_PlayerPrefab = new GameObject("Player");
NetworkObject networkObject = m_PlayerPrefab.AddComponent();
-
/*
* Normally we would only allow player prefabs to be set to a prefab. Not runtime created objects.
* In order to prevent having a Resource folder full of a TON of prefabs that we have to maintain,
@@ -75,7 +96,7 @@ public IEnumerator StartSomeClientsAndServerWithPlayers(bool useHost, int nbClie
* at runtime without it being treated as a SceneObject or causing other conflicts with the Netcode.
*/
// Make it a prefab
- MultiInstanceHelpers.MakeNetworkedObjectTestPrefab(networkObject);
+ MultiInstanceHelpers.MakeNetworkedObjectTestPrefab(networkObject, DefaultPayerGlobalObjectIdHashValue);
updatePlayerPrefab(m_PlayerPrefab); // update player prefab with whatever is needed before players are spawned
diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/OwnershipChangeMetricsTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/OwnershipChangeMetricsTests.cs
index 9cfb2dfbde..87c781e189 100644
--- a/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/OwnershipChangeMetricsTests.cs
+++ b/com.unity.netcode.gameobjects/Tests/Runtime/Metrics/OwnershipChangeMetricsTests.cs
@@ -17,6 +17,7 @@ public IEnumerator TrackOwnershipChangeSentMetric()
{
var gameObject = new GameObject(Guid.NewGuid().ToString());
var networkObject = gameObject.AddComponent();
+ MultiInstanceHelpers.MakeNetworkedObjectTestPrefab(networkObject, DefaultPayerGlobalObjectIdHashValue);
networkObject.NetworkManagerOwner = Server;
networkObject.Spawn();
@@ -41,6 +42,7 @@ public IEnumerator TrackOwnershipChangeReceivedMetric()
{
var gameObject = new GameObject(Guid.NewGuid().ToString());
var networkObject = gameObject.AddComponent();
+ MultiInstanceHelpers.MakeNetworkedObjectTestPrefab(networkObject, DefaultPayerGlobalObjectIdHashValue);
networkObject.NetworkManagerOwner = Server;
networkObject.Spawn();
diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/MultiInstanceHelpers.cs b/com.unity.netcode.gameobjects/Tests/Runtime/MultiInstanceHelpers.cs
index 4063cc52c7..e765a184ff 100644
--- a/com.unity.netcode.gameobjects/Tests/Runtime/MultiInstanceHelpers.cs
+++ b/com.unity.netcode.gameobjects/Tests/Runtime/MultiInstanceHelpers.cs
@@ -204,6 +204,7 @@ public class CoroutineResultWrapper
public T Result;
}
+
///
/// Normally we would only allow player prefabs to be set to a prefab. Not runtime created objects.
/// In order to prevent having a Resource folder full of a TON of prefabs that we have to maintain,
@@ -471,7 +472,9 @@ public static IEnumerator WaitForCondition(Func predicate, CoroutineResult
while (Time.frameCount - startFrameNumber <= maxFrames && !predicate())
{
- var nextFrameNumber = Time.frameCount + 1;
+ // Changed to 2 frames to avoid the scenario where it would take 1+ frames to
+ // see a value change (i.e. discovered in the NetworkTransformTests)
+ var nextFrameNumber = Time.frameCount + 2;
yield return new WaitUntil(() => Time.frameCount >= nextFrameNumber);
}
diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkObject/NetworkObjectSceneSerializationTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkObject/NetworkObjectSceneSerializationTests.cs
index d584379747..6984baf2cc 100644
--- a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkObject/NetworkObjectSceneSerializationTests.cs
+++ b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkObject/NetworkObjectSceneSerializationTests.cs
@@ -1,11 +1,13 @@
using System.Collections.Generic;
using UnityEngine;
+using UnityEngine.SceneManagement;
using NUnit.Framework;
namespace Unity.Netcode.RuntimeTests
{
public class NetworkObjectSceneSerializationTests
{
+
///
/// The purpose behind this test is to assure that in-scene NetworkObjects
/// that are serialized into a single stream (approval or switch scene this happens)
@@ -51,6 +53,7 @@ public void NetworkObjectSceneSerializationFailure()
invalidNetworkObjects.Add(gameObject);
+ writer.WriteInt32Packed(networkObject.gameObject.scene.handle);
// Serialize the invalid NetworkObject
networkObject.SerializeSceneObject(writer, 0);
@@ -78,11 +81,31 @@ public void NetworkObjectSceneSerializationFailure()
networkObjectsToTest.Add(gameObject);
+ writer.WriteInt32Packed(networkObject.gameObject.scene.handle);
+
+ // Handle populating the scenes loaded list
+ var scene = networkObject.gameObject.scene;
+
+ if (!NetworkManagerHelper.NetworkManagerObject.SceneManager.ScenesLoaded.ContainsKey(scene.handle))
+ {
+ NetworkManagerHelper.NetworkManagerObject.SceneManager.ScenesLoaded.Add(scene.handle, scene);
+ }
+
+ // Since this is a unit test, we will fake the server to client handle lookup by just adding the same handle key and value
+ if (!NetworkManagerHelper.NetworkManagerObject.SceneManager.ServerSceneHandleToClientSceneHandle.ContainsKey(networkObject.gameObject.scene.handle))
+ {
+ NetworkManagerHelper.NetworkManagerObject.SceneManager.ServerSceneHandleToClientSceneHandle.Add(networkObject.gameObject.scene.handle, networkObject.gameObject.scene.handle);
+ }
+
// Serialize the valid NetworkObject
networkObject.SerializeSceneObject(writer, 0);
+ if (!NetworkManagerHelper.NetworkManagerObject.SceneManager.ScenePlacedObjects.ContainsKey(networkObject.GlobalObjectIdHash))
+ {
+ NetworkManagerHelper.NetworkManagerObject.SceneManager.ScenePlacedObjects.Add(networkObject.GlobalObjectIdHash, new Dictionary());
+ }
// Add this valid NetworkObject into the ScenePlacedObjects list
- NetworkManagerHelper.NetworkManagerObject.SceneManager.ScenePlacedObjects.Add(networkObject.GlobalObjectIdHash, networkObject);
+ NetworkManagerHelper.NetworkManagerObject.SceneManager.ScenePlacedObjects[networkObject.GlobalObjectIdHash].Add(SceneManager.GetActiveScene().handle, networkObject);
}
}
@@ -108,6 +131,10 @@ public void NetworkObjectSceneSerializationFailure()
invalidNetworkObjectCount++;
}
+
+
+ NetworkManagerHelper.NetworkManagerObject.SceneManager.SetTheSceneBeingSynchronized(reader.ReadInt32Packed());
+
var deserializedNetworkObject = NetworkObject.DeserializeSceneObject(pooledBuffer, reader, NetworkManagerHelper.NetworkManagerObject);
if (deserializedNetworkObject != null)
{
@@ -149,6 +176,7 @@ public void Setup()
NetworkManagerHelper.StartNetworkManager(out NetworkManager networkManager, NetworkManagerHelper.NetworkManagerOperatingMode.None);
networkManager.NetworkConfig.EnableSceneManagement = true;
networkManager.StartHost();
+
}
[TearDown]
diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkPrefabHandlerTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkPrefabHandlerTests.cs
index 0b8ab55ee3..3194feafac 100644
--- a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkPrefabHandlerTests.cs
+++ b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkPrefabHandlerTests.cs
@@ -1,4 +1,5 @@
using System;
+using System.Linq;
using System.Collections.Generic;
using UnityEngine;
using NUnit.Framework;
@@ -48,12 +49,13 @@ public void NetworkConfigInvalidNetworkPrefabTest()
Assert.False(exceptionOccurred);
}
+ private const string k_PrefabObjectName = "NetworkPrefabHandlerTestObject";
[Test]
public void NetworkPrefabHandlerClass()
{
Assert.IsTrue(NetworkManagerHelper.StartNetworkManager(out _));
- var testPrefabObjectName = "NetworkPrefabHandlerTestObject";
+ var testPrefabObjectName = k_PrefabObjectName;
Guid baseObjectID = NetworkManagerHelper.AddGameNetworkObject(testPrefabObjectName);
NetworkObject baseObject = NetworkManagerHelper.InstantiatedNetworkObjects[baseObjectID];
@@ -150,6 +152,13 @@ public void TearDown()
{
//Stop, shutdown, and destroy
NetworkManagerHelper.ShutdownNetworkManager();
+
+ var networkObjects = UnityEngine.Object.FindObjectsOfType().ToList();
+ var networkObjectsList = networkObjects.Where(c => c.name.Contains(k_PrefabObjectName));
+ foreach (var networkObject in networkObjectsList)
+ {
+ UnityEngine.Object.DestroyImmediate(networkObject);
+ }
}
}
diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkSceneManagerTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkSceneManagerTests.cs
index 4968fbb89f..c5c5761bdf 100644
--- a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkSceneManagerTests.cs
+++ b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkSceneManagerTests.cs
@@ -13,11 +13,13 @@ public void SwitchSceneWithoutSceneManagement()
var threwException = false;
try
{
- networkManager.SceneManager.SwitchScene("SomeSceneNane");
+ networkManager.SceneManager.LoadScene("SomeSceneNane", UnityEngine.SceneManagement.LoadSceneMode.Single);
}
catch (Exception ex)
{
- if (ex.Message.Contains($"{nameof(NetworkConfig.EnableSceneManagement)} flag is not enabled in the {nameof(NetworkManager)}'s {nameof(NetworkConfig)}. Please set {nameof(NetworkConfig.EnableSceneManagement)} flag to true before calling this method."))
+ if (ex.Message.Contains($"{nameof(NetworkConfig.EnableSceneManagement)} flag is not enabled in the {nameof(NetworkManager)}'s {nameof(NetworkConfig)}. " +
+ $"Please set {nameof(NetworkConfig.EnableSceneManagement)} flag to true before " +
+ $"calling {nameof(NetworkSceneManager.LoadScene)} or {nameof(NetworkSceneManager.UnloadScene)}."))
{
threwException = true;
}
diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkShowHideTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkShowHideTests.cs
index 0908243ab5..be0b14f370 100644
--- a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkShowHideTests.cs
+++ b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkShowHideTests.cs
@@ -45,7 +45,7 @@ public GameObject PreparePrefab(Type type)
var prefabToSpawn = new GameObject();
prefabToSpawn.AddComponent(type);
var networkObjectPrefab = prefabToSpawn.AddComponent();
- MultiInstanceHelpers.MakeNetworkedObjectTestPrefab(networkObjectPrefab);
+ MultiInstanceHelpers.MakeNetworkedObjectTestPrefab(networkObjectPrefab, DefaultPayerGlobalObjectIdHashValue);
m_ServerNetworkManager.NetworkConfig.NetworkPrefabs.Add(new NetworkPrefab() { Prefab = prefabToSpawn });
foreach (var clientNetworkManager in m_ClientNetworkManagers)
{
diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/NetworkTransformStateTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/NetworkTransformStateTests.cs
index 1cae896568..3339a3c19f 100644
--- a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/NetworkTransformStateTests.cs
+++ b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/NetworkTransformStateTests.cs
@@ -15,6 +15,7 @@ public void TestSyncAxes(
{
var gameObject = new GameObject($"Test-{nameof(NetworkTransformStateTests)}.{nameof(TestSyncAxes)}");
var networkObject = gameObject.AddComponent();
+ networkObject.GlobalObjectIdHash = (uint)Time.realtimeSinceStartup;
var networkTransform = gameObject.AddComponent();
networkTransform.enabled = false; // do not tick `FixedUpdate()` or `Update()`
@@ -389,7 +390,7 @@ public void TestThresholds(
}
}
- Object.DestroyImmediate(networkTransform);
+ Object.DestroyImmediate(gameObject);
}
}
}
diff --git a/testproject/Assets/Materials/RedMaterial.mat b/testproject/Assets/Materials/RedMaterial.mat
new file mode 100644
index 0000000000..42b48231d4
--- /dev/null
+++ b/testproject/Assets/Materials/RedMaterial.mat
@@ -0,0 +1,79 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!21 &2100000
+Material:
+ serializedVersion: 6
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name: RedMaterial
+ m_Shader: {fileID: 7, guid: 0000000000000000f000000000000000, type: 0}
+ m_ShaderKeywords:
+ m_LightmapFlags: 4
+ m_EnableInstancingVariants: 1
+ m_DoubleSidedGI: 0
+ m_CustomRenderQueue: -1
+ stringTagMap: {}
+ disabledShaderPasses: []
+ m_SavedProperties:
+ serializedVersion: 3
+ m_TexEnvs:
+ - _BumpMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _DetailAlbedoMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _DetailMask:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _DetailNormalMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _EmissionMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _MainTex:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _MetallicGlossMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _OcclusionMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _ParallaxMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ m_Ints: []
+ m_Floats:
+ - _BumpScale: 1
+ - _Cutoff: 0.5
+ - _DetailNormalMapScale: 1
+ - _DstBlend: 0
+ - _GlossMapScale: 1
+ - _Glossiness: 0.5
+ - _GlossyReflections: 1
+ - _Metallic: 0
+ - _Mode: 0
+ - _OcclusionStrength: 1
+ - _Parallax: 0.02
+ - _SmoothnessTextureChannel: 0
+ - _SpecularHighlights: 1
+ - _SrcBlend: 1
+ - _UVSec: 0
+ - _ZWrite: 1
+ m_Colors:
+ - _Color: {r: 1, g: 0.019583862, b: 0, a: 1}
+ - _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
+ m_BuildTextureStacks: []
diff --git a/testproject/Assets/Materials/RedMaterial.mat.meta b/testproject/Assets/Materials/RedMaterial.mat.meta
new file mode 100644
index 0000000000..5336a0148b
--- /dev/null
+++ b/testproject/Assets/Materials/RedMaterial.mat.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 712559e4bd05f1942a8fd4bfa4e10c56
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/testproject/Assets/Materials/YellowMaterial.mat b/testproject/Assets/Materials/YellowMaterial.mat
new file mode 100644
index 0000000000..a70906b001
--- /dev/null
+++ b/testproject/Assets/Materials/YellowMaterial.mat
@@ -0,0 +1,79 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!21 &2100000
+Material:
+ serializedVersion: 6
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name: YellowMaterial
+ m_Shader: {fileID: 7, guid: 0000000000000000f000000000000000, type: 0}
+ m_ShaderKeywords:
+ m_LightmapFlags: 4
+ m_EnableInstancingVariants: 1
+ m_DoubleSidedGI: 0
+ m_CustomRenderQueue: -1
+ stringTagMap: {}
+ disabledShaderPasses: []
+ m_SavedProperties:
+ serializedVersion: 3
+ m_TexEnvs:
+ - _BumpMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _DetailAlbedoMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _DetailMask:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _DetailNormalMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _EmissionMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _MainTex:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _MetallicGlossMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _OcclusionMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ - _ParallaxMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ m_Ints: []
+ m_Floats:
+ - _BumpScale: 1
+ - _Cutoff: 0.5
+ - _DetailNormalMapScale: 1
+ - _DstBlend: 0
+ - _GlossMapScale: 1
+ - _Glossiness: 0.5
+ - _GlossyReflections: 1
+ - _Metallic: 0
+ - _Mode: 0
+ - _OcclusionStrength: 1
+ - _Parallax: 0.02
+ - _SmoothnessTextureChannel: 0
+ - _SpecularHighlights: 1
+ - _SrcBlend: 1
+ - _UVSec: 0
+ - _ZWrite: 1
+ m_Colors:
+ - _Color: {r: 1, g: 0.97702336, b: 0, a: 1}
+ - _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
+ m_BuildTextureStacks: []
diff --git a/testproject/Assets/Materials/YellowMaterial.mat.meta b/testproject/Assets/Materials/YellowMaterial.mat.meta
new file mode 100644
index 0000000000..a561f28e0a
--- /dev/null
+++ b/testproject/Assets/Materials/YellowMaterial.mat.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 7a8ec12ee27208a42a11d2944b1c1371
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/testproject/Assets/Prefabs/Player.prefab b/testproject/Assets/Prefabs/Player.prefab
index f6f20de9ab..4d2c48fa0d 100644
--- a/testproject/Assets/Prefabs/Player.prefab
+++ b/testproject/Assets/Prefabs/Player.prefab
@@ -33,8 +33,8 @@ Transform:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4079352819444256614}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
- m_LocalPosition: {x: 5, y: 0.5, z: 5}
- m_LocalScale: {x: 1, y: 1, z: 1}
+ m_LocalPosition: {x: 5, y: 0.625, z: 5}
+ m_LocalScale: {x: 1.25, y: 1.25, z: 1.25}
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 0
@@ -54,7 +54,7 @@ MonoBehaviour:
Authority: 1
Channel: 0
InLocalSpace: 0
- FixedSendsPerSecond: 5
+ FixedSendsPerSecond: 15
--- !u!114 &-3775814466963834669
MonoBehaviour:
m_ObjectHideFlags: 0
diff --git a/testproject/Assets/Prefabs/RandomMoverObject.prefab b/testproject/Assets/Prefabs/RandomMoverObject.prefab
new file mode 100644
index 0000000000..852d8d0059
--- /dev/null
+++ b/testproject/Assets/Prefabs/RandomMoverObject.prefab
@@ -0,0 +1,282 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &771575417923360811
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 771575417923360822}
+ - component: {fileID: -5591000292386890817}
+ - component: {fileID: 771575417923360817}
+ - component: {fileID: 771575417923360819}
+ - component: {fileID: 5277211521825898157}
+ - component: {fileID: 771575417923360831}
+ - component: {fileID: 4600632750638426092}
+ - component: {fileID: 1932194183178713890}
+ m_Layer: 9
+ m_Name: RandomMoverObject
+ m_TagString: GenericObject
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &771575417923360822
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 771575417923360811}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 1, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 2591044912546013445}
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &-5591000292386890817
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 771575417923360811}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ GlobalObjectIdHash: 951099334
+ AlwaysReplicateAsRoot: 0
+ DontDestroyWithOwner: 0
+ AutoObjectParentSync: 0
+--- !u!33 &771575417923360817
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 771575417923360811}
+ m_Mesh: {fileID: 10208, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!23 &771575417923360819
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 771575417923360811}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_StaticShadowCaster: 0
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RayTracingMode: 2
+ m_RayTraceProcedural: 0
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: 2100000, guid: 5d9678afcf333564dab383a5db660ae3, type: 2}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_ReceiveGI: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+ m_AdditionalVertexStreams: {fileID: 0}
+--- !u!136 &5277211521825898157
+CapsuleCollider:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 771575417923360811}
+ m_Material: {fileID: 0}
+ m_IsTrigger: 0
+ m_Enabled: 1
+ m_Radius: 0.5
+ m_Height: 1
+ m_Direction: 1
+ m_Center: {x: 0, y: 0, z: 0}
+--- !u!54 &771575417923360831
+Rigidbody:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 771575417923360811}
+ serializedVersion: 2
+ m_Mass: 7
+ m_Drag: 7
+ m_AngularDrag: 0.05
+ m_UseGravity: 0
+ m_IsKinematic: 0
+ m_Interpolate: 1
+ m_Constraints: 112
+ m_CollisionDetection: 0
+--- !u!114 &4600632750638426092
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 771575417923360811}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ Authority: 2
+ Channel: 0
+ InLocalSpace: 0
+ SyncPositionX: 1
+ SyncPositionY: 1
+ SyncPositionZ: 1
+ SyncRotAngleX: 1
+ SyncRotAngleY: 1
+ SyncRotAngleZ: 1
+ SyncScaleX: 1
+ SyncScaleY: 1
+ SyncScaleZ: 1
+ FixedSendsPerSecond: 5
+--- !u!114 &1932194183178713890
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 771575417923360811}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: c552ef0ccf6ff8148a9c9606e7d3fc15, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+--- !u!1 &2058396567867412356
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 2591044912546013445}
+ - component: {fileID: 2507955376722285842}
+ - component: {fileID: 1442227766690505295}
+ - component: {fileID: 7257348192915777211}
+ m_Layer: 9
+ m_Name: ObjectLabel
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &2591044912546013445
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2058396567867412356}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 1.2525, z: 0}
+ m_LocalScale: {x: 0.5, y: 0.75, z: 0.5}
+ m_Children: []
+ m_Father: {fileID: 771575417923360822}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!23 &2507955376722285842
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2058396567867412356}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_StaticShadowCaster: 0
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RayTracingMode: 2
+ m_RayTraceProcedural: 0
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: 10100, guid: 0000000000000000e000000000000000, type: 0}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_ReceiveGI: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+ m_AdditionalVertexStreams: {fileID: 0}
+--- !u!102 &1442227766690505295
+TextMesh:
+ serializedVersion: 3
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2058396567867412356}
+ m_Text: No State
+ m_OffsetZ: 0
+ m_CharacterSize: 1
+ m_LineSpacing: 1
+ m_Anchor: 7
+ m_Alignment: 0
+ m_TabSize: 4
+ m_FontSize: 24
+ m_FontStyle: 0
+ m_RichText: 1
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_Color:
+ serializedVersion: 2
+ rgba: 4294967295
+--- !u!114 &7257348192915777211
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2058396567867412356}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 7b85e388ccb24094d97ef2c46a7ef0d2, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
diff --git a/testproject/Assets/Prefabs/RandomMoverObject.prefab.meta b/testproject/Assets/Prefabs/RandomMoverObject.prefab.meta
new file mode 100644
index 0000000000..317210dbbf
--- /dev/null
+++ b/testproject/Assets/Prefabs/RandomMoverObject.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: ea906834639fa3f4ba65c95db6181d6b
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/testproject/Assets/Prefabs/SpawnObject.prefab b/testproject/Assets/Prefabs/SpawnObject.prefab
index f4a677ddfc..0396a36999 100644
--- a/testproject/Assets/Prefabs/SpawnObject.prefab
+++ b/testproject/Assets/Prefabs/SpawnObject.prefab
@@ -52,6 +52,7 @@ MonoBehaviour:
GlobalObjectIdHash: 951099334
AlwaysReplicateAsRoot: 0
DontDestroyWithOwner: 0
+ AutoObjectParentSync: 0
--- !u!33 &771575417923360817
MeshFilter:
m_ObjectHideFlags: 0
@@ -143,7 +144,9 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: fa7bfe2bc280049f38557d643d8a3471, type: 3}
m_Name:
m_EditorClassIdentifier:
- m_MoveRandomly: 1
+ m_MoveRandomly: 0
+ IsRegisteredPoolObject: 0
+ IsRemovedFromPool: 0
--- !u!114 &4600632750638426092
MonoBehaviour:
m_ObjectHideFlags: 0
@@ -156,39 +159,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3}
m_Name:
m_EditorClassIdentifier:
+ Authority: 0
+ Channel: 0
+ InLocalSpace: 0
FixedSendsPerSecond: 5
- AssumeSyncedSends: 1
- InterpolatePosition: 1
- SnapDistance: 10
- InterpolateServer: 1
- MinMeters: 0.16
- MinDegrees: 1.5
- ExtrapolatePosition: 0
- MaxSendsToExtrapolate: 5
- Channel:
- EnableRange: 0
- EnableNonProvokedResendChecks: 0
- DistanceSendrate:
- serializedVersion: 2
- m_Curve:
- - serializedVersion: 3
- time: 0
- value: 20
- inSlope: 0
- outSlope: 0
- tangentMode: 0
- weightedMode: 0
- inWeight: 0
- outWeight: 0
- - serializedVersion: 3
- time: 500
- value: 20
- inSlope: 0
- outSlope: 0
- tangentMode: 0
- weightedMode: 0
- inWeight: 0
- outWeight: 0
- m_PreInfinity: 2
- m_PostInfinity: 2
- m_RotationOrder: 4
diff --git a/testproject/Assets/Prefabs/SpawnObjectRedSphereServerOnly.prefab b/testproject/Assets/Prefabs/SpawnObjectRedSphereServerOnly.prefab
new file mode 100644
index 0000000000..767a6dc929
--- /dev/null
+++ b/testproject/Assets/Prefabs/SpawnObjectRedSphereServerOnly.prefab
@@ -0,0 +1,81 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1001 &5806514443914707465
+PrefabInstance:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_Modification:
+ m_TransformParent: {fileID: 0}
+ m_Modifications:
+ - target: {fileID: 47844432802121000, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_Name
+ value: SpawnObjectRedSphereServerOnly
+ objectReference: {fileID: 0}
+ - target: {fileID: 47844432802121010, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_Mesh
+ value:
+ objectReference: {fileID: 10208, guid: 0000000000000000e000000000000000, type: 0}
+ - target: {fileID: 47844432802121013, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_RootOrder
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 47844432802121013, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_LocalPosition.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 47844432802121013, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_LocalPosition.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 47844432802121013, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_LocalPosition.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 47844432802121013, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_LocalRotation.w
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 47844432802121013, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_LocalRotation.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 47844432802121013, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_LocalRotation.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 47844432802121013, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_LocalRotation.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 47844432802121013, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_LocalEulerAnglesHint.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 47844432802121013, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_LocalEulerAnglesHint.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 47844432802121013, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_LocalEulerAnglesHint.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 4067897634150729404, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: GlobalObjectIdHash
+ value: 951099334
+ objectReference: {fileID: 0}
+ m_RemovedComponents: []
+ m_SourcePrefab: {fileID: 100100000, guid: 894296ee6a442ef49b3637b680c7bdf7, type: 3}
diff --git a/testproject/Assets/Prefabs/SpawnObjectRedSphereServerOnly.prefab.meta b/testproject/Assets/Prefabs/SpawnObjectRedSphereServerOnly.prefab.meta
new file mode 100644
index 0000000000..0617bb4ec2
--- /dev/null
+++ b/testproject/Assets/Prefabs/SpawnObjectRedSphereServerOnly.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 27c27433e278c054dbe3bae7d411cfab
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/testproject/Assets/Prefabs/SpawnObjectSphere.prefab b/testproject/Assets/Prefabs/SpawnObjectSphere.prefab
new file mode 100644
index 0000000000..f770d478b5
--- /dev/null
+++ b/testproject/Assets/Prefabs/SpawnObjectSphere.prefab
@@ -0,0 +1,96 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1001 &728691999336062211
+PrefabInstance:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_Modification:
+ m_TransformParent: {fileID: 0}
+ m_Modifications:
+ - target: {fileID: -5591000292386890817, guid: c0a45bdb516f341498d933b7a7ed4fc1,
+ type: 3}
+ propertyPath: GlobalObjectIdHash
+ value: 951099334
+ objectReference: {fileID: 0}
+ - target: {fileID: 771575417923360811, guid: c0a45bdb516f341498d933b7a7ed4fc1,
+ type: 3}
+ propertyPath: m_Name
+ value: SpawnObjectSphere
+ objectReference: {fileID: 0}
+ - target: {fileID: 771575417923360817, guid: c0a45bdb516f341498d933b7a7ed4fc1,
+ type: 3}
+ propertyPath: m_Mesh
+ value:
+ objectReference: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0}
+ - target: {fileID: 771575417923360822, guid: c0a45bdb516f341498d933b7a7ed4fc1,
+ type: 3}
+ propertyPath: m_RootOrder
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 771575417923360822, guid: c0a45bdb516f341498d933b7a7ed4fc1,
+ type: 3}
+ propertyPath: m_LocalScale.x
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 771575417923360822, guid: c0a45bdb516f341498d933b7a7ed4fc1,
+ type: 3}
+ propertyPath: m_LocalScale.y
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 771575417923360822, guid: c0a45bdb516f341498d933b7a7ed4fc1,
+ type: 3}
+ propertyPath: m_LocalScale.z
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 771575417923360822, guid: c0a45bdb516f341498d933b7a7ed4fc1,
+ type: 3}
+ propertyPath: m_LocalPosition.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 771575417923360822, guid: c0a45bdb516f341498d933b7a7ed4fc1,
+ type: 3}
+ propertyPath: m_LocalPosition.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 771575417923360822, guid: c0a45bdb516f341498d933b7a7ed4fc1,
+ type: 3}
+ propertyPath: m_LocalPosition.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 771575417923360822, guid: c0a45bdb516f341498d933b7a7ed4fc1,
+ type: 3}
+ propertyPath: m_LocalRotation.w
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 771575417923360822, guid: c0a45bdb516f341498d933b7a7ed4fc1,
+ type: 3}
+ propertyPath: m_LocalRotation.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 771575417923360822, guid: c0a45bdb516f341498d933b7a7ed4fc1,
+ type: 3}
+ propertyPath: m_LocalRotation.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 771575417923360822, guid: c0a45bdb516f341498d933b7a7ed4fc1,
+ type: 3}
+ propertyPath: m_LocalRotation.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 771575417923360822, guid: c0a45bdb516f341498d933b7a7ed4fc1,
+ type: 3}
+ propertyPath: m_LocalEulerAnglesHint.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 771575417923360822, guid: c0a45bdb516f341498d933b7a7ed4fc1,
+ type: 3}
+ propertyPath: m_LocalEulerAnglesHint.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 771575417923360822, guid: c0a45bdb516f341498d933b7a7ed4fc1,
+ type: 3}
+ propertyPath: m_LocalEulerAnglesHint.z
+ value: 0
+ objectReference: {fileID: 0}
+ m_RemovedComponents: []
+ m_SourcePrefab: {fileID: 100100000, guid: c0a45bdb516f341498d933b7a7ed4fc1, type: 3}
diff --git a/testproject/Assets/Prefabs/SpawnObjectSphere.prefab.meta b/testproject/Assets/Prefabs/SpawnObjectSphere.prefab.meta
new file mode 100644
index 0000000000..0919a071db
--- /dev/null
+++ b/testproject/Assets/Prefabs/SpawnObjectSphere.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 894296ee6a442ef49b3637b680c7bdf7
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/testproject/Assets/Prefabs/SpawnObjectSphereRed.prefab b/testproject/Assets/Prefabs/SpawnObjectSphereRed.prefab
new file mode 100644
index 0000000000..ac4ceb3127
--- /dev/null
+++ b/testproject/Assets/Prefabs/SpawnObjectSphereRed.prefab
@@ -0,0 +1,81 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1001 &286521893162279499
+PrefabInstance:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_Modification:
+ m_TransformParent: {fileID: 0}
+ m_Modifications:
+ - target: {fileID: 47844432802121000, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_Name
+ value: SpawnObjectSphereRed
+ objectReference: {fileID: 0}
+ - target: {fileID: 47844432802121008, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_Materials.Array.data[0]
+ value:
+ objectReference: {fileID: 2100000, guid: 712559e4bd05f1942a8fd4bfa4e10c56, type: 2}
+ - target: {fileID: 47844432802121013, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_RootOrder
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 47844432802121013, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_LocalPosition.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 47844432802121013, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_LocalPosition.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 47844432802121013, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_LocalPosition.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 47844432802121013, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_LocalRotation.w
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 47844432802121013, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_LocalRotation.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 47844432802121013, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_LocalRotation.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 47844432802121013, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_LocalRotation.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 47844432802121013, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_LocalEulerAnglesHint.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 47844432802121013, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_LocalEulerAnglesHint.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 47844432802121013, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_LocalEulerAnglesHint.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 4067897634150729404, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: GlobalObjectIdHash
+ value: 951099334
+ objectReference: {fileID: 0}
+ m_RemovedComponents: []
+ m_SourcePrefab: {fileID: 100100000, guid: 894296ee6a442ef49b3637b680c7bdf7, type: 3}
diff --git a/testproject/Assets/Prefabs/SpawnObjectSphereRed.prefab.meta b/testproject/Assets/Prefabs/SpawnObjectSphereRed.prefab.meta
new file mode 100644
index 0000000000..f0865d3a7c
--- /dev/null
+++ b/testproject/Assets/Prefabs/SpawnObjectSphereRed.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 0aca3eef90d204641888a517edcc951f
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/testproject/Assets/Prefabs/SpawnObjectSphereYellow.prefab b/testproject/Assets/Prefabs/SpawnObjectSphereYellow.prefab
new file mode 100644
index 0000000000..0e22456845
--- /dev/null
+++ b/testproject/Assets/Prefabs/SpawnObjectSphereYellow.prefab
@@ -0,0 +1,81 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1001 &7857808669632867561
+PrefabInstance:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_Modification:
+ m_TransformParent: {fileID: 0}
+ m_Modifications:
+ - target: {fileID: 47844432802121000, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_Name
+ value: SpawnObjectSphereYellow
+ objectReference: {fileID: 0}
+ - target: {fileID: 47844432802121008, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_Materials.Array.data[0]
+ value:
+ objectReference: {fileID: 2100000, guid: 7a8ec12ee27208a42a11d2944b1c1371, type: 2}
+ - target: {fileID: 47844432802121013, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_RootOrder
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 47844432802121013, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_LocalPosition.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 47844432802121013, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_LocalPosition.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 47844432802121013, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_LocalPosition.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 47844432802121013, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_LocalRotation.w
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 47844432802121013, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_LocalRotation.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 47844432802121013, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_LocalRotation.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 47844432802121013, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_LocalRotation.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 47844432802121013, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_LocalEulerAnglesHint.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 47844432802121013, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_LocalEulerAnglesHint.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 47844432802121013, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_LocalEulerAnglesHint.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 4067897634150729404, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: GlobalObjectIdHash
+ value: 951099334
+ objectReference: {fileID: 0}
+ m_RemovedComponents: []
+ m_SourcePrefab: {fileID: 100100000, guid: 894296ee6a442ef49b3637b680c7bdf7, type: 3}
diff --git a/testproject/Assets/Prefabs/SpawnObjectSphereYellow.prefab.meta b/testproject/Assets/Prefabs/SpawnObjectSphereYellow.prefab.meta
new file mode 100644
index 0000000000..b756c254eb
--- /dev/null
+++ b/testproject/Assets/Prefabs/SpawnObjectSphereYellow.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 9f2cc6554ae21e3498fb4cc28a07108d
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/testproject/Assets/Prefabs/SpawnObjectYellowSphereServerOnly.prefab b/testproject/Assets/Prefabs/SpawnObjectYellowSphereServerOnly.prefab
new file mode 100644
index 0000000000..1fbef0acb3
--- /dev/null
+++ b/testproject/Assets/Prefabs/SpawnObjectYellowSphereServerOnly.prefab
@@ -0,0 +1,81 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1001 &5082954928110471088
+PrefabInstance:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_Modification:
+ m_TransformParent: {fileID: 0}
+ m_Modifications:
+ - target: {fileID: 47844432802121000, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_Name
+ value: SpawnObjectYellowSphereServerOnly
+ objectReference: {fileID: 0}
+ - target: {fileID: 47844432802121010, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_Mesh
+ value:
+ objectReference: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0}
+ - target: {fileID: 47844432802121013, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_RootOrder
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 47844432802121013, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_LocalPosition.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 47844432802121013, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_LocalPosition.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 47844432802121013, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_LocalPosition.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 47844432802121013, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_LocalRotation.w
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 47844432802121013, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_LocalRotation.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 47844432802121013, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_LocalRotation.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 47844432802121013, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_LocalRotation.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 47844432802121013, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_LocalEulerAnglesHint.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 47844432802121013, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_LocalEulerAnglesHint.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 47844432802121013, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: m_LocalEulerAnglesHint.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 4067897634150729404, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ propertyPath: GlobalObjectIdHash
+ value: 951099334
+ objectReference: {fileID: 0}
+ m_RemovedComponents: []
+ m_SourcePrefab: {fileID: 100100000, guid: 894296ee6a442ef49b3637b680c7bdf7, type: 3}
diff --git a/testproject/Assets/Prefabs/SpawnObjectYellowSphereServerOnly.prefab.meta b/testproject/Assets/Prefabs/SpawnObjectYellowSphereServerOnly.prefab.meta
new file mode 100644
index 0000000000..047874a71f
--- /dev/null
+++ b/testproject/Assets/Prefabs/SpawnObjectYellowSphereServerOnly.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: e04a7aaf01a4ad145a945161a18bf49c
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/testproject/Assets/Samples/SamplesMenu.unity b/testproject/Assets/Samples/SamplesMenu.unity
index 4837d0a589..f13ee8f2ec 100644
--- a/testproject/Assets/Samples/SamplesMenu.unity
+++ b/testproject/Assets/Samples/SamplesMenu.unity
@@ -2495,6 +2495,7 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier:
m_SceneMenus:
+ - {fileID: 11400000, guid: 9a8d9296fb33f794f95514bf38de3cf9, type: 2}
- {fileID: 11400000, guid: 21aae92071ad50448a45b013d8346639, type: 2}
- {fileID: 11400000, guid: 660535b6e155b5b4bbede52313fcb32e, type: 2}
- {fileID: 11400000, guid: d2e34ed37c087154dbd7f89fd463801b, type: 2}
diff --git a/testproject/Assets/Scenes/MultiprocessTestScene.unity b/testproject/Assets/Scenes/MultiprocessTestScene.unity
index 5971bd488a..ff40430f59 100644
--- a/testproject/Assets/Scenes/MultiprocessTestScene.unity
+++ b/testproject/Assets/Scenes/MultiprocessTestScene.unity
@@ -38,7 +38,7 @@ RenderSettings:
m_ReflectionIntensity: 1
m_CustomReflection: {fileID: 0}
m_Sun: {fileID: 0}
- m_IndirectSpecularColor: {r: 0.44657874, g: 0.49641275, b: 0.5748172, a: 1}
+ m_IndirectSpecularColor: {r: 0.44657898, g: 0.4964133, b: 0.5748178, a: 1}
m_UseRadianceAmbientProbe: 0
--- !u!157 &3
LightmapSettings:
@@ -320,6 +320,7 @@ MeshRenderer:
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
+ m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
@@ -498,6 +499,7 @@ MeshRenderer:
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
+ m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
@@ -593,6 +595,7 @@ MeshRenderer:
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
+ m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
@@ -685,6 +688,9 @@ MonoBehaviour:
RegisteredScenes:
- MultiprocessTestScene
- SampleScene
+ RegisteredSceneAssets:
+ - {fileID: 102900000, guid: 76743cb7b342c49279327834918a9c6e, type: 3}
+ - {fileID: 102900000, guid: 9fc0d4010bbf28b4594072e72b8655ab, type: 3}
AllowRuntimeSceneChanges: 0
PlayerPrefab: {fileID: 4700706668509470175, guid: 7eeaaf9e50c0afc4dab93584a54fb0d6,
type: 3}
@@ -736,7 +742,7 @@ MonoBehaviour:
m_GameObject: {fileID: 1211923374}
m_Enabled: 1
m_EditorHideFlags: 0
- m_Script: {fileID: 11500000, guid: 068bf11ceb1344667af4cc40950f44f4, type: 3}
+ m_Script: {fileID: 0}
m_Name:
m_EditorClassIdentifier:
ReferencedPrefab: {fileID: 5637023994061915634, guid: b0952a471c5a147cb92f6afcdb648f8a,
diff --git a/testproject/Assets/Scripts/ExitButtonScript.cs b/testproject/Assets/Scripts/ExitButtonScript.cs
index d1cbe9c111..0195b39e93 100644
--- a/testproject/Assets/Scripts/ExitButtonScript.cs
+++ b/testproject/Assets/Scripts/ExitButtonScript.cs
@@ -14,19 +14,19 @@ public void OnExitScene()
{
if (NetworkManager.Singleton)
{
- if (NetworkManager.Singleton.IsClient)
+ if (NetworkManager.Singleton.IsHost)
{
- NetworkManager.Singleton.StopClient();
+ NetworkManager.Singleton.StopHost();
}
- else if (NetworkManager.Singleton.IsHost)
+ else if (NetworkManager.Singleton.IsClient)
{
- NetworkManager.Singleton.StopHost();
+ NetworkManager.Singleton.StopClient();
}
else if (NetworkManager.Singleton.IsServer)
{
NetworkManager.Singleton.StopServer();
}
- Destroy(NetworkManager.Singleton);
+ Destroy(NetworkManager.Singleton.gameObject);
}
if (m_SceneMenuToLoad != null && m_SceneMenuToLoad.GetReferencedScenes()[0] != string.Empty)
diff --git a/testproject/Assets/Tests/Manual/SceneTransitioning/SceneTransitioningTest.unity b/testproject/Assets/Tests/Manual/SceneTransitioning/SceneTransitioningTest.unity
index 25efe0cd2c..f1bb0aa280 100644
--- a/testproject/Assets/Tests/Manual/SceneTransitioning/SceneTransitioningTest.unity
+++ b/testproject/Assets/Tests/Manual/SceneTransitioning/SceneTransitioningTest.unity
@@ -1012,6 +1012,7 @@ MonoBehaviour:
- SceneTransitioningTest
- SecondSceneToLoad
- ThirdSceneToLoad
+ RegisteredSceneAssets: []
AllowRuntimeSceneChanges: 0
PlayerPrefab: {fileID: 4079352819444256614, guid: c16f03336b6104576a565ef79ad643c0,
type: 3}
@@ -1024,6 +1025,24 @@ MonoBehaviour:
SourceHashToOverride: 0
OverridingTargetPrefab: {fileID: 8059323910720821982, guid: d143db9172e1f234e99d450286b77695,
type: 3}
+ - Override: 0
+ Prefab: {fileID: 1086419352113069865, guid: ed799d5402b325c4f8f41918224a1ba7,
+ type: 3}
+ SourcePrefabToOverride: {fileID: 0}
+ SourceHashToOverride: 0
+ OverridingTargetPrefab: {fileID: 0}
+ - Override: 0
+ Prefab: {fileID: 1086419352113069865, guid: 8a415e2c2210434458836779302bc4d3,
+ type: 3}
+ SourcePrefabToOverride: {fileID: 0}
+ SourceHashToOverride: 0
+ OverridingTargetPrefab: {fileID: 0}
+ - Override: 0
+ Prefab: {fileID: 8059323910720821982, guid: d143db9172e1f234e99d450286b77695,
+ type: 3}
+ SourcePrefabToOverride: {fileID: 0}
+ SourceHashToOverride: 0
+ OverridingTargetPrefab: {fileID: 0}
TickRate: 30
ClientConnectionBufferTimeout: 10
ConnectionApproval: 0
@@ -1114,7 +1133,7 @@ MonoBehaviour:
SpawnsPerSecond: 2
PoolSize: 10
ObjectSpeed: 8
- EnableHandler: 0
+ EnableHandler: 1
RegisterUsingNetworkObject: 0
ServerObjectToPool: {fileID: 771575417923360811, guid: c0a45bdb516f341498d933b7a7ed4fc1,
type: 3}
diff --git a/testproject/Assets/Tests/Manual/SceneTransitioningAdditive.meta b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive.meta
new file mode 100644
index 0000000000..6ac5deb347
--- /dev/null
+++ b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 31f1b8236850b674a85716389e467ba0
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/AdditiveScene1.unity b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/AdditiveScene1.unity
new file mode 100644
index 0000000000..b30bb53f36
--- /dev/null
+++ b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/AdditiveScene1.unity
@@ -0,0 +1,259 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!29 &1
+OcclusionCullingSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_OcclusionBakeSettings:
+ smallestOccluder: 5
+ smallestHole: 0.25
+ backfaceThreshold: 100
+ m_SceneGUID: 00000000000000000000000000000000
+ m_OcclusionCullingData: {fileID: 0}
+--- !u!104 &2
+RenderSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 9
+ m_Fog: 0
+ m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
+ m_FogMode: 3
+ m_FogDensity: 0.01
+ m_LinearFogStart: 0
+ m_LinearFogEnd: 300
+ m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}
+ m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
+ m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
+ m_AmbientIntensity: 1
+ m_AmbientMode: 0
+ m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
+ m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0}
+ m_HaloStrength: 0.5
+ m_FlareStrength: 1
+ m_FlareFadeSpeed: 3
+ m_HaloTexture: {fileID: 0}
+ m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
+ m_DefaultReflectionMode: 0
+ m_DefaultReflectionResolution: 128
+ m_ReflectionBounces: 1
+ m_ReflectionIntensity: 1
+ m_CustomReflection: {fileID: 0}
+ m_Sun: {fileID: 0}
+ m_IndirectSpecularColor: {r: 0.37311953, g: 0.38074014, b: 0.3587274, a: 1}
+ m_UseRadianceAmbientProbe: 0
+--- !u!157 &3
+LightmapSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 12
+ m_GIWorkflowMode: 1
+ m_GISettings:
+ serializedVersion: 2
+ m_BounceScale: 1
+ m_IndirectOutputScale: 1
+ m_AlbedoBoost: 1
+ m_EnvironmentLightingMode: 0
+ m_EnableBakedLightmaps: 1
+ m_EnableRealtimeLightmaps: 0
+ m_LightmapEditorSettings:
+ serializedVersion: 12
+ m_Resolution: 2
+ m_BakeResolution: 40
+ m_AtlasSize: 1024
+ m_AO: 0
+ m_AOMaxDistance: 1
+ m_CompAOExponent: 1
+ m_CompAOExponentDirect: 0
+ m_ExtractAmbientOcclusion: 0
+ m_Padding: 2
+ m_LightmapParameters: {fileID: 0}
+ m_LightmapsBakeMode: 1
+ m_TextureCompression: 1
+ m_FinalGather: 0
+ m_FinalGatherFiltering: 1
+ m_FinalGatherRayCount: 256
+ m_ReflectionCompression: 2
+ m_MixedBakeMode: 2
+ m_BakeBackend: 1
+ m_PVRSampling: 1
+ m_PVRDirectSampleCount: 32
+ m_PVRSampleCount: 512
+ m_PVRBounces: 2
+ m_PVREnvironmentSampleCount: 256
+ m_PVREnvironmentReferencePointCount: 2048
+ m_PVRFilteringMode: 1
+ m_PVRDenoiserTypeDirect: 1
+ m_PVRDenoiserTypeIndirect: 1
+ m_PVRDenoiserTypeAO: 1
+ m_PVRFilterTypeDirect: 0
+ m_PVRFilterTypeIndirect: 0
+ m_PVRFilterTypeAO: 0
+ m_PVREnvironmentMIS: 1
+ m_PVRCulling: 1
+ m_PVRFilteringGaussRadiusDirect: 1
+ m_PVRFilteringGaussRadiusIndirect: 5
+ m_PVRFilteringGaussRadiusAO: 2
+ m_PVRFilteringAtrousPositionSigmaDirect: 0.5
+ m_PVRFilteringAtrousPositionSigmaIndirect: 2
+ m_PVRFilteringAtrousPositionSigmaAO: 1
+ m_ExportTrainingData: 0
+ m_TrainingDataDestination: TrainingData
+ m_LightProbeSampleCountMultiplier: 4
+ m_LightingDataAsset: {fileID: 0}
+ m_LightingSettings: {fileID: 903034822}
+--- !u!196 &4
+NavMeshSettings:
+ serializedVersion: 2
+ m_ObjectHideFlags: 0
+ m_BuildSettings:
+ serializedVersion: 2
+ agentTypeID: 0
+ agentRadius: 0.5
+ agentHeight: 2
+ agentSlope: 45
+ agentClimb: 0.4
+ ledgeDropHeight: 0
+ maxJumpAcrossDistance: 0
+ minRegionArea: 2
+ manualCellSize: 0
+ cellSize: 0.16666667
+ manualTileSize: 0
+ tileSize: 256
+ accuratePlacement: 0
+ maxJobWorkers: 0
+ preserveTilesOutsideBounds: 0
+ debug:
+ m_Flags: 0
+ m_NavMeshData: {fileID: 0}
+--- !u!850595691 &903034822
+LightingSettings:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name:
+ serializedVersion: 3
+ m_GIWorkflowMode: 1
+ m_EnableBakedLightmaps: 1
+ m_EnableRealtimeLightmaps: 0
+ m_RealtimeEnvironmentLighting: 1
+ m_BounceScale: 1
+ m_AlbedoBoost: 1
+ m_IndirectOutputScale: 1
+ m_UsingShadowmask: 1
+ m_BakeBackend: 1
+ m_LightmapMaxSize: 1024
+ m_BakeResolution: 40
+ m_Padding: 2
+ m_TextureCompression: 1
+ m_AO: 0
+ m_AOMaxDistance: 1
+ m_CompAOExponent: 1
+ m_CompAOExponentDirect: 0
+ m_ExtractAO: 0
+ m_MixedBakeMode: 2
+ m_LightmapsBakeMode: 1
+ m_FilterMode: 1
+ m_LightmapParameters: {fileID: 15204, guid: 0000000000000000f000000000000000, type: 0}
+ m_ExportTrainingData: 0
+ m_TrainingDataDestination: TrainingData
+ m_RealtimeResolution: 2
+ m_ForceWhiteAlbedo: 0
+ m_ForceUpdates: 0
+ m_FinalGather: 0
+ m_FinalGatherRayCount: 256
+ m_FinalGatherFiltering: 1
+ m_PVRCulling: 1
+ m_PVRSampling: 1
+ m_PVRDirectSampleCount: 32
+ m_PVRSampleCount: 512
+ m_PVREnvironmentSampleCount: 256
+ m_PVREnvironmentReferencePointCount: 2048
+ m_LightProbeSampleCountMultiplier: 4
+ m_PVRBounces: 2
+ m_PVRMinBounces: 1
+ m_PVREnvironmentMIS: 1
+ m_PVRFilteringMode: 1
+ m_PVRDenoiserTypeDirect: 1
+ m_PVRDenoiserTypeIndirect: 1
+ m_PVRDenoiserTypeAO: 1
+ m_PVRFilterTypeDirect: 0
+ m_PVRFilterTypeIndirect: 0
+ m_PVRFilterTypeAO: 0
+ m_PVRFilteringGaussRadiusDirect: 1
+ m_PVRFilteringGaussRadiusIndirect: 5
+ m_PVRFilteringGaussRadiusAO: 2
+ m_PVRFilteringAtrousPositionSigmaDirect: 0.5
+ m_PVRFilteringAtrousPositionSigmaIndirect: 2
+ m_PVRFilteringAtrousPositionSigmaAO: 1
+--- !u!1 &1113539278
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1113539280}
+ - component: {fileID: 1113539281}
+ - component: {fileID: 1113539279}
+ m_Layer: 0
+ m_Name: PooledPrefabSpawnHandler
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!114 &1113539279
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1113539278}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 398d7c0793567354082687193357a99f, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ RandomMovement: 0
+ AutoSpawnEnable: 1
+ SpawnInSourceScene: 0
+ DestroyOnUnload: 1
+ InitialSpawnDelay: 0.2
+ SpawnsPerSecond: 1
+ PoolSize: 32
+ ObjectSpeed: 8
+ EnableHandler: 1
+ RegisterUsingNetworkObject: 0
+ ServerObjectToPool: {fileID: 1086419352113069865, guid: ed799d5402b325c4f8f41918224a1ba7,
+ type: 3}
+ ClientObjectToPool: {fileID: 0}
+--- !u!4 &1113539280
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1113539278}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0.5, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &1113539281
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1113539278}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ GlobalObjectIdHash: 3066165563
+ AlwaysReplicateAsRoot: 0
+ DontDestroyWithOwner: 0
+ AutoObjectParentSync: 1
diff --git a/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/AdditiveScene1.unity.meta b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/AdditiveScene1.unity.meta
new file mode 100644
index 0000000000..17079dbe11
--- /dev/null
+++ b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/AdditiveScene1.unity.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 41a0239b0c49e2047b7063c822f0df8a
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/AdditiveScene2.unity b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/AdditiveScene2.unity
new file mode 100644
index 0000000000..20858cb73a
--- /dev/null
+++ b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/AdditiveScene2.unity
@@ -0,0 +1,258 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!29 &1
+OcclusionCullingSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_OcclusionBakeSettings:
+ smallestOccluder: 5
+ smallestHole: 0.25
+ backfaceThreshold: 100
+ m_SceneGUID: 00000000000000000000000000000000
+ m_OcclusionCullingData: {fileID: 0}
+--- !u!104 &2
+RenderSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 9
+ m_Fog: 0
+ m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
+ m_FogMode: 3
+ m_FogDensity: 0.01
+ m_LinearFogStart: 0
+ m_LinearFogEnd: 300
+ m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}
+ m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
+ m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
+ m_AmbientIntensity: 1
+ m_AmbientMode: 0
+ m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
+ m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0}
+ m_HaloStrength: 0.5
+ m_FlareStrength: 1
+ m_FlareFadeSpeed: 3
+ m_HaloTexture: {fileID: 0}
+ m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
+ m_DefaultReflectionMode: 0
+ m_DefaultReflectionResolution: 128
+ m_ReflectionBounces: 1
+ m_ReflectionIntensity: 1
+ m_CustomReflection: {fileID: 0}
+ m_Sun: {fileID: 0}
+ m_IndirectSpecularColor: {r: 0.37311953, g: 0.38074014, b: 0.3587274, a: 1}
+ m_UseRadianceAmbientProbe: 0
+--- !u!157 &3
+LightmapSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 12
+ m_GIWorkflowMode: 1
+ m_GISettings:
+ serializedVersion: 2
+ m_BounceScale: 1
+ m_IndirectOutputScale: 1
+ m_AlbedoBoost: 1
+ m_EnvironmentLightingMode: 0
+ m_EnableBakedLightmaps: 1
+ m_EnableRealtimeLightmaps: 0
+ m_LightmapEditorSettings:
+ serializedVersion: 12
+ m_Resolution: 2
+ m_BakeResolution: 40
+ m_AtlasSize: 1024
+ m_AO: 0
+ m_AOMaxDistance: 1
+ m_CompAOExponent: 1
+ m_CompAOExponentDirect: 0
+ m_ExtractAmbientOcclusion: 0
+ m_Padding: 2
+ m_LightmapParameters: {fileID: 0}
+ m_LightmapsBakeMode: 1
+ m_TextureCompression: 1
+ m_FinalGather: 0
+ m_FinalGatherFiltering: 1
+ m_FinalGatherRayCount: 256
+ m_ReflectionCompression: 2
+ m_MixedBakeMode: 2
+ m_BakeBackend: 1
+ m_PVRSampling: 1
+ m_PVRDirectSampleCount: 32
+ m_PVRSampleCount: 512
+ m_PVRBounces: 2
+ m_PVREnvironmentSampleCount: 256
+ m_PVREnvironmentReferencePointCount: 2048
+ m_PVRFilteringMode: 1
+ m_PVRDenoiserTypeDirect: 1
+ m_PVRDenoiserTypeIndirect: 1
+ m_PVRDenoiserTypeAO: 1
+ m_PVRFilterTypeDirect: 0
+ m_PVRFilterTypeIndirect: 0
+ m_PVRFilterTypeAO: 0
+ m_PVREnvironmentMIS: 1
+ m_PVRCulling: 1
+ m_PVRFilteringGaussRadiusDirect: 1
+ m_PVRFilteringGaussRadiusIndirect: 5
+ m_PVRFilteringGaussRadiusAO: 2
+ m_PVRFilteringAtrousPositionSigmaDirect: 0.5
+ m_PVRFilteringAtrousPositionSigmaIndirect: 2
+ m_PVRFilteringAtrousPositionSigmaAO: 1
+ m_ExportTrainingData: 0
+ m_TrainingDataDestination: TrainingData
+ m_LightProbeSampleCountMultiplier: 4
+ m_LightingDataAsset: {fileID: 0}
+ m_LightingSettings: {fileID: 903034822}
+--- !u!196 &4
+NavMeshSettings:
+ serializedVersion: 2
+ m_ObjectHideFlags: 0
+ m_BuildSettings:
+ serializedVersion: 2
+ agentTypeID: 0
+ agentRadius: 0.5
+ agentHeight: 2
+ agentSlope: 45
+ agentClimb: 0.4
+ ledgeDropHeight: 0
+ maxJumpAcrossDistance: 0
+ minRegionArea: 2
+ manualCellSize: 0
+ cellSize: 0.16666667
+ manualTileSize: 0
+ tileSize: 256
+ accuratePlacement: 0
+ maxJobWorkers: 0
+ preserveTilesOutsideBounds: 0
+ debug:
+ m_Flags: 0
+ m_NavMeshData: {fileID: 0}
+--- !u!850595691 &903034822
+LightingSettings:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name:
+ serializedVersion: 3
+ m_GIWorkflowMode: 1
+ m_EnableBakedLightmaps: 1
+ m_EnableRealtimeLightmaps: 0
+ m_RealtimeEnvironmentLighting: 1
+ m_BounceScale: 1
+ m_AlbedoBoost: 1
+ m_IndirectOutputScale: 1
+ m_UsingShadowmask: 1
+ m_BakeBackend: 1
+ m_LightmapMaxSize: 1024
+ m_BakeResolution: 40
+ m_Padding: 2
+ m_TextureCompression: 1
+ m_AO: 0
+ m_AOMaxDistance: 1
+ m_CompAOExponent: 1
+ m_CompAOExponentDirect: 0
+ m_ExtractAO: 0
+ m_MixedBakeMode: 2
+ m_LightmapsBakeMode: 1
+ m_FilterMode: 1
+ m_LightmapParameters: {fileID: 15204, guid: 0000000000000000f000000000000000, type: 0}
+ m_ExportTrainingData: 0
+ m_TrainingDataDestination: TrainingData
+ m_RealtimeResolution: 2
+ m_ForceWhiteAlbedo: 0
+ m_ForceUpdates: 0
+ m_FinalGather: 0
+ m_FinalGatherRayCount: 256
+ m_FinalGatherFiltering: 1
+ m_PVRCulling: 1
+ m_PVRSampling: 1
+ m_PVRDirectSampleCount: 32
+ m_PVRSampleCount: 512
+ m_PVREnvironmentSampleCount: 256
+ m_PVREnvironmentReferencePointCount: 2048
+ m_LightProbeSampleCountMultiplier: 4
+ m_PVRBounces: 2
+ m_PVRMinBounces: 1
+ m_PVREnvironmentMIS: 1
+ m_PVRFilteringMode: 1
+ m_PVRDenoiserTypeDirect: 1
+ m_PVRDenoiserTypeIndirect: 1
+ m_PVRDenoiserTypeAO: 1
+ m_PVRFilterTypeDirect: 0
+ m_PVRFilterTypeIndirect: 0
+ m_PVRFilterTypeAO: 0
+ m_PVRFilteringGaussRadiusDirect: 1
+ m_PVRFilteringGaussRadiusIndirect: 5
+ m_PVRFilteringGaussRadiusAO: 2
+ m_PVRFilteringAtrousPositionSigmaDirect: 0.5
+ m_PVRFilteringAtrousPositionSigmaIndirect: 2
+ m_PVRFilteringAtrousPositionSigmaAO: 1
+--- !u!1 &1113539278
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1113539280}
+ - component: {fileID: 1113539281}
+ - component: {fileID: 1113539282}
+ m_Layer: 0
+ m_Name: PooledPrefabSpawnHandler
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &1113539280
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1113539278}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0.5, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &1113539281
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1113539278}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ GlobalObjectIdHash: 156686626
+ AlwaysReplicateAsRoot: 0
+ DontDestroyWithOwner: 0
+ AutoObjectParentSync: 1
+--- !u!114 &1113539282
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1113539278}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 398d7c0793567354082687193357a99f, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ RandomMovement: 0
+ AutoSpawnEnable: 1
+ SpawnInSourceScene: 0
+ InitialSpawnDelay: 0.2
+ SpawnsPerSecond: 1
+ PoolSize: 32
+ ObjectSpeed: 8
+ EnableHandler: 1
+ RegisterUsingNetworkObject: 0
+ ServerObjectToPool: {fileID: 1086419352113069865, guid: 8a415e2c2210434458836779302bc4d3,
+ type: 3}
+ ClientObjectToPool: {fileID: 0}
diff --git a/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/AdditiveScene2.unity.meta b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/AdditiveScene2.unity.meta
new file mode 100644
index 0000000000..ab923a2625
--- /dev/null
+++ b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/AdditiveScene2.unity.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: c6a3d883c8253ee43bca4f2b03797d7b
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/AdditiveScene3.unity b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/AdditiveScene3.unity
new file mode 100644
index 0000000000..8dc2e1ff99
--- /dev/null
+++ b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/AdditiveScene3.unity
@@ -0,0 +1,260 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!29 &1
+OcclusionCullingSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_OcclusionBakeSettings:
+ smallestOccluder: 5
+ smallestHole: 0.25
+ backfaceThreshold: 100
+ m_SceneGUID: 00000000000000000000000000000000
+ m_OcclusionCullingData: {fileID: 0}
+--- !u!104 &2
+RenderSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 9
+ m_Fog: 0
+ m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
+ m_FogMode: 3
+ m_FogDensity: 0.01
+ m_LinearFogStart: 0
+ m_LinearFogEnd: 300
+ m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}
+ m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
+ m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
+ m_AmbientIntensity: 1
+ m_AmbientMode: 0
+ m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
+ m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0}
+ m_HaloStrength: 0.5
+ m_FlareStrength: 1
+ m_FlareFadeSpeed: 3
+ m_HaloTexture: {fileID: 0}
+ m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
+ m_DefaultReflectionMode: 0
+ m_DefaultReflectionResolution: 128
+ m_ReflectionBounces: 1
+ m_ReflectionIntensity: 1
+ m_CustomReflection: {fileID: 0}
+ m_Sun: {fileID: 0}
+ m_IndirectSpecularColor: {r: 0.37311953, g: 0.38074014, b: 0.3587274, a: 1}
+ m_UseRadianceAmbientProbe: 0
+--- !u!157 &3
+LightmapSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 12
+ m_GIWorkflowMode: 1
+ m_GISettings:
+ serializedVersion: 2
+ m_BounceScale: 1
+ m_IndirectOutputScale: 1
+ m_AlbedoBoost: 1
+ m_EnvironmentLightingMode: 0
+ m_EnableBakedLightmaps: 1
+ m_EnableRealtimeLightmaps: 0
+ m_LightmapEditorSettings:
+ serializedVersion: 12
+ m_Resolution: 2
+ m_BakeResolution: 40
+ m_AtlasSize: 1024
+ m_AO: 0
+ m_AOMaxDistance: 1
+ m_CompAOExponent: 1
+ m_CompAOExponentDirect: 0
+ m_ExtractAmbientOcclusion: 0
+ m_Padding: 2
+ m_LightmapParameters: {fileID: 0}
+ m_LightmapsBakeMode: 1
+ m_TextureCompression: 1
+ m_FinalGather: 0
+ m_FinalGatherFiltering: 1
+ m_FinalGatherRayCount: 256
+ m_ReflectionCompression: 2
+ m_MixedBakeMode: 2
+ m_BakeBackend: 1
+ m_PVRSampling: 1
+ m_PVRDirectSampleCount: 32
+ m_PVRSampleCount: 512
+ m_PVRBounces: 2
+ m_PVREnvironmentSampleCount: 256
+ m_PVREnvironmentReferencePointCount: 2048
+ m_PVRFilteringMode: 1
+ m_PVRDenoiserTypeDirect: 1
+ m_PVRDenoiserTypeIndirect: 1
+ m_PVRDenoiserTypeAO: 1
+ m_PVRFilterTypeDirect: 0
+ m_PVRFilterTypeIndirect: 0
+ m_PVRFilterTypeAO: 0
+ m_PVREnvironmentMIS: 1
+ m_PVRCulling: 1
+ m_PVRFilteringGaussRadiusDirect: 1
+ m_PVRFilteringGaussRadiusIndirect: 5
+ m_PVRFilteringGaussRadiusAO: 2
+ m_PVRFilteringAtrousPositionSigmaDirect: 0.5
+ m_PVRFilteringAtrousPositionSigmaIndirect: 2
+ m_PVRFilteringAtrousPositionSigmaAO: 1
+ m_ExportTrainingData: 0
+ m_TrainingDataDestination: TrainingData
+ m_LightProbeSampleCountMultiplier: 4
+ m_LightingDataAsset: {fileID: 0}
+ m_LightingSettings: {fileID: 903034822}
+--- !u!196 &4
+NavMeshSettings:
+ serializedVersion: 2
+ m_ObjectHideFlags: 0
+ m_BuildSettings:
+ serializedVersion: 2
+ agentTypeID: 0
+ agentRadius: 0.5
+ agentHeight: 2
+ agentSlope: 45
+ agentClimb: 0.4
+ ledgeDropHeight: 0
+ maxJumpAcrossDistance: 0
+ minRegionArea: 2
+ manualCellSize: 0
+ cellSize: 0.16666667
+ manualTileSize: 0
+ tileSize: 256
+ accuratePlacement: 0
+ maxJobWorkers: 0
+ preserveTilesOutsideBounds: 0
+ debug:
+ m_Flags: 0
+ m_NavMeshData: {fileID: 0}
+--- !u!850595691 &903034822
+LightingSettings:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name:
+ serializedVersion: 3
+ m_GIWorkflowMode: 1
+ m_EnableBakedLightmaps: 1
+ m_EnableRealtimeLightmaps: 0
+ m_RealtimeEnvironmentLighting: 1
+ m_BounceScale: 1
+ m_AlbedoBoost: 1
+ m_IndirectOutputScale: 1
+ m_UsingShadowmask: 1
+ m_BakeBackend: 1
+ m_LightmapMaxSize: 1024
+ m_BakeResolution: 40
+ m_Padding: 2
+ m_TextureCompression: 1
+ m_AO: 0
+ m_AOMaxDistance: 1
+ m_CompAOExponent: 1
+ m_CompAOExponentDirect: 0
+ m_ExtractAO: 0
+ m_MixedBakeMode: 2
+ m_LightmapsBakeMode: 1
+ m_FilterMode: 1
+ m_LightmapParameters: {fileID: 15204, guid: 0000000000000000f000000000000000, type: 0}
+ m_ExportTrainingData: 0
+ m_TrainingDataDestination: TrainingData
+ m_RealtimeResolution: 2
+ m_ForceWhiteAlbedo: 0
+ m_ForceUpdates: 0
+ m_FinalGather: 0
+ m_FinalGatherRayCount: 256
+ m_FinalGatherFiltering: 1
+ m_PVRCulling: 1
+ m_PVRSampling: 1
+ m_PVRDirectSampleCount: 32
+ m_PVRSampleCount: 512
+ m_PVREnvironmentSampleCount: 256
+ m_PVREnvironmentReferencePointCount: 2048
+ m_LightProbeSampleCountMultiplier: 4
+ m_PVRBounces: 2
+ m_PVRMinBounces: 1
+ m_PVREnvironmentMIS: 1
+ m_PVRFilteringMode: 1
+ m_PVRDenoiserTypeDirect: 1
+ m_PVRDenoiserTypeIndirect: 1
+ m_PVRDenoiserTypeAO: 1
+ m_PVRFilterTypeDirect: 0
+ m_PVRFilterTypeIndirect: 0
+ m_PVRFilterTypeAO: 0
+ m_PVRFilteringGaussRadiusDirect: 1
+ m_PVRFilteringGaussRadiusIndirect: 5
+ m_PVRFilteringGaussRadiusAO: 2
+ m_PVRFilteringAtrousPositionSigmaDirect: 0.5
+ m_PVRFilteringAtrousPositionSigmaIndirect: 2
+ m_PVRFilteringAtrousPositionSigmaAO: 1
+--- !u!1 &1113539278
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1113539280}
+ - component: {fileID: 1113539281}
+ - component: {fileID: 1113539282}
+ m_Layer: 0
+ m_Name: PooledPrefabSpawnHandler
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &1113539280
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1113539278}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0.5, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &1113539281
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1113539278}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ GlobalObjectIdHash: 4279522617
+ AlwaysReplicateAsRoot: 0
+ DontDestroyWithOwner: 0
+ AutoObjectParentSync: 1
+--- !u!114 &1113539282
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1113539278}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 398d7c0793567354082687193357a99f, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ RandomMovement: 0
+ AutoSpawnEnable: 1
+ SpawnInSourceScene: 1
+ DestroyOnUnload: 1
+ InitialSpawnDelay: 0.2
+ SpawnsPerSecond: 3
+ PoolSize: 32
+ ObjectSpeed: 8
+ EnableHandler: 1
+ RegisterUsingNetworkObject: 0
+ ServerObjectToPool: {fileID: 5781804285550429985, guid: 27c27433e278c054dbe3bae7d411cfab,
+ type: 3}
+ ClientObjectToPool: {fileID: 238713212259395427, guid: 0aca3eef90d204641888a517edcc951f,
+ type: 3}
diff --git a/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/AdditiveScene3.unity.meta b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/AdditiveScene3.unity.meta
new file mode 100644
index 0000000000..4af8fab024
--- /dev/null
+++ b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/AdditiveScene3.unity.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 7da3dd618f5b5a34db1f6d3c9511e221
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/AdditiveScene4.unity b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/AdditiveScene4.unity
new file mode 100644
index 0000000000..16d9e311c2
--- /dev/null
+++ b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/AdditiveScene4.unity
@@ -0,0 +1,259 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!29 &1
+OcclusionCullingSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_OcclusionBakeSettings:
+ smallestOccluder: 5
+ smallestHole: 0.25
+ backfaceThreshold: 100
+ m_SceneGUID: 00000000000000000000000000000000
+ m_OcclusionCullingData: {fileID: 0}
+--- !u!104 &2
+RenderSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 9
+ m_Fog: 0
+ m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
+ m_FogMode: 3
+ m_FogDensity: 0.01
+ m_LinearFogStart: 0
+ m_LinearFogEnd: 300
+ m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}
+ m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
+ m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
+ m_AmbientIntensity: 1
+ m_AmbientMode: 0
+ m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
+ m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0}
+ m_HaloStrength: 0.5
+ m_FlareStrength: 1
+ m_FlareFadeSpeed: 3
+ m_HaloTexture: {fileID: 0}
+ m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
+ m_DefaultReflectionMode: 0
+ m_DefaultReflectionResolution: 128
+ m_ReflectionBounces: 1
+ m_ReflectionIntensity: 1
+ m_CustomReflection: {fileID: 0}
+ m_Sun: {fileID: 0}
+ m_IndirectSpecularColor: {r: 0.37311953, g: 0.38074014, b: 0.3587274, a: 1}
+ m_UseRadianceAmbientProbe: 0
+--- !u!157 &3
+LightmapSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 12
+ m_GIWorkflowMode: 1
+ m_GISettings:
+ serializedVersion: 2
+ m_BounceScale: 1
+ m_IndirectOutputScale: 1
+ m_AlbedoBoost: 1
+ m_EnvironmentLightingMode: 0
+ m_EnableBakedLightmaps: 1
+ m_EnableRealtimeLightmaps: 0
+ m_LightmapEditorSettings:
+ serializedVersion: 12
+ m_Resolution: 2
+ m_BakeResolution: 40
+ m_AtlasSize: 1024
+ m_AO: 0
+ m_AOMaxDistance: 1
+ m_CompAOExponent: 1
+ m_CompAOExponentDirect: 0
+ m_ExtractAmbientOcclusion: 0
+ m_Padding: 2
+ m_LightmapParameters: {fileID: 0}
+ m_LightmapsBakeMode: 1
+ m_TextureCompression: 1
+ m_FinalGather: 0
+ m_FinalGatherFiltering: 1
+ m_FinalGatherRayCount: 256
+ m_ReflectionCompression: 2
+ m_MixedBakeMode: 2
+ m_BakeBackend: 1
+ m_PVRSampling: 1
+ m_PVRDirectSampleCount: 32
+ m_PVRSampleCount: 512
+ m_PVRBounces: 2
+ m_PVREnvironmentSampleCount: 256
+ m_PVREnvironmentReferencePointCount: 2048
+ m_PVRFilteringMode: 1
+ m_PVRDenoiserTypeDirect: 1
+ m_PVRDenoiserTypeIndirect: 1
+ m_PVRDenoiserTypeAO: 1
+ m_PVRFilterTypeDirect: 0
+ m_PVRFilterTypeIndirect: 0
+ m_PVRFilterTypeAO: 0
+ m_PVREnvironmentMIS: 1
+ m_PVRCulling: 1
+ m_PVRFilteringGaussRadiusDirect: 1
+ m_PVRFilteringGaussRadiusIndirect: 5
+ m_PVRFilteringGaussRadiusAO: 2
+ m_PVRFilteringAtrousPositionSigmaDirect: 0.5
+ m_PVRFilteringAtrousPositionSigmaIndirect: 2
+ m_PVRFilteringAtrousPositionSigmaAO: 1
+ m_ExportTrainingData: 0
+ m_TrainingDataDestination: TrainingData
+ m_LightProbeSampleCountMultiplier: 4
+ m_LightingDataAsset: {fileID: 0}
+ m_LightingSettings: {fileID: 903034822}
+--- !u!196 &4
+NavMeshSettings:
+ serializedVersion: 2
+ m_ObjectHideFlags: 0
+ m_BuildSettings:
+ serializedVersion: 2
+ agentTypeID: 0
+ agentRadius: 0.5
+ agentHeight: 2
+ agentSlope: 45
+ agentClimb: 0.4
+ ledgeDropHeight: 0
+ maxJumpAcrossDistance: 0
+ minRegionArea: 2
+ manualCellSize: 0
+ cellSize: 0.16666667
+ manualTileSize: 0
+ tileSize: 256
+ accuratePlacement: 0
+ maxJobWorkers: 0
+ preserveTilesOutsideBounds: 0
+ debug:
+ m_Flags: 0
+ m_NavMeshData: {fileID: 0}
+--- !u!850595691 &903034822
+LightingSettings:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name:
+ serializedVersion: 3
+ m_GIWorkflowMode: 1
+ m_EnableBakedLightmaps: 1
+ m_EnableRealtimeLightmaps: 0
+ m_RealtimeEnvironmentLighting: 1
+ m_BounceScale: 1
+ m_AlbedoBoost: 1
+ m_IndirectOutputScale: 1
+ m_UsingShadowmask: 1
+ m_BakeBackend: 1
+ m_LightmapMaxSize: 1024
+ m_BakeResolution: 40
+ m_Padding: 2
+ m_TextureCompression: 1
+ m_AO: 0
+ m_AOMaxDistance: 1
+ m_CompAOExponent: 1
+ m_CompAOExponentDirect: 0
+ m_ExtractAO: 0
+ m_MixedBakeMode: 2
+ m_LightmapsBakeMode: 1
+ m_FilterMode: 1
+ m_LightmapParameters: {fileID: 15204, guid: 0000000000000000f000000000000000, type: 0}
+ m_ExportTrainingData: 0
+ m_TrainingDataDestination: TrainingData
+ m_RealtimeResolution: 2
+ m_ForceWhiteAlbedo: 0
+ m_ForceUpdates: 0
+ m_FinalGather: 0
+ m_FinalGatherRayCount: 256
+ m_FinalGatherFiltering: 1
+ m_PVRCulling: 1
+ m_PVRSampling: 1
+ m_PVRDirectSampleCount: 32
+ m_PVRSampleCount: 512
+ m_PVREnvironmentSampleCount: 256
+ m_PVREnvironmentReferencePointCount: 2048
+ m_LightProbeSampleCountMultiplier: 4
+ m_PVRBounces: 2
+ m_PVRMinBounces: 1
+ m_PVREnvironmentMIS: 1
+ m_PVRFilteringMode: 1
+ m_PVRDenoiserTypeDirect: 1
+ m_PVRDenoiserTypeIndirect: 1
+ m_PVRDenoiserTypeAO: 1
+ m_PVRFilterTypeDirect: 0
+ m_PVRFilterTypeIndirect: 0
+ m_PVRFilterTypeAO: 0
+ m_PVRFilteringGaussRadiusDirect: 1
+ m_PVRFilteringGaussRadiusIndirect: 5
+ m_PVRFilteringGaussRadiusAO: 2
+ m_PVRFilteringAtrousPositionSigmaDirect: 0.5
+ m_PVRFilteringAtrousPositionSigmaIndirect: 2
+ m_PVRFilteringAtrousPositionSigmaAO: 1
+--- !u!1 &1113539278
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1113539280}
+ - component: {fileID: 1113539281}
+ - component: {fileID: 1113539282}
+ m_Layer: 0
+ m_Name: PooledPrefabSpawnHandler
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &1113539280
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1113539278}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0.5, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &1113539281
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1113539278}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ GlobalObjectIdHash: 484425646
+ AlwaysReplicateAsRoot: 0
+ DontDestroyWithOwner: 0
+ AutoObjectParentSync: 1
+--- !u!114 &1113539282
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1113539278}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 398d7c0793567354082687193357a99f, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ RandomMovement: 0
+ AutoSpawnEnable: 1
+ SpawnInSourceScene: 1
+ InitialSpawnDelay: 0.2
+ SpawnsPerSecond: 3
+ PoolSize: 32
+ ObjectSpeed: 8
+ EnableHandler: 1
+ RegisterUsingNetworkObject: 0
+ ServerObjectToPool: {fileID: 5054079819822531224, guid: e04a7aaf01a4ad145a945161a18bf49c,
+ type: 3}
+ ClientObjectToPool: {fileID: 7900845470658144705, guid: 9f2cc6554ae21e3498fb4cc28a07108d,
+ type: 3}
diff --git a/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/AdditiveScene4.unity.meta b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/AdditiveScene4.unity.meta
new file mode 100644
index 0000000000..11941edd35
--- /dev/null
+++ b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/AdditiveScene4.unity.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: dc7e17c86f5ca81478043be306027c13
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/AdditiveSceneMultiInstance.unity b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/AdditiveSceneMultiInstance.unity
new file mode 100644
index 0000000000..5e2a4dcbf1
--- /dev/null
+++ b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/AdditiveSceneMultiInstance.unity
@@ -0,0 +1,260 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!29 &1
+OcclusionCullingSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_OcclusionBakeSettings:
+ smallestOccluder: 5
+ smallestHole: 0.25
+ backfaceThreshold: 100
+ m_SceneGUID: 00000000000000000000000000000000
+ m_OcclusionCullingData: {fileID: 0}
+--- !u!104 &2
+RenderSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 9
+ m_Fog: 0
+ m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
+ m_FogMode: 3
+ m_FogDensity: 0.01
+ m_LinearFogStart: 0
+ m_LinearFogEnd: 300
+ m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}
+ m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
+ m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
+ m_AmbientIntensity: 1
+ m_AmbientMode: 0
+ m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
+ m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0}
+ m_HaloStrength: 0.5
+ m_FlareStrength: 1
+ m_FlareFadeSpeed: 3
+ m_HaloTexture: {fileID: 0}
+ m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
+ m_DefaultReflectionMode: 0
+ m_DefaultReflectionResolution: 128
+ m_ReflectionBounces: 1
+ m_ReflectionIntensity: 1
+ m_CustomReflection: {fileID: 0}
+ m_Sun: {fileID: 0}
+ m_IndirectSpecularColor: {r: 0.37311953, g: 0.38074014, b: 0.3587274, a: 1}
+ m_UseRadianceAmbientProbe: 0
+--- !u!157 &3
+LightmapSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 12
+ m_GIWorkflowMode: 1
+ m_GISettings:
+ serializedVersion: 2
+ m_BounceScale: 1
+ m_IndirectOutputScale: 1
+ m_AlbedoBoost: 1
+ m_EnvironmentLightingMode: 0
+ m_EnableBakedLightmaps: 1
+ m_EnableRealtimeLightmaps: 0
+ m_LightmapEditorSettings:
+ serializedVersion: 12
+ m_Resolution: 2
+ m_BakeResolution: 40
+ m_AtlasSize: 1024
+ m_AO: 0
+ m_AOMaxDistance: 1
+ m_CompAOExponent: 1
+ m_CompAOExponentDirect: 0
+ m_ExtractAmbientOcclusion: 0
+ m_Padding: 2
+ m_LightmapParameters: {fileID: 0}
+ m_LightmapsBakeMode: 1
+ m_TextureCompression: 1
+ m_FinalGather: 0
+ m_FinalGatherFiltering: 1
+ m_FinalGatherRayCount: 256
+ m_ReflectionCompression: 2
+ m_MixedBakeMode: 2
+ m_BakeBackend: 1
+ m_PVRSampling: 1
+ m_PVRDirectSampleCount: 32
+ m_PVRSampleCount: 512
+ m_PVRBounces: 2
+ m_PVREnvironmentSampleCount: 256
+ m_PVREnvironmentReferencePointCount: 2048
+ m_PVRFilteringMode: 1
+ m_PVRDenoiserTypeDirect: 1
+ m_PVRDenoiserTypeIndirect: 1
+ m_PVRDenoiserTypeAO: 1
+ m_PVRFilterTypeDirect: 0
+ m_PVRFilterTypeIndirect: 0
+ m_PVRFilterTypeAO: 0
+ m_PVREnvironmentMIS: 1
+ m_PVRCulling: 1
+ m_PVRFilteringGaussRadiusDirect: 1
+ m_PVRFilteringGaussRadiusIndirect: 5
+ m_PVRFilteringGaussRadiusAO: 2
+ m_PVRFilteringAtrousPositionSigmaDirect: 0.5
+ m_PVRFilteringAtrousPositionSigmaIndirect: 2
+ m_PVRFilteringAtrousPositionSigmaAO: 1
+ m_ExportTrainingData: 0
+ m_TrainingDataDestination: TrainingData
+ m_LightProbeSampleCountMultiplier: 4
+ m_LightingDataAsset: {fileID: 0}
+ m_LightingSettings: {fileID: 903034822}
+--- !u!196 &4
+NavMeshSettings:
+ serializedVersion: 2
+ m_ObjectHideFlags: 0
+ m_BuildSettings:
+ serializedVersion: 2
+ agentTypeID: 0
+ agentRadius: 0.5
+ agentHeight: 2
+ agentSlope: 45
+ agentClimb: 0.4
+ ledgeDropHeight: 0
+ maxJumpAcrossDistance: 0
+ minRegionArea: 2
+ manualCellSize: 0
+ cellSize: 0.16666667
+ manualTileSize: 0
+ tileSize: 256
+ accuratePlacement: 0
+ maxJobWorkers: 0
+ preserveTilesOutsideBounds: 0
+ debug:
+ m_Flags: 0
+ m_NavMeshData: {fileID: 0}
+--- !u!850595691 &903034822
+LightingSettings:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name:
+ serializedVersion: 3
+ m_GIWorkflowMode: 1
+ m_EnableBakedLightmaps: 1
+ m_EnableRealtimeLightmaps: 0
+ m_RealtimeEnvironmentLighting: 1
+ m_BounceScale: 1
+ m_AlbedoBoost: 1
+ m_IndirectOutputScale: 1
+ m_UsingShadowmask: 1
+ m_BakeBackend: 1
+ m_LightmapMaxSize: 1024
+ m_BakeResolution: 40
+ m_Padding: 2
+ m_TextureCompression: 1
+ m_AO: 0
+ m_AOMaxDistance: 1
+ m_CompAOExponent: 1
+ m_CompAOExponentDirect: 0
+ m_ExtractAO: 0
+ m_MixedBakeMode: 2
+ m_LightmapsBakeMode: 1
+ m_FilterMode: 1
+ m_LightmapParameters: {fileID: 15204, guid: 0000000000000000f000000000000000, type: 0}
+ m_ExportTrainingData: 0
+ m_TrainingDataDestination: TrainingData
+ m_RealtimeResolution: 2
+ m_ForceWhiteAlbedo: 0
+ m_ForceUpdates: 0
+ m_FinalGather: 0
+ m_FinalGatherRayCount: 256
+ m_FinalGatherFiltering: 1
+ m_PVRCulling: 1
+ m_PVRSampling: 1
+ m_PVRDirectSampleCount: 32
+ m_PVRSampleCount: 512
+ m_PVREnvironmentSampleCount: 256
+ m_PVREnvironmentReferencePointCount: 2048
+ m_LightProbeSampleCountMultiplier: 4
+ m_PVRBounces: 2
+ m_PVRMinBounces: 1
+ m_PVREnvironmentMIS: 1
+ m_PVRFilteringMode: 1
+ m_PVRDenoiserTypeDirect: 1
+ m_PVRDenoiserTypeIndirect: 1
+ m_PVRDenoiserTypeAO: 1
+ m_PVRFilterTypeDirect: 0
+ m_PVRFilterTypeIndirect: 0
+ m_PVRFilterTypeAO: 0
+ m_PVRFilteringGaussRadiusDirect: 1
+ m_PVRFilteringGaussRadiusIndirect: 5
+ m_PVRFilteringGaussRadiusAO: 2
+ m_PVRFilteringAtrousPositionSigmaDirect: 0.5
+ m_PVRFilteringAtrousPositionSigmaIndirect: 2
+ m_PVRFilteringAtrousPositionSigmaAO: 1
+--- !u!1001 &1247056486
+PrefabInstance:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_Modification:
+ m_TransformParent: {fileID: 0}
+ m_Modifications:
+ - target: {fileID: -5591000292386890817, guid: ea906834639fa3f4ba65c95db6181d6b,
+ type: 3}
+ propertyPath: GlobalObjectIdHash
+ value: 1456498493
+ objectReference: {fileID: 0}
+ - target: {fileID: 771575417923360811, guid: ea906834639fa3f4ba65c95db6181d6b,
+ type: 3}
+ propertyPath: m_Name
+ value: RandomMoverObject
+ objectReference: {fileID: 0}
+ - target: {fileID: 771575417923360822, guid: ea906834639fa3f4ba65c95db6181d6b,
+ type: 3}
+ propertyPath: m_RootOrder
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 771575417923360822, guid: ea906834639fa3f4ba65c95db6181d6b,
+ type: 3}
+ propertyPath: m_LocalPosition.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 771575417923360822, guid: ea906834639fa3f4ba65c95db6181d6b,
+ type: 3}
+ propertyPath: m_LocalPosition.y
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 771575417923360822, guid: ea906834639fa3f4ba65c95db6181d6b,
+ type: 3}
+ propertyPath: m_LocalPosition.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 771575417923360822, guid: ea906834639fa3f4ba65c95db6181d6b,
+ type: 3}
+ propertyPath: m_LocalRotation.w
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 771575417923360822, guid: ea906834639fa3f4ba65c95db6181d6b,
+ type: 3}
+ propertyPath: m_LocalRotation.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 771575417923360822, guid: ea906834639fa3f4ba65c95db6181d6b,
+ type: 3}
+ propertyPath: m_LocalRotation.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 771575417923360822, guid: ea906834639fa3f4ba65c95db6181d6b,
+ type: 3}
+ propertyPath: m_LocalRotation.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 771575417923360822, guid: ea906834639fa3f4ba65c95db6181d6b,
+ type: 3}
+ propertyPath: m_LocalEulerAnglesHint.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 771575417923360822, guid: ea906834639fa3f4ba65c95db6181d6b,
+ type: 3}
+ propertyPath: m_LocalEulerAnglesHint.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 771575417923360822, guid: ea906834639fa3f4ba65c95db6181d6b,
+ type: 3}
+ propertyPath: m_LocalEulerAnglesHint.z
+ value: 0
+ objectReference: {fileID: 0}
+ m_RemovedComponents: []
+ m_SourcePrefab: {fileID: 100100000, guid: ea906834639fa3f4ba65c95db6181d6b, type: 3}
diff --git a/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/AdditiveSceneMultiInstance.unity.meta b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/AdditiveSceneMultiInstance.unity.meta
new file mode 100644
index 0000000000..414a6202d7
--- /dev/null
+++ b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/AdditiveSceneMultiInstance.unity.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 0ae94f636016d3b40bfbecad57d99553
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/AdditiveSceneToggleHandler.cs b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/AdditiveSceneToggleHandler.cs
new file mode 100644
index 0000000000..b1e24eb859
--- /dev/null
+++ b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/AdditiveSceneToggleHandler.cs
@@ -0,0 +1,193 @@
+using System.Collections;
+using UnityEngine;
+using UnityEngine.SceneManagement;
+using UnityEngine.UI;
+#if UNITY_EDITOR
+using UnityEditor;
+#endif
+
+using Unity.Netcode;
+
+namespace TestProject.ManualTests
+{
+ public class AdditiveSceneToggleHandler : NetworkBehaviour
+ {
+ [SerializeField]
+ private bool m_ActivateOnLoad = false;
+
+ private Toggle m_ToggleObject;
+
+ [HideInInspector]
+ [SerializeField]
+ private string m_SceneToLoad;
+
+ private Scene m_SceneLoaded;
+
+#if UNITY_EDITOR
+ [SerializeField]
+ private SceneAsset m_SceneAsset;
+ private void OnValidate()
+ {
+ if (m_SceneAsset != null && m_SceneAsset.name != m_SceneToLoad)
+ {
+ m_SceneToLoad = m_SceneAsset.name;
+ }
+ }
+#endif
+
+ private void Start()
+ {
+ m_ToggleObject = gameObject.GetComponentInChildren();
+ StartCoroutine(CheckForVisibility());
+ }
+
+ private bool m_ExitingScene;
+ private void OnDestroy()
+ {
+ m_ExitingScene = true;
+ StopCoroutine(CheckForVisibility());
+ }
+
+ private IEnumerator CheckForVisibility()
+ {
+ while (!m_ExitingScene)
+ {
+ if (NetworkManager.Singleton && NetworkManager.Singleton.IsListening)
+ {
+ if (m_ToggleObject)
+ {
+ if (NetworkManager.Singleton.IsServer)
+ {
+ m_ToggleObject.gameObject.SetActive(true);
+ if (m_ActivateOnLoad)
+ {
+ StartCoroutine(DelayedActivate());
+ }
+ }
+ else
+ {
+ m_ToggleObject.gameObject.SetActive(false);
+ }
+ }
+ break;
+ }
+ else
+ {
+ if (m_ToggleObject && m_ToggleObject.gameObject.activeInHierarchy)
+ {
+ m_ToggleObject.gameObject.SetActive(false);
+ }
+ }
+
+ yield return new WaitForSeconds(0.1f);
+ }
+
+ yield return null;
+ }
+
+ private void SceneManager_OnSceneEvent(SceneEvent sceneEvent)
+ {
+ if (NetworkManager.Singleton != null && NetworkManager.Singleton.IsListening && NetworkManager.Singleton.IsServer)
+ {
+ if (sceneEvent.SceneEventType == SceneEventData.SceneEventTypes.C2S_LoadComplete)
+ {
+ if (sceneEvent.ClientId == NetworkManager.Singleton.ServerClientId && !m_SceneLoaded.IsValid()
+ && sceneEvent.Scene.IsValid() && sceneEvent.Scene.name == m_SceneToLoad)
+ {
+ m_SceneLoaded = sceneEvent.Scene;
+ m_WaitForSceneLoadOrUnload = false;
+ }
+ }
+ else if (sceneEvent.SceneEventType == SceneEventData.SceneEventTypes.C2S_UnloadComplete)
+ {
+ if (sceneEvent.ClientId == NetworkManager.Singleton.ServerClientId && !m_SceneLoaded.isLoaded)
+ {
+ m_SceneLoaded = new Scene();
+ m_WaitForSceneLoadOrUnload = false;
+ }
+ }
+ }
+ }
+
+ private IEnumerator DelayedActivate()
+ {
+ yield return new WaitForSeconds(0.5f);
+ if (m_ToggleObject)
+ {
+ m_ToggleObject.isOn = true;
+ }
+ yield return null;
+ }
+
+ public void OnToggle()
+ {
+ if (NetworkManager.Singleton && NetworkManager.Singleton.IsListening && NetworkManager.Singleton.IsServer)
+ {
+ if (m_ToggleObject)
+ {
+ m_ToggleObject.enabled = false;
+ StartCoroutine(SceneEventCoroutine(m_ToggleObject.isOn));
+ }
+ }
+ }
+
+ private bool m_WaitForSceneLoadOrUnload;
+
+ private IEnumerator SceneEventCoroutine(bool isLoading)
+ {
+ var sceneEventProgressStatus = SceneEventProgressStatus.None;
+ var continueCheck = true;
+ NetworkManager.Singleton.SceneManager.OnSceneEvent += SceneManager_OnSceneEvent;
+ while (continueCheck && sceneEventProgressStatus != SceneEventProgressStatus.Started)
+ {
+ if (isLoading)
+ {
+ sceneEventProgressStatus = NetworkManager.Singleton.SceneManager.LoadScene(m_SceneToLoad, LoadSceneMode.Additive);
+ }
+ else
+ {
+ sceneEventProgressStatus = NetworkManager.Singleton.SceneManager.UnloadScene(m_SceneLoaded);
+ }
+ if (sceneEventProgressStatus == SceneEventProgressStatus.SceneEventInProgress)
+ {
+ yield return new WaitForSeconds(0.25f);
+ }
+ else
+ {
+ switch (sceneEventProgressStatus)
+ {
+ case SceneEventProgressStatus.Started:
+ {
+ continueCheck = false;
+ break;
+ }
+ case SceneEventProgressStatus.InternalNetcodeError:
+ case SceneEventProgressStatus.InvalidSceneName:
+ case SceneEventProgressStatus.SceneNotLoaded:
+ {
+ continueCheck = false;
+ break;
+ }
+ }
+ }
+ }
+ m_WaitForSceneLoadOrUnload = true;
+ var timeOutAfter = Time.realtimeSinceStartup + 10.0f;
+ while (m_WaitForSceneLoadOrUnload)
+ {
+ if (timeOutAfter < Time.realtimeSinceStartup)
+ {
+ Debug.LogWarning("Timed out waiting for scene to load or unload!");
+ m_WaitForSceneLoadOrUnload = false;
+ }
+ yield return new WaitForSeconds(0.5f);
+ }
+
+
+ NetworkManager.Singleton.SceneManager.OnSceneEvent -= SceneManager_OnSceneEvent;
+ m_ToggleObject.isOn = isLoading;
+ m_ToggleObject.enabled = true;
+ yield return null;
+ }
+ }
+}
diff --git a/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/AdditiveSceneToggleHandler.cs.meta b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/AdditiveSceneToggleHandler.cs.meta
new file mode 100644
index 0000000000..587e6a2649
--- /dev/null
+++ b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/AdditiveSceneToggleHandler.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 475de064003ff104fb88b1fbccd0f417
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/NetworkManagerMonitor.cs b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/NetworkManagerMonitor.cs
new file mode 100644
index 0000000000..42242c3278
--- /dev/null
+++ b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/NetworkManagerMonitor.cs
@@ -0,0 +1,26 @@
+using UnityEngine;
+using Unity.Netcode;
+
+///
+/// This can be added to the same GameObject the NetworkManager component is assigned to in order to prevent
+/// multiple NetworkManager instances from being instantiated if the same scene is loaded.
+///
+public class NetworkManagerMonitor : MonoBehaviour
+{
+ // Start is called before the first frame update
+ private void Start()
+ {
+ var networkManagerInstances = FindObjectsOfType();
+ foreach (var instance in networkManagerInstances)
+ {
+ if (instance.IsListening)
+ {
+ if (gameObject != instance.gameObject)
+ {
+ var networkManager = GetComponent();
+ Destroy(gameObject);
+ }
+ }
+ }
+ }
+}
diff --git a/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/NetworkManagerMonitor.cs.meta b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/NetworkManagerMonitor.cs.meta
new file mode 100644
index 0000000000..36a192a307
--- /dev/null
+++ b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/NetworkManagerMonitor.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 0e6f8504d891fc44881b2d9703017d03
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/SceneEventNotificationQueue.cs b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/SceneEventNotificationQueue.cs
new file mode 100644
index 0000000000..6e36aa912f
--- /dev/null
+++ b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/SceneEventNotificationQueue.cs
@@ -0,0 +1,107 @@
+using System.Collections.Generic;
+using System.Linq;
+using UnityEngine;
+using Unity.Netcode;
+
+namespace TestProject.ManualTests
+{
+ ///
+ /// Logs to console all NetworkSceneManager Scene Events
+ /// This is only meant to be used as a tool to detect all notifications that occur during
+ /// scene events. This was created to detect the edge case scene event scenarios during
+ /// single mode scene loading events and can be used as a manual test to verify additive
+ /// scenes are being intentionally unloaded during a single mode scene loading event.
+ /// Note: this should be added to the parent GameObject of your NetworkManager component
+ /// and will only work if NetworkManager's "Don't Destroy" is true.
+ ///
+ public class SceneEventNotificationQueue : MonoBehaviour
+ {
+ public bool LogToConsole;
+
+ [Range(1, 30)]
+ public float TimeToLive = 10.0f;
+
+ private bool m_IsInitialized;
+
+ private class SceneEventNotification
+ {
+ public float TimeToLive;
+ public string SceneEvent;
+ }
+
+ private Queue m_SceneEvents = new Queue();
+
+ private NetworkManager m_NetworkManager;
+
+ private void Start()
+ {
+ m_NetworkManager = gameObject.GetComponent();
+ }
+
+ ///
+ /// Invoked on all local scene event notifications
+ ///
+ ///
+ private void OnSceneEvent(SceneEvent sceneEvent)
+ {
+ var sceneEventMsg = $"({NetworkManager.Singleton.LocalClientId})-[{sceneEvent.ClientId} | {sceneEvent.SceneEventType} | {sceneEvent.SceneName}";
+ if (sceneEvent.SceneEventType == SceneEventData.SceneEventTypes.S2C_Load || sceneEvent.SceneEventType == SceneEventData.SceneEventTypes.C2S_LoadComplete)
+ {
+ sceneEventMsg += $" | { sceneEvent.LoadSceneMode}";
+ }
+
+ if (sceneEvent.SceneEventType == SceneEventData.SceneEventTypes.S2C_UnLoadComplete || sceneEvent.SceneEventType == SceneEventData.SceneEventTypes.S2C_LoadComplete)
+ {
+ sceneEventMsg += $" | Loaded ({sceneEvent.ClientsThatCompleted.Count}) : (";
+ foreach (var clientId in sceneEvent.ClientsThatCompleted)
+ {
+ sceneEventMsg += $"{clientId}, ";
+ }
+ sceneEventMsg += $") | TimedOut ({sceneEvent.ClientsThatTimedOut.Count}) : (";
+ foreach (var clientId in sceneEvent.ClientsThatTimedOut)
+ {
+ sceneEventMsg += $"{clientId}, ";
+ }
+ sceneEventMsg += ")";
+ }
+ sceneEventMsg += "]";
+
+ m_SceneEvents.Enqueue(new SceneEventNotification() { SceneEvent = sceneEventMsg, TimeToLive = Time.realtimeSinceStartup + TimeToLive });
+ if (LogToConsole)
+ {
+ Debug.Log(sceneEventMsg);
+ }
+ }
+
+ ///
+ /// Returns the current scene event notifications
+ ///
+ ///
+ public List GetCurrentNotifications()
+ {
+ return m_SceneEvents.Select(c => c.SceneEvent).ToList();
+ }
+
+ private void Update()
+ {
+ if (m_NetworkManager != null && m_NetworkManager.IsListening)
+ {
+ if (!m_IsInitialized)
+ {
+ m_NetworkManager.SceneManager.OnSceneEvent += OnSceneEvent;
+ m_IsInitialized = true;
+ }
+
+ if (m_SceneEvents.Count() > 0 && m_SceneEvents.Peek().TimeToLive < Time.realtimeSinceStartup)
+ {
+ m_SceneEvents.Dequeue();
+ }
+ }
+ else if (m_IsInitialized)
+ {
+ m_IsInitialized = false;
+ m_NetworkManager.SceneManager.OnSceneEvent -= OnSceneEvent;
+ }
+ }
+ }
+}
diff --git a/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/SceneEventNotificationQueue.cs.meta b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/SceneEventNotificationQueue.cs.meta
new file mode 100644
index 0000000000..7f72d1c976
--- /dev/null
+++ b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/SceneEventNotificationQueue.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 71c52a32bd1c1c84691050b6d045ab4a
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/SceneTransitioningBase1.unity b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/SceneTransitioningBase1.unity
new file mode 100644
index 0000000000..54c12bae18
--- /dev/null
+++ b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/SceneTransitioningBase1.unity
@@ -0,0 +1,5063 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!29 &1
+OcclusionCullingSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_OcclusionBakeSettings:
+ smallestOccluder: 5
+ smallestHole: 0.25
+ backfaceThreshold: 100
+ m_SceneGUID: 00000000000000000000000000000000
+ m_OcclusionCullingData: {fileID: 0}
+--- !u!104 &2
+RenderSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 9
+ m_Fog: 0
+ m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
+ m_FogMode: 3
+ m_FogDensity: 0.01
+ m_LinearFogStart: 0
+ m_LinearFogEnd: 300
+ m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}
+ m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
+ m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
+ m_AmbientIntensity: 1
+ m_AmbientMode: 0
+ m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
+ m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0}
+ m_HaloStrength: 0.5
+ m_FlareStrength: 1
+ m_FlareFadeSpeed: 3
+ m_HaloTexture: {fileID: 0}
+ m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
+ m_DefaultReflectionMode: 0
+ m_DefaultReflectionResolution: 128
+ m_ReflectionBounces: 1
+ m_ReflectionIntensity: 1
+ m_CustomReflection: {fileID: 0}
+ m_Sun: {fileID: 0}
+ m_IndirectSpecularColor: {r: 0.44657898, g: 0.4964133, b: 0.5748178, a: 1}
+ m_UseRadianceAmbientProbe: 0
+--- !u!157 &3
+LightmapSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 12
+ m_GIWorkflowMode: 1
+ m_GISettings:
+ serializedVersion: 2
+ m_BounceScale: 1
+ m_IndirectOutputScale: 1
+ m_AlbedoBoost: 1
+ m_EnvironmentLightingMode: 0
+ m_EnableBakedLightmaps: 1
+ m_EnableRealtimeLightmaps: 0
+ m_LightmapEditorSettings:
+ serializedVersion: 12
+ m_Resolution: 2
+ m_BakeResolution: 40
+ m_AtlasSize: 1024
+ m_AO: 0
+ m_AOMaxDistance: 1
+ m_CompAOExponent: 1
+ m_CompAOExponentDirect: 0
+ m_ExtractAmbientOcclusion: 0
+ m_Padding: 2
+ m_LightmapParameters: {fileID: 0}
+ m_LightmapsBakeMode: 1
+ m_TextureCompression: 1
+ m_FinalGather: 0
+ m_FinalGatherFiltering: 1
+ m_FinalGatherRayCount: 256
+ m_ReflectionCompression: 2
+ m_MixedBakeMode: 2
+ m_BakeBackend: 1
+ m_PVRSampling: 1
+ m_PVRDirectSampleCount: 32
+ m_PVRSampleCount: 512
+ m_PVRBounces: 2
+ m_PVREnvironmentSampleCount: 256
+ m_PVREnvironmentReferencePointCount: 2048
+ m_PVRFilteringMode: 1
+ m_PVRDenoiserTypeDirect: 1
+ m_PVRDenoiserTypeIndirect: 1
+ m_PVRDenoiserTypeAO: 1
+ m_PVRFilterTypeDirect: 0
+ m_PVRFilterTypeIndirect: 0
+ m_PVRFilterTypeAO: 0
+ m_PVREnvironmentMIS: 1
+ m_PVRCulling: 1
+ m_PVRFilteringGaussRadiusDirect: 1
+ m_PVRFilteringGaussRadiusIndirect: 5
+ m_PVRFilteringGaussRadiusAO: 2
+ m_PVRFilteringAtrousPositionSigmaDirect: 0.5
+ m_PVRFilteringAtrousPositionSigmaIndirect: 2
+ m_PVRFilteringAtrousPositionSigmaAO: 1
+ m_ExportTrainingData: 0
+ m_TrainingDataDestination: TrainingData
+ m_LightProbeSampleCountMultiplier: 4
+ m_LightingDataAsset: {fileID: 0}
+ m_LightingSettings: {fileID: 903034822}
+--- !u!196 &4
+NavMeshSettings:
+ serializedVersion: 2
+ m_ObjectHideFlags: 0
+ m_BuildSettings:
+ serializedVersion: 2
+ agentTypeID: 0
+ agentRadius: 0.5
+ agentHeight: 2
+ agentSlope: 45
+ agentClimb: 0.4
+ ledgeDropHeight: 0
+ maxJumpAcrossDistance: 0
+ minRegionArea: 2
+ manualCellSize: 0
+ cellSize: 0.16666667
+ manualTileSize: 0
+ tileSize: 256
+ accuratePlacement: 0
+ maxJobWorkers: 0
+ preserveTilesOutsideBounds: 0
+ debug:
+ m_Flags: 0
+ m_NavMeshData: {fileID: 0}
+--- !u!1 &19371289
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 19371290}
+ - component: {fileID: 19371291}
+ m_Layer: 5
+ m_Name: ToggleAddIMScene (3)
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &19371290
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 19371289}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 1351730454}
+ m_Father: {fileID: 290861172}
+ m_RootOrder: 11
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 0, y: -104}
+ m_SizeDelta: {x: 100, y: 100}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &19371291
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 19371289}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 475de064003ff104fb88b1fbccd0f417, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_ActivateOnLoad: 0
+ m_SceneToLoad: AdditiveSceneMultiInstance
+ m_SceneAsset: {fileID: 102900000, guid: 0ae94f636016d3b40bfbecad57d99553, type: 3}
+--- !u!1 &34066664
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 34066665}
+ - component: {fileID: 34066667}
+ m_Layer: 5
+ m_Name: SwitchSceneParent
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &34066665
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 34066664}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 1347823142}
+ m_Father: {fileID: 290861172}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0}
+ m_AnchorMax: {x: 0.5, y: 0}
+ m_AnchoredPosition: {x: 0, y: 100}
+ m_SizeDelta: {x: 100, y: 100}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &34066667
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 34066664}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 244f0414ea8419b41ac51adb305d64b0, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_SwitchSceneButtonObject: {fileID: 1347823141}
+ m_SceneToSwitchTo: SceneTransitioningBase2
+ m_EnableAutoSwitch: 0
+ m_AutoSwitchTimeOut: 60
+--- !u!1 &37242881
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 37242883}
+ - component: {fileID: 37242882}
+ m_Layer: 0
+ m_Name: Directional Light
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!108 &37242882
+Light:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 37242881}
+ m_Enabled: 1
+ serializedVersion: 10
+ m_Type: 1
+ m_Shape: 0
+ m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1}
+ m_Intensity: 1
+ m_Range: 10
+ m_SpotAngle: 30
+ m_InnerSpotAngle: 21.80208
+ m_CookieSize: 10
+ m_Shadows:
+ m_Type: 2
+ m_Resolution: -1
+ m_CustomResolution: -1
+ m_Strength: 1
+ m_Bias: 0.05
+ m_NormalBias: 0.4
+ m_NearPlane: 0.2
+ m_CullingMatrixOverride:
+ e00: 1
+ e01: 0
+ e02: 0
+ e03: 0
+ e10: 0
+ e11: 1
+ e12: 0
+ e13: 0
+ e20: 0
+ e21: 0
+ e22: 1
+ e23: 0
+ e30: 0
+ e31: 0
+ e32: 0
+ e33: 1
+ m_UseCullingMatrixOverride: 0
+ m_Cookie: {fileID: 0}
+ m_DrawHalo: 0
+ m_Flare: {fileID: 0}
+ m_RenderMode: 0
+ m_CullingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+ m_RenderingLayerMask: 1
+ m_Lightmapping: 4
+ m_LightShadowCasterMode: 0
+ m_AreaSize: {x: 1, y: 1}
+ m_BounceIntensity: 1
+ m_ColorTemperature: 6570
+ m_UseColorTemperature: 0
+ m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0}
+ m_UseBoundingSphereOverride: 0
+ m_UseViewFrustumForShadowCasterCull: 1
+ m_ShadowRadius: 0
+ m_ShadowAngle: 0
+--- !u!4 &37242883
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 37242881}
+ m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261}
+ m_LocalPosition: {x: 0, y: 3, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0}
+--- !u!224 &42803802 stripped
+RectTransform:
+ m_CorrespondingSourceObject: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7,
+ type: 3}
+ m_PrefabInstance: {fileID: 2848221156282925290}
+ m_PrefabAsset: {fileID: 0}
+--- !u!1 &44393279
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 44393280}
+ - component: {fileID: 44393282}
+ - component: {fileID: 44393281}
+ m_Layer: 5
+ m_Name: Background
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &44393280
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 44393279}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 1429502879}
+ m_Father: {fileID: 362129048}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 1}
+ m_AnchorMax: {x: 0, y: 1}
+ m_AnchoredPosition: {x: 10, y: -10}
+ m_SizeDelta: {x: 20, y: 20}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &44393281
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 44393279}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, 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_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
+ m_Type: 1
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!222 &44393282
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 44393279}
+ m_CullTransparentMesh: 1
+--- !u!1 &57065841
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 57065842}
+ - component: {fileID: 57065844}
+ - component: {fileID: 57065843}
+ m_Layer: 5
+ m_Name: Label
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &57065842
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 57065841}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 362129048}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 9, y: -0.5}
+ m_SizeDelta: {x: -28, y: -3}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &57065843
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 57065841}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 14
+ m_FontStyle: 1
+ m_BestFit: 1
+ m_MinSize: 1
+ m_MaxSize: 40
+ m_Alignment: 0
+ m_AlignByGeometry: 1
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: Additive Scene - 2
+--- !u!222 &57065844
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 57065841}
+ m_CullTransparentMesh: 1
+--- !u!1 &57392470
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 57392474}
+ - component: {fileID: 57392473}
+ - component: {fileID: 57392472}
+ - component: {fileID: 57392471}
+ m_Layer: 0
+ m_Name: Side
+ m_TagString: Boundary
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!65 &57392471
+BoxCollider:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 57392470}
+ m_Material: {fileID: 0}
+ m_IsTrigger: 0
+ m_Enabled: 1
+ serializedVersion: 2
+ m_Size: {x: 1, y: 1, z: 1}
+ m_Center: {x: 0, y: 0, z: 0}
+--- !u!23 &57392472
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 57392470}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_StaticShadowCaster: 0
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RayTracingMode: 2
+ m_RayTraceProcedural: 0
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: 2100000, guid: 00cf8ac777c8c42e8967157f70fbfcbf, type: 2}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_ReceiveGI: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+ m_AdditionalVertexStreams: {fileID: 0}
+--- !u!33 &57392473
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 57392470}
+ m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!4 &57392474
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 57392470}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: -30.5, y: 0.49999994, z: 0}
+ m_LocalScale: {x: 1, y: 3, z: 62}
+ m_Children: []
+ m_Father: {fileID: 1332123092}
+ m_RootOrder: 3
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &59926368
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 59926369}
+ - component: {fileID: 59926370}
+ m_Layer: 5
+ m_Name: ToggleAddIMScene
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &59926369
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 59926368}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 1651938367}
+ m_Father: {fileID: 290861172}
+ m_RootOrder: 8
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 0, y: -27}
+ m_SizeDelta: {x: 100, y: 100}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &59926370
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 59926368}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 475de064003ff104fb88b1fbccd0f417, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_ActivateOnLoad: 0
+ m_SceneToLoad: AdditiveSceneMultiInstance
+ m_SceneAsset: {fileID: 102900000, guid: 0ae94f636016d3b40bfbecad57d99553, type: 3}
+--- !u!1 &125866602
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 125866603}
+ - component: {fileID: 125866605}
+ - component: {fileID: 125866604}
+ m_Layer: 5
+ m_Name: Background
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &125866603
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 125866602}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 615497064}
+ m_Father: {fileID: 1351730454}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 1}
+ m_AnchorMax: {x: 0, y: 1}
+ m_AnchoredPosition: {x: 10, y: -10}
+ m_SizeDelta: {x: 20, y: 20}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &125866604
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 125866602}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, 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_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
+ m_Type: 1
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!222 &125866605
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 125866602}
+ m_CullTransparentMesh: 1
+--- !u!1 &163541781
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 163541782}
+ - component: {fileID: 163541784}
+ - component: {fileID: 163541783}
+ m_Layer: 5
+ m_Name: Label
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &163541782
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 163541781}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 1640896166}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 9, y: -0.5}
+ m_SizeDelta: {x: -28, y: -3}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &163541783
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 163541781}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 14
+ m_FontStyle: 1
+ m_BestFit: 1
+ m_MinSize: 1
+ m_MaxSize: 40
+ m_Alignment: 0
+ m_AlignByGeometry: 1
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: AddScene Dup - 2
+--- !u!222 &163541784
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 163541781}
+ m_CullTransparentMesh: 1
+--- !u!1 &167044830
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 167044834}
+ - component: {fileID: 167044833}
+ - component: {fileID: 167044832}
+ - component: {fileID: 167044831}
+ m_Layer: 5
+ m_Name: Canvas
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!114 &167044831
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 167044830}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_IgnoreReversedGraphics: 1
+ m_BlockingObjects: 0
+ m_BlockingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+--- !u!114 &167044832
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 167044830}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_UiScaleMode: 0
+ m_ReferencePixelsPerUnit: 100
+ m_ScaleFactor: 1
+ m_ReferenceResolution: {x: 800, y: 600}
+ m_ScreenMatchMode: 0
+ m_MatchWidthOrHeight: 0
+ m_PhysicalUnit: 3
+ m_FallbackScreenDPI: 96
+ m_DefaultSpriteDPI: 96
+ m_DynamicPixelsPerUnit: 1
+ m_PresetInfoIsWorld: 0
+--- !u!223 &167044833
+Canvas:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 167044830}
+ m_Enabled: 1
+ serializedVersion: 3
+ m_RenderMode: 0
+ m_Camera: {fileID: 0}
+ m_PlaneDistance: 100
+ m_PixelPerfect: 0
+ m_ReceivesEvents: 1
+ m_OverrideSorting: 0
+ m_OverridePixelPerfect: 0
+ m_SortingBucketNormalizedSize: 0
+ m_AdditionalShaderChannelsFlag: 0
+ m_SortingLayerID: 0
+ m_SortingOrder: 0
+ m_TargetDisplay: 0
+--- !u!224 &167044834
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 167044830}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 0, y: 0, z: 0}
+ m_Children:
+ - {fileID: 1865409449}
+ m_Father: {fileID: 0}
+ m_RootOrder: 3
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0, y: 0}
+--- !u!1 &290861168
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 290861172}
+ - component: {fileID: 290861171}
+ - component: {fileID: 290861170}
+ - component: {fileID: 290861169}
+ m_Layer: 5
+ m_Name: UI
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!114 &290861169
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 290861168}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_IgnoreReversedGraphics: 1
+ m_BlockingObjects: 0
+ m_BlockingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+--- !u!114 &290861170
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 290861168}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_UiScaleMode: 1
+ m_ReferencePixelsPerUnit: 100
+ m_ScaleFactor: 1
+ m_ReferenceResolution: {x: 1024, y: 768}
+ m_ScreenMatchMode: 0
+ m_MatchWidthOrHeight: 0.5
+ m_PhysicalUnit: 3
+ m_FallbackScreenDPI: 96
+ m_DefaultSpriteDPI: 96
+ m_DynamicPixelsPerUnit: 1
+ m_PresetInfoIsWorld: 0
+--- !u!223 &290861171
+Canvas:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 290861168}
+ m_Enabled: 1
+ serializedVersion: 3
+ m_RenderMode: 0
+ m_Camera: {fileID: 575203309}
+ m_PlaneDistance: 100
+ m_PixelPerfect: 0
+ m_ReceivesEvents: 1
+ m_OverrideSorting: 0
+ m_OverridePixelPerfect: 0
+ m_SortingBucketNormalizedSize: 0
+ m_AdditionalShaderChannelsFlag: 0
+ m_SortingLayerID: 0
+ m_SortingOrder: 0
+ m_TargetDisplay: 0
+--- !u!224 &290861172
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 290861168}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 0, y: 0, z: 0}
+ m_Children:
+ - {fileID: 1588117328}
+ - {fileID: 34066665}
+ - {fileID: 42803802}
+ - {fileID: 1834318148}
+ - {fileID: 2058276876}
+ - {fileID: 1383741138}
+ - {fileID: 884557066}
+ - {fileID: 291820796}
+ - {fileID: 59926369}
+ - {fileID: 1008611499}
+ - {fileID: 1187680250}
+ - {fileID: 19371290}
+ m_Father: {fileID: 0}
+ m_RootOrder: 4
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0, y: 0}
+--- !u!1 &291820795
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 291820796}
+ - component: {fileID: 291820797}
+ m_Layer: 5
+ m_Name: ToggleTwoParent
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &291820796
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 291820795}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 362129048}
+ m_Father: {fileID: 290861172}
+ m_RootOrder: 7
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 100, y: 100}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &291820797
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 291820795}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 475de064003ff104fb88b1fbccd0f417, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_ActivateOnLoad: 0
+ m_SceneToLoad: AdditiveScene2
+ m_SceneAsset: {fileID: 102900000, guid: c6a3d883c8253ee43bca4f2b03797d7b, type: 3}
+--- !u!1 &300124661
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 300124662}
+ - component: {fileID: 300124663}
+ m_Layer: 5
+ m_Name: AdditiveSceneOne
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &300124662
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 300124661}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 1689223598}
+ - {fileID: 1638885888}
+ m_Father: {fileID: 884557066}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 448, y: 236.09998}
+ m_SizeDelta: {x: 160, y: 20}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &300124663
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 300124661}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_WrapAround: 0
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_SelectedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_SelectedTrigger: Selected
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 1689223599}
+ toggleTransition: 1
+ graphic: {fileID: 1691305197}
+ m_Group: {fileID: 0}
+ onValueChanged:
+ m_PersistentCalls:
+ m_Calls:
+ - m_Target: {fileID: 884557067}
+ m_TargetAssemblyTypeName: TestProject.ManualTests.AdditiveSceneToggleHandler,
+ Assembly-CSharp
+ m_MethodName: OnToggle
+ m_Mode: 1
+ m_Arguments:
+ m_ObjectArgument: {fileID: 0}
+ m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
+ m_IntArgument: 0
+ m_FloatArgument: 0
+ m_StringArgument:
+ m_BoolArgument: 0
+ m_CallState: 2
+ m_IsOn: 0
+--- !u!1 &336568645
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 336568649}
+ - component: {fileID: 336568648}
+ - component: {fileID: 336568647}
+ - component: {fileID: 336568646}
+ m_Layer: 0
+ m_Name: Floor
+ m_TagString: Floor
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!65 &336568646
+BoxCollider:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 336568645}
+ m_Material: {fileID: 0}
+ m_IsTrigger: 0
+ m_Enabled: 1
+ serializedVersion: 2
+ m_Size: {x: 1, y: 1, z: 1}
+ m_Center: {x: 0, y: 0, z: 0}
+--- !u!23 &336568647
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 336568645}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_StaticShadowCaster: 0
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RayTracingMode: 2
+ m_RayTraceProcedural: 0
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: 2100000, guid: 00cf8ac777c8c42e8967157f70fbfcbf, type: 2}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_ReceiveGI: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+ m_AdditionalVertexStreams: {fileID: 0}
+--- !u!33 &336568648
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 336568645}
+ m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!4 &336568649
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 336568645}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: -0.50000006, z: 0}
+ m_LocalScale: {x: 60, y: 1, z: 60}
+ m_Children: []
+ m_Father: {fileID: 1332123092}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &362129047
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 362129048}
+ - component: {fileID: 362129049}
+ m_Layer: 5
+ m_Name: AdditiveSceneTwo
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &362129048
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 362129047}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 44393280}
+ - {fileID: 57065842}
+ m_Father: {fileID: 291820796}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 448, y: 210}
+ m_SizeDelta: {x: 160, y: 20}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &362129049
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 362129047}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_WrapAround: 0
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_SelectedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_SelectedTrigger: Selected
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 44393281}
+ toggleTransition: 1
+ graphic: {fileID: 1429502880}
+ m_Group: {fileID: 0}
+ onValueChanged:
+ m_PersistentCalls:
+ m_Calls:
+ - m_Target: {fileID: 291820797}
+ m_TargetAssemblyTypeName: TestProject.ManualTests.AdditiveSceneToggleHandler,
+ Assembly-CSharp
+ m_MethodName: OnToggle
+ m_Mode: 1
+ m_Arguments:
+ m_ObjectArgument: {fileID: 0}
+ m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
+ m_IntArgument: 0
+ m_FloatArgument: 0
+ m_StringArgument:
+ m_BoolArgument: 0
+ m_CallState: 2
+ m_IsOn: 0
+--- !u!1 &418148060
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 418148061}
+ - component: {fileID: 418148063}
+ - component: {fileID: 418148062}
+ m_Layer: 5
+ m_Name: Background
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &418148061
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 418148060}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 432733929}
+ m_Father: {fileID: 1651938367}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 1}
+ m_AnchorMax: {x: 0, y: 1}
+ m_AnchoredPosition: {x: 10, y: -10}
+ m_SizeDelta: {x: 20, y: 20}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &418148062
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 418148060}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, 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_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
+ m_Type: 1
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!222 &418148063
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 418148060}
+ m_CullTransparentMesh: 1
+--- !u!1 &432733928
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 432733929}
+ - component: {fileID: 432733931}
+ - component: {fileID: 432733930}
+ m_Layer: 5
+ m_Name: Checkmark
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &432733929
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 432733928}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 418148061}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 20, y: 20}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &432733930
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 432733928}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, 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_Sprite: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!222 &432733931
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 432733928}
+ m_CullTransparentMesh: 1
+--- !u!1 &562991978
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 562991979}
+ - component: {fileID: 562991981}
+ - component: {fileID: 562991980}
+ m_Layer: 5
+ m_Name: BoxGeneratorCount
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &562991979
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 562991978}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 2058276876}
+ m_RootOrder: 3
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 3, y: 20}
+ m_SizeDelta: {x: 160, y: 30}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &562991980
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 562991978}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.9811321, g: 0.9811321, b: 0.9811321, 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_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 18
+ m_FontStyle: 1
+ m_BestFit: 0
+ m_MinSize: 1
+ m_MaxSize: 40
+ m_Alignment: 4
+ m_AlignByGeometry: 0
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: 0
+--- !u!222 &562991981
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 562991978}
+ m_CullTransparentMesh: 1
+--- !u!1 &575203307
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 575203310}
+ - component: {fileID: 575203309}
+ - component: {fileID: 575203308}
+ m_Layer: 0
+ m_Name: Main Camera
+ m_TagString: MainCamera
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!81 &575203308
+AudioListener:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 575203307}
+ m_Enabled: 1
+--- !u!20 &575203309
+Camera:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 575203307}
+ m_Enabled: 1
+ serializedVersion: 2
+ m_ClearFlags: 1
+ m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0}
+ m_projectionMatrixMode: 1
+ m_GateFitMode: 2
+ m_FOVAxisMode: 0
+ m_SensorSize: {x: 36, y: 24}
+ m_LensShift: {x: 0, y: 0}
+ m_FocalLength: 50
+ m_NormalizedViewPortRect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 1
+ height: 1
+ near clip plane: 0.3
+ far clip plane: 1000
+ field of view: 60
+ orthographic: 0
+ orthographic size: 5
+ m_Depth: -1
+ m_CullingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+ m_RenderingPath: -1
+ m_TargetTexture: {fileID: 0}
+ m_TargetDisplay: 0
+ m_TargetEye: 3
+ m_HDR: 1
+ m_AllowMSAA: 1
+ m_AllowDynamicResolution: 0
+ m_ForceIntoRT: 0
+ m_OcclusionCulling: 1
+ m_StereoConvergence: 10
+ m_StereoSeparation: 0.022
+--- !u!4 &575203310
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 575203307}
+ m_LocalRotation: {x: 0.41890106, y: -0, z: -0, w: 0.9080319}
+ m_LocalPosition: {x: 0, y: 42, z: -46}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 49.530003, y: 0, z: 0}
+--- !u!1 &599972120
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 599972121}
+ - component: {fileID: 599972123}
+ - component: {fileID: 599972122}
+ m_Layer: 5
+ m_Name: Text
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &599972121
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 599972120}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 1588117328}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &599972122
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 599972120}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 0.5058824, b: 0.003921569, 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_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 14
+ m_FontStyle: 0
+ m_BestFit: 0
+ m_MinSize: 10
+ m_MaxSize: 40
+ m_Alignment: 4
+ m_AlignByGeometry: 0
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: Show Server Stats
+--- !u!222 &599972123
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 599972120}
+ m_CullTransparentMesh: 1
+--- !u!1 &615497063
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 615497064}
+ - component: {fileID: 615497066}
+ - component: {fileID: 615497065}
+ m_Layer: 5
+ m_Name: Checkmark
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &615497064
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 615497063}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 125866603}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 20, y: 20}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &615497065
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 615497063}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, 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_Sprite: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!222 &615497066
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 615497063}
+ m_CullTransparentMesh: 1
+--- !u!1 &833301794
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 833301795}
+ - component: {fileID: 833301797}
+ - component: {fileID: 833301796}
+ m_Layer: 5
+ m_Name: Checkmark
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &833301795
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 833301794}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 1290928583}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 20, y: 20}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &833301796
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 833301794}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, 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_Sprite: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!222 &833301797
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 833301794}
+ m_CullTransparentMesh: 1
+--- !u!1 &865202801
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 865202802}
+ - component: {fileID: 865202804}
+ - component: {fileID: 865202803}
+ m_Layer: 5
+ m_Name: Checkmark
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &865202802
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 865202801}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 1398648428}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 20, y: 20}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &865202803
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 865202801}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, 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_Sprite: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!222 &865202804
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 865202801}
+ m_CullTransparentMesh: 1
+--- !u!1 &884557065
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 884557066}
+ - component: {fileID: 884557067}
+ m_Layer: 5
+ m_Name: ToggleOneParent
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &884557066
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 884557065}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 300124662}
+ m_Father: {fileID: 290861172}
+ m_RootOrder: 6
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 100, y: 100}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &884557067
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 884557065}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 475de064003ff104fb88b1fbccd0f417, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_ActivateOnLoad: 0
+ m_SceneToLoad: AdditiveScene1
+ m_SceneAsset: {fileID: 102900000, guid: 41a0239b0c49e2047b7063c822f0df8a, type: 3}
+--- !u!850595691 &903034822
+LightingSettings:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name:
+ serializedVersion: 3
+ m_GIWorkflowMode: 1
+ m_EnableBakedLightmaps: 1
+ m_EnableRealtimeLightmaps: 0
+ m_RealtimeEnvironmentLighting: 1
+ m_BounceScale: 1
+ m_AlbedoBoost: 1
+ m_IndirectOutputScale: 1
+ m_UsingShadowmask: 1
+ m_BakeBackend: 1
+ m_LightmapMaxSize: 1024
+ m_BakeResolution: 40
+ m_Padding: 2
+ m_TextureCompression: 1
+ m_AO: 0
+ m_AOMaxDistance: 1
+ m_CompAOExponent: 1
+ m_CompAOExponentDirect: 0
+ m_ExtractAO: 0
+ m_MixedBakeMode: 2
+ m_LightmapsBakeMode: 1
+ m_FilterMode: 1
+ m_LightmapParameters: {fileID: 15204, guid: 0000000000000000f000000000000000, type: 0}
+ m_ExportTrainingData: 0
+ m_TrainingDataDestination: TrainingData
+ m_RealtimeResolution: 2
+ m_ForceWhiteAlbedo: 0
+ m_ForceUpdates: 0
+ m_FinalGather: 0
+ m_FinalGatherRayCount: 256
+ m_FinalGatherFiltering: 1
+ m_PVRCulling: 1
+ m_PVRSampling: 1
+ m_PVRDirectSampleCount: 32
+ m_PVRSampleCount: 512
+ m_PVREnvironmentSampleCount: 256
+ m_PVREnvironmentReferencePointCount: 2048
+ m_LightProbeSampleCountMultiplier: 4
+ m_PVRBounces: 2
+ m_PVRMinBounces: 1
+ m_PVREnvironmentMIS: 1
+ m_PVRFilteringMode: 1
+ m_PVRDenoiserTypeDirect: 1
+ m_PVRDenoiserTypeIndirect: 1
+ m_PVRDenoiserTypeAO: 1
+ m_PVRFilterTypeDirect: 0
+ m_PVRFilterTypeIndirect: 0
+ m_PVRFilterTypeAO: 0
+ m_PVRFilteringGaussRadiusDirect: 1
+ m_PVRFilteringGaussRadiusIndirect: 5
+ m_PVRFilteringGaussRadiusAO: 2
+ m_PVRFilteringAtrousPositionSigmaDirect: 0.5
+ m_PVRFilteringAtrousPositionSigmaIndirect: 2
+ m_PVRFilteringAtrousPositionSigmaAO: 1
+--- !u!1 &906714043
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 906714044}
+ - component: {fileID: 906714046}
+ - component: {fileID: 906714045}
+ m_Layer: 5
+ m_Name: Label
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &906714044
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 906714043}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 2019086800}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 9, y: -0.5}
+ m_SizeDelta: {x: -28, y: -3}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &906714045
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 906714043}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 14
+ m_FontStyle: 1
+ m_BestFit: 1
+ m_MinSize: 1
+ m_MaxSize: 40
+ m_Alignment: 0
+ m_AlignByGeometry: 1
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: AddScene Dup - 3
+--- !u!222 &906714046
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 906714043}
+ m_CullTransparentMesh: 1
+--- !u!1 &1008611498
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1008611499}
+ - component: {fileID: 1008611500}
+ m_Layer: 5
+ m_Name: ToggleAddIMScene (1)
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1008611499
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1008611498}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 1640896166}
+ m_Father: {fileID: 290861172}
+ m_RootOrder: 9
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 0, y: -54}
+ m_SizeDelta: {x: 100, y: 100}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1008611500
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1008611498}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 475de064003ff104fb88b1fbccd0f417, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_ActivateOnLoad: 0
+ m_SceneToLoad: AdditiveSceneMultiInstance
+ m_SceneAsset: {fileID: 102900000, guid: 0ae94f636016d3b40bfbecad57d99553, type: 3}
+--- !u!1 &1024114717
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1024114720}
+ - component: {fileID: 1024114719}
+ - component: {fileID: 1024114718}
+ - component: {fileID: 1024114721}
+ - component: {fileID: 1024114722}
+ m_Layer: 0
+ m_Name: NetworkManager
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!114 &1024114718
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1024114717}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 593a2fe42fa9d37498c96f9a383b6521, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ DontDestroy: 1
+ RunInBackground: 1
+ LogLevel: 1
+ NetworkConfig:
+ ProtocolVersion: 0
+ NetworkTransport: {fileID: 1024114719}
+ RegisteredScenes:
+ - SceneTransitioningBase
+ - SecondSceneAdditive
+ - ThirdSceneAdditive
+ - AdditiveSceneOne
+ - AdditiveSceneTwo
+ - SceneTransitioningBase1
+ - AdditiveScene1
+ - AdditiveScene2
+ - SceneTransitioningBase2
+ - AdditiveScene3
+ - AdditiveScene4
+ - AdditiveSceneMultiInstance
+ RegisteredSceneAssets:
+ - {fileID: 102900000, guid: 780f96a61e8ac8e41b638ae8ec3a3236, type: 3}
+ - {fileID: 102900000, guid: 9e437cc704801bc47add735d743985f5, type: 3}
+ - {fileID: 102900000, guid: 41a0239b0c49e2047b7063c822f0df8a, type: 3}
+ - {fileID: 102900000, guid: c6a3d883c8253ee43bca4f2b03797d7b, type: 3}
+ - {fileID: 102900000, guid: 7da3dd618f5b5a34db1f6d3c9511e221, type: 3}
+ - {fileID: 102900000, guid: dc7e17c86f5ca81478043be306027c13, type: 3}
+ - {fileID: 102900000, guid: 0ae94f636016d3b40bfbecad57d99553, type: 3}
+ AllowRuntimeSceneChanges: 0
+ PlayerPrefab: {fileID: 4079352819444256614, guid: c16f03336b6104576a565ef79ad643c0,
+ type: 3}
+ NetworkPrefabs:
+ - Override: 0
+ Prefab: {fileID: 771575417923360811, guid: c0a45bdb516f341498d933b7a7ed4fc1,
+ type: 3}
+ SourcePrefabToOverride: {fileID: 771575417923360811, guid: c0a45bdb516f341498d933b7a7ed4fc1,
+ type: 3}
+ SourceHashToOverride: 0
+ OverridingTargetPrefab: {fileID: 8059323910720821982, guid: d143db9172e1f234e99d450286b77695,
+ type: 3}
+ - Override: 0
+ Prefab: {fileID: 1086419352113069865, guid: ed799d5402b325c4f8f41918224a1ba7,
+ type: 3}
+ SourcePrefabToOverride: {fileID: 0}
+ SourceHashToOverride: 0
+ OverridingTargetPrefab: {fileID: 0}
+ - Override: 0
+ Prefab: {fileID: 1086419352113069865, guid: 8a415e2c2210434458836779302bc4d3,
+ type: 3}
+ SourcePrefabToOverride: {fileID: 0}
+ SourceHashToOverride: 0
+ OverridingTargetPrefab: {fileID: 0}
+ - Override: 0
+ Prefab: {fileID: 47844432802121000, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ SourcePrefabToOverride: {fileID: 0}
+ SourceHashToOverride: 0
+ OverridingTargetPrefab: {fileID: 0}
+ - Override: 0
+ Prefab: {fileID: 238713212259395427, guid: 0aca3eef90d204641888a517edcc951f,
+ type: 3}
+ SourcePrefabToOverride: {fileID: 0}
+ SourceHashToOverride: 0
+ OverridingTargetPrefab: {fileID: 0}
+ - Override: 0
+ Prefab: {fileID: 7900845470658144705, guid: 9f2cc6554ae21e3498fb4cc28a07108d,
+ type: 3}
+ SourcePrefabToOverride: {fileID: 0}
+ SourceHashToOverride: 0
+ OverridingTargetPrefab: {fileID: 0}
+ - Override: 0
+ Prefab: {fileID: 5781804285550429985, guid: 27c27433e278c054dbe3bae7d411cfab,
+ type: 3}
+ SourcePrefabToOverride: {fileID: 0}
+ SourceHashToOverride: 0
+ OverridingTargetPrefab: {fileID: 0}
+ - Override: 0
+ Prefab: {fileID: 5054079819822531224, guid: e04a7aaf01a4ad145a945161a18bf49c,
+ type: 3}
+ SourcePrefabToOverride: {fileID: 0}
+ SourceHashToOverride: 0
+ OverridingTargetPrefab: {fileID: 0}
+ TickRate: 30
+ ClientConnectionBufferTimeout: 10
+ ConnectionApproval: 0
+ ConnectionData:
+ EnableTimeResync: 0
+ TimeResyncInterval: 30
+ EnableNetworkVariable: 1
+ EnsureNetworkVariableLengthSafety: 0
+ EnableSceneManagement: 1
+ ForceSamePrefabs: 1
+ RecycleNetworkIds: 0
+ NetworkIdRecycleDelay: 120
+ RpcHashSize: 0
+ LoadSceneTimeOut: 120
+ MessageBufferTimeout: 20
+ EnableNetworkLogs: 1
+ UseSnapshotDelta: 0
+ UseSnapshotSpawn: 0
+--- !u!114 &1024114719
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1024114717}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: b84c2d8dfe509a34fb59e2b81f8e1319, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ MessageBufferSize: 65535
+ MaxConnections: 100
+ MaxSentMessageQueueSize: 512
+ ConnectAddress: 127.0.0.1
+ ConnectPort: 7777
+ ServerListenPort: 7777
+ ServerWebsocketListenPort: 8887
+ SupportWebsocket: 0
+ Channels: []
+ UseNetcodeRelay: 0
+ NetcodeRelayAddress: 127.0.0.1
+ NetcodeRelayPort: 8888
+ MessageSendMode: 0
+--- !u!4 &1024114720
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1024114717}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0.000061035156, y: 0.000015258789, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 2
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &1024114721
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1024114717}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 0e6f8504d891fc44881b2d9703017d03, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+--- !u!114 &1024114722
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1024114717}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 71c52a32bd1c1c84691050b6d045ab4a, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ LogToConsole: 1
+ TimeToLive: 10
+--- !u!1 &1113539278
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1113539280}
+ - component: {fileID: 1113539281}
+ - component: {fileID: 1113539279}
+ m_Layer: 0
+ m_Name: PooledPrefabSpawnHandler
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!114 &1113539279
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1113539278}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 8c48ea35c67e64f7fac22a3f6831ca88, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ AutoSpawnEnable: 1
+ InitialSpawnDelay: 0.2
+ SpawnsPerSecond: 1
+ PoolSize: 32
+ ObjectSpeed: 8
+ EnableHandler: 1
+ RegisterUsingNetworkObject: 0
+ ServerObjectToPool: {fileID: 771575417923360811, guid: c0a45bdb516f341498d933b7a7ed4fc1,
+ type: 3}
+ ClientObjectToPool: {fileID: 0}
+ SwitchScene: {fileID: 0}
+ SpawnSlider: {fileID: 2058276877}
+ SpawnSliderValueText: {fileID: 562991980}
+--- !u!4 &1113539280
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1113539278}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0.5, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 5
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &1113539281
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1113539278}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ GlobalObjectIdHash: 1983031731
+ AlwaysReplicateAsRoot: 0
+ DontDestroyWithOwner: 0
+ AutoObjectParentSync: 1
+--- !u!1 &1187680249
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1187680250}
+ - component: {fileID: 1187680251}
+ m_Layer: 5
+ m_Name: ToggleAddIMScene (2)
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1187680250
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1187680249}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 2019086800}
+ m_Father: {fileID: 290861172}
+ m_RootOrder: 10
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 0, y: -79}
+ m_SizeDelta: {x: 100, y: 100}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1187680251
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1187680249}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 475de064003ff104fb88b1fbccd0f417, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_ActivateOnLoad: 0
+ m_SceneToLoad: AdditiveSceneMultiInstance
+ m_SceneAsset: {fileID: 102900000, guid: 0ae94f636016d3b40bfbecad57d99553, type: 3}
+--- !u!1 &1210784441
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1210784442}
+ - component: {fileID: 1210784444}
+ - component: {fileID: 1210784443}
+ m_Layer: 5
+ m_Name: Label
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1210784442
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1210784441}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 1651938367}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 9, y: -0.5}
+ m_SizeDelta: {x: -28, y: -3}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1210784443
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1210784441}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 14
+ m_FontStyle: 1
+ m_BestFit: 1
+ m_MinSize: 1
+ m_MaxSize: 40
+ m_Alignment: 0
+ m_AlignByGeometry: 1
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: AddScene Dup - 1
+--- !u!222 &1210784444
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1210784441}
+ m_CullTransparentMesh: 1
+--- !u!1 &1290928582
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1290928583}
+ - component: {fileID: 1290928585}
+ - component: {fileID: 1290928584}
+ m_Layer: 5
+ m_Name: Background
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1290928583
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1290928582}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 833301795}
+ m_Father: {fileID: 1640896166}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 1}
+ m_AnchorMax: {x: 0, y: 1}
+ m_AnchoredPosition: {x: 10, y: -10}
+ m_SizeDelta: {x: 20, y: 20}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1290928584
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1290928582}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, 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_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
+ m_Type: 1
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!222 &1290928585
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1290928582}
+ m_CullTransparentMesh: 1
+--- !u!1 &1332123091
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1332123092}
+ m_Layer: 0
+ m_Name: Level
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &1332123092
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1332123091}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0.000000059604645, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 336568649}
+ - {fileID: 2028091272}
+ - {fileID: 1857685347}
+ - {fileID: 57392474}
+ - {fileID: 1336081255}
+ m_Father: {fileID: 0}
+ m_RootOrder: 6
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &1336081251
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1336081255}
+ - component: {fileID: 1336081254}
+ - component: {fileID: 1336081253}
+ - component: {fileID: 1336081252}
+ m_Layer: 0
+ m_Name: Side
+ m_TagString: Boundary
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!65 &1336081252
+BoxCollider:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1336081251}
+ m_Material: {fileID: 0}
+ m_IsTrigger: 0
+ m_Enabled: 1
+ serializedVersion: 2
+ m_Size: {x: 1, y: 1, z: 1}
+ m_Center: {x: 0, y: 0, z: 0}
+--- !u!23 &1336081253
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1336081251}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_StaticShadowCaster: 0
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RayTracingMode: 2
+ m_RayTraceProcedural: 0
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: 2100000, guid: 00cf8ac777c8c42e8967157f70fbfcbf, type: 2}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_ReceiveGI: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+ m_AdditionalVertexStreams: {fileID: 0}
+--- !u!33 &1336081254
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1336081251}
+ m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!4 &1336081255
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1336081251}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 30.5, y: 0.49999994, z: 0}
+ m_LocalScale: {x: 1, y: 3, z: 62}
+ m_Children: []
+ m_Father: {fileID: 1332123092}
+ m_RootOrder: 4
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &1336892118
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1336892119}
+ - component: {fileID: 1336892121}
+ - component: {fileID: 1336892120}
+ m_Layer: 5
+ m_Name: Label
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1336892119
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1336892118}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 1351730454}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 9, y: -0.5}
+ m_SizeDelta: {x: -28, y: -3}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1336892120
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1336892118}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 14
+ m_FontStyle: 1
+ m_BestFit: 1
+ m_MinSize: 1
+ m_MaxSize: 40
+ m_Alignment: 0
+ m_AlignByGeometry: 1
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: AddScene Dup - 4
+--- !u!222 &1336892121
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1336892118}
+ m_CullTransparentMesh: 1
+--- !u!1 &1347823141
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1347823142}
+ - component: {fileID: 1347823145}
+ - component: {fileID: 1347823144}
+ - component: {fileID: 1347823143}
+ m_Layer: 5
+ m_Name: SwitchSceneButton
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1347823142
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1347823141}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 1846334315}
+ m_Father: {fileID: 34066665}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0}
+ m_AnchorMax: {x: 0.5, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 160, y: 30}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1347823143
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1347823141}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_WrapAround: 0
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_SelectedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_SelectedTrigger: Selected
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 1347823144}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls:
+ - m_Target: {fileID: 34066667}
+ m_TargetAssemblyTypeName: TestProject.ManualTests.SwitchSceneHandler, TestProject.ManualTests
+ m_MethodName: OnSwitchScene
+ m_Mode: 1
+ m_Arguments:
+ m_ObjectArgument: {fileID: 0}
+ m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
+ m_IntArgument: 0
+ m_FloatArgument: 0
+ m_StringArgument:
+ m_BoolArgument: 0
+ m_CallState: 2
+--- !u!114 &1347823144
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1347823141}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.1981132, g: 0.1981132, b: 0.1981132, 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_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
+ m_Type: 1
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!222 &1347823145
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1347823141}
+ m_CullTransparentMesh: 1
+--- !u!1 &1351730453
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1351730454}
+ - component: {fileID: 1351730455}
+ m_Layer: 5
+ m_Name: AdditiveSceneMultiInstance
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1351730454
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1351730453}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 125866603}
+ - {fileID: 1336892119}
+ m_Father: {fileID: 19371290}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 448, y: 210}
+ m_SizeDelta: {x: 160, y: 20}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1351730455
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1351730453}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_WrapAround: 0
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_SelectedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_SelectedTrigger: Selected
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 125866604}
+ toggleTransition: 1
+ graphic: {fileID: 615497065}
+ m_Group: {fileID: 0}
+ onValueChanged:
+ m_PersistentCalls:
+ m_Calls:
+ - m_Target: {fileID: 19371291}
+ m_TargetAssemblyTypeName: TestProject.ManualTests.AdditiveSceneToggleHandler,
+ Assembly-CSharp
+ m_MethodName: OnToggle
+ m_Mode: 1
+ m_Arguments:
+ m_ObjectArgument: {fileID: 0}
+ m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
+ m_IntArgument: 0
+ m_FloatArgument: 0
+ m_StringArgument:
+ m_BoolArgument: 0
+ m_CallState: 2
+ m_IsOn: 0
+--- !u!1 &1383741137
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1383741138}
+ - component: {fileID: 1383741140}
+ - component: {fileID: 1383741139}
+ m_Layer: 5
+ m_Name: SceneName
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1383741138
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1383741137}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 290861172}
+ m_RootOrder: 5
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 1, y: 0}
+ m_AnchorMax: {x: 1, y: 0}
+ m_AnchoredPosition: {x: -139.70001, y: 45.59999}
+ m_SizeDelta: {x: 250, y: 30}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1383741139
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1383741137}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.990566, g: 0.990566, b: 0.990566, 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_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 18
+ m_FontStyle: 1
+ m_BestFit: 0
+ m_MinSize: 1
+ m_MaxSize: 40
+ m_Alignment: 4
+ m_AlignByGeometry: 0
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: Scene Transitioning Base - 1
+--- !u!222 &1383741140
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1383741137}
+ m_CullTransparentMesh: 0
+--- !u!1 &1387688804
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1387688805}
+ m_Layer: 5
+ m_Name: Handle Slide Area
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1387688805
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1387688804}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 1523424137}
+ m_Father: {fileID: 2058276876}
+ m_RootOrder: 2
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: -20, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!1 &1398648427
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1398648428}
+ - component: {fileID: 1398648430}
+ - component: {fileID: 1398648429}
+ m_Layer: 5
+ m_Name: Background
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1398648428
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1398648427}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 865202802}
+ m_Father: {fileID: 2019086800}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 1}
+ m_AnchorMax: {x: 0, y: 1}
+ m_AnchoredPosition: {x: 10, y: -10}
+ m_SizeDelta: {x: 20, y: 20}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1398648429
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1398648427}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, 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_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
+ m_Type: 1
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!222 &1398648430
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1398648427}
+ m_CullTransparentMesh: 1
+--- !u!1 &1429502878
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1429502879}
+ - component: {fileID: 1429502881}
+ - component: {fileID: 1429502880}
+ m_Layer: 5
+ m_Name: Checkmark
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1429502879
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1429502878}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 44393280}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 20, y: 20}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1429502880
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1429502878}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, 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_Sprite: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!222 &1429502881
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1429502878}
+ m_CullTransparentMesh: 1
+--- !u!1 &1523424136
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1523424137}
+ - component: {fileID: 1523424139}
+ - component: {fileID: 1523424138}
+ m_Layer: 5
+ m_Name: Handle
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1523424137
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1523424136}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 1387688805}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 20, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1523424138
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1523424136}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, 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_Sprite: {fileID: 10913, guid: 0000000000000000f000000000000000, type: 0}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!222 &1523424139
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1523424136}
+ m_CullTransparentMesh: 1
+--- !u!1 &1549858058
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1549858059}
+ - component: {fileID: 1549858061}
+ - component: {fileID: 1549858060}
+ m_Layer: 5
+ m_Name: Fill
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1549858059
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1549858058}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 1889006547}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 10, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1549858060
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1549858058}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, 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_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
+ m_Type: 1
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!222 &1549858061
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1549858058}
+ m_CullTransparentMesh: 1
+--- !u!1 &1588117327
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1588117328}
+ - component: {fileID: 1588117331}
+ - component: {fileID: 1588117330}
+ - component: {fileID: 1588117329}
+ m_Layer: 5
+ m_Name: ToggleClientServerStats
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1588117328
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1588117327}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 599972121}
+ m_Father: {fileID: 290861172}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 130, y: 51}
+ m_SizeDelta: {x: 160, y: 30}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1588117329
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1588117327}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_WrapAround: 0
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_SelectedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_SelectedTrigger: Selected
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 1588117330}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls:
+ - m_Target: {fileID: 2107482022}
+ m_TargetAssemblyTypeName: StatsDisplay, Assembly-CSharp
+ m_MethodName: ToggleClientSever
+ m_Mode: 1
+ m_Arguments:
+ m_ObjectArgument: {fileID: 0}
+ m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
+ m_IntArgument: 0
+ m_FloatArgument: 0
+ m_StringArgument:
+ m_BoolArgument: 0
+ m_CallState: 2
+--- !u!114 &1588117330
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1588117327}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.1981132, g: 0.1981132, b: 0.1981132, 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_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
+ m_Type: 1
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!222 &1588117331
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1588117327}
+ m_CullTransparentMesh: 1
+--- !u!1 &1638885887
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1638885888}
+ - component: {fileID: 1638885890}
+ - component: {fileID: 1638885889}
+ m_Layer: 5
+ m_Name: Label
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1638885888
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1638885887}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 300124662}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 9, y: -0.5}
+ m_SizeDelta: {x: -28, y: -3}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1638885889
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1638885887}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 14
+ m_FontStyle: 1
+ m_BestFit: 1
+ m_MinSize: 1
+ m_MaxSize: 40
+ m_Alignment: 0
+ m_AlignByGeometry: 1
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: Additive Scene - 1
+--- !u!222 &1638885890
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1638885887}
+ m_CullTransparentMesh: 1
+--- !u!1 &1640896165
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1640896166}
+ - component: {fileID: 1640896167}
+ m_Layer: 5
+ m_Name: AdditiveSceneMultiInstance
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1640896166
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1640896165}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 1290928583}
+ - {fileID: 163541782}
+ m_Father: {fileID: 1008611499}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 448, y: 210}
+ m_SizeDelta: {x: 160, y: 20}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1640896167
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1640896165}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_WrapAround: 0
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_SelectedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_SelectedTrigger: Selected
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 1290928584}
+ toggleTransition: 1
+ graphic: {fileID: 833301796}
+ m_Group: {fileID: 0}
+ onValueChanged:
+ m_PersistentCalls:
+ m_Calls:
+ - m_Target: {fileID: 1008611500}
+ m_TargetAssemblyTypeName: TestProject.ManualTests.AdditiveSceneToggleHandler,
+ Assembly-CSharp
+ m_MethodName: OnToggle
+ m_Mode: 1
+ m_Arguments:
+ m_ObjectArgument: {fileID: 0}
+ m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
+ m_IntArgument: 0
+ m_FloatArgument: 0
+ m_StringArgument:
+ m_BoolArgument: 0
+ m_CallState: 2
+ m_IsOn: 0
+--- !u!1 &1651938366
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1651938367}
+ - component: {fileID: 1651938368}
+ m_Layer: 5
+ m_Name: AdditiveSceneMultiInstance
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1651938367
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1651938366}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 418148061}
+ - {fileID: 1210784442}
+ m_Father: {fileID: 59926369}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 448, y: 210}
+ m_SizeDelta: {x: 160, y: 20}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1651938368
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1651938366}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_WrapAround: 0
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_SelectedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_SelectedTrigger: Selected
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 418148062}
+ toggleTransition: 1
+ graphic: {fileID: 432733930}
+ m_Group: {fileID: 0}
+ onValueChanged:
+ m_PersistentCalls:
+ m_Calls:
+ - m_Target: {fileID: 59926370}
+ m_TargetAssemblyTypeName: TestProject.ManualTests.AdditiveSceneToggleHandler,
+ Assembly-CSharp
+ m_MethodName: OnToggle
+ m_Mode: 1
+ m_Arguments:
+ m_ObjectArgument: {fileID: 0}
+ m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
+ m_IntArgument: 0
+ m_FloatArgument: 0
+ m_StringArgument:
+ m_BoolArgument: 0
+ m_CallState: 2
+ m_IsOn: 0
+--- !u!1 &1689223597
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1689223598}
+ - component: {fileID: 1689223600}
+ - component: {fileID: 1689223599}
+ m_Layer: 5
+ m_Name: Background
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1689223598
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1689223597}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 1691305196}
+ m_Father: {fileID: 300124662}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 1}
+ m_AnchorMax: {x: 0, y: 1}
+ m_AnchoredPosition: {x: 10, y: -10}
+ m_SizeDelta: {x: 20, y: 20}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1689223599
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1689223597}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, 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_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
+ m_Type: 1
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!222 &1689223600
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1689223597}
+ m_CullTransparentMesh: 1
+--- !u!1 &1691305195
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1691305196}
+ - component: {fileID: 1691305198}
+ - component: {fileID: 1691305197}
+ m_Layer: 5
+ m_Name: Checkmark
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1691305196
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1691305195}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 1689223598}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 20, y: 20}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1691305197
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1691305195}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, 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_Sprite: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!222 &1691305198
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1691305195}
+ m_CullTransparentMesh: 1
+--- !u!1 &1834318145
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1834318148}
+ - component: {fileID: 1834318147}
+ - component: {fileID: 1834318146}
+ m_Layer: 0
+ m_Name: EventSystem
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!114 &1834318146
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1834318145}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_HorizontalAxis: Horizontal
+ m_VerticalAxis: Vertical
+ m_SubmitButton: Submit
+ m_CancelButton: Cancel
+ m_InputActionsPerSecond: 10
+ m_RepeatDelay: 0.5
+ m_ForceModuleActive: 0
+--- !u!114 &1834318147
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1834318145}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_FirstSelected: {fileID: 0}
+ m_sendNavigationEvents: 1
+ m_DragThreshold: 10
+--- !u!4 &1834318148
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1834318145}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: -431, y: -242.5, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 290861172}
+ m_RootOrder: 3
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &1846334314
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1846334315}
+ - component: {fileID: 1846334317}
+ - component: {fileID: 1846334316}
+ m_Layer: 5
+ m_Name: Text
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1846334315
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1846334314}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 1347823142}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1846334316
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1846334314}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 0.5058824, b: 0.003921569, 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_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 14
+ m_FontStyle: 0
+ m_BestFit: 0
+ m_MinSize: 10
+ m_MaxSize: 40
+ m_Alignment: 4
+ m_AlignByGeometry: 0
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: Switch Scene
+--- !u!222 &1846334317
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1846334314}
+ m_CullTransparentMesh: 1
+--- !u!1 &1857685343
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1857685347}
+ - component: {fileID: 1857685346}
+ - component: {fileID: 1857685345}
+ - component: {fileID: 1857685344}
+ m_Layer: 0
+ m_Name: Side
+ m_TagString: Boundary
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!65 &1857685344
+BoxCollider:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1857685343}
+ m_Material: {fileID: 0}
+ m_IsTrigger: 0
+ m_Enabled: 1
+ serializedVersion: 2
+ m_Size: {x: 1, y: 1, z: 1}
+ m_Center: {x: 0, y: 0, z: 0}
+--- !u!23 &1857685345
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1857685343}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_StaticShadowCaster: 0
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RayTracingMode: 2
+ m_RayTraceProcedural: 0
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: 2100000, guid: 00cf8ac777c8c42e8967157f70fbfcbf, type: 2}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_ReceiveGI: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+ m_AdditionalVertexStreams: {fileID: 0}
+--- !u!33 &1857685346
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1857685343}
+ m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!4 &1857685347
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1857685343}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0.49999994, z: -30.5}
+ m_LocalScale: {x: 60, y: 3, z: 1}
+ m_Children: []
+ m_Father: {fileID: 1332123092}
+ m_RootOrder: 2
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1001 &1865409448
+PrefabInstance:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_Modification:
+ m_TransformParent: {fileID: 167044834}
+ m_Modifications:
+ - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84,
+ type: 3}
+ propertyPath: m_Pivot.x
+ value: 0.5
+ objectReference: {fileID: 0}
+ - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84,
+ type: 3}
+ propertyPath: m_Pivot.y
+ value: 0.5
+ objectReference: {fileID: 0}
+ - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84,
+ type: 3}
+ propertyPath: m_RootOrder
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84,
+ type: 3}
+ propertyPath: m_AnchorMax.x
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84,
+ type: 3}
+ propertyPath: m_AnchorMax.y
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84,
+ type: 3}
+ propertyPath: m_AnchorMin.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84,
+ type: 3}
+ propertyPath: m_AnchorMin.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84,
+ type: 3}
+ propertyPath: m_SizeDelta.x
+ value: -952
+ objectReference: {fileID: 0}
+ - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84,
+ type: 3}
+ propertyPath: m_SizeDelta.y
+ value: -344
+ objectReference: {fileID: 0}
+ - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84,
+ type: 3}
+ propertyPath: m_LocalPosition.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84,
+ type: 3}
+ propertyPath: m_LocalPosition.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84,
+ type: 3}
+ propertyPath: m_LocalPosition.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84,
+ type: 3}
+ propertyPath: m_LocalRotation.w
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84,
+ type: 3}
+ propertyPath: m_LocalRotation.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84,
+ type: 3}
+ propertyPath: m_LocalRotation.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84,
+ type: 3}
+ propertyPath: m_LocalRotation.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84,
+ type: 3}
+ propertyPath: m_AnchoredPosition.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84,
+ type: 3}
+ propertyPath: m_AnchoredPosition.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84,
+ type: 3}
+ propertyPath: m_LocalEulerAnglesHint.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84,
+ type: 3}
+ propertyPath: m_LocalEulerAnglesHint.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84,
+ type: 3}
+ propertyPath: m_LocalEulerAnglesHint.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 6963777608485144162, guid: d725b5588e1b956458798319e6541d84,
+ type: 3}
+ propertyPath: m_Name
+ value: ConnectionModeButtons
+ objectReference: {fileID: 0}
+ m_RemovedComponents: []
+ m_SourcePrefab: {fileID: 100100000, guid: d725b5588e1b956458798319e6541d84, type: 3}
+--- !u!224 &1865409449 stripped
+RectTransform:
+ m_CorrespondingSourceObject: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84,
+ type: 3}
+ m_PrefabInstance: {fileID: 1865409448}
+ m_PrefabAsset: {fileID: 0}
+--- !u!1 &1889006546
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1889006547}
+ m_Layer: 5
+ m_Name: Fill Area
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1889006547
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1889006546}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 1549858059}
+ m_Father: {fileID: 2058276876}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0.25}
+ m_AnchorMax: {x: 1, y: 0.75}
+ m_AnchoredPosition: {x: -5, y: 0}
+ m_SizeDelta: {x: -20, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!1 &2019086799
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 2019086800}
+ - component: {fileID: 2019086801}
+ m_Layer: 5
+ m_Name: AdditiveSceneMultiInstance
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &2019086800
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2019086799}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 1398648428}
+ - {fileID: 906714044}
+ m_Father: {fileID: 1187680250}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 448, y: 210}
+ m_SizeDelta: {x: 160, y: 20}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &2019086801
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2019086799}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_WrapAround: 0
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_SelectedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_SelectedTrigger: Selected
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 1398648429}
+ toggleTransition: 1
+ graphic: {fileID: 865202803}
+ m_Group: {fileID: 0}
+ onValueChanged:
+ m_PersistentCalls:
+ m_Calls:
+ - m_Target: {fileID: 1187680251}
+ m_TargetAssemblyTypeName: TestProject.ManualTests.AdditiveSceneToggleHandler,
+ Assembly-CSharp
+ m_MethodName: OnToggle
+ m_Mode: 1
+ m_Arguments:
+ m_ObjectArgument: {fileID: 0}
+ m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
+ m_IntArgument: 0
+ m_FloatArgument: 0
+ m_StringArgument:
+ m_BoolArgument: 0
+ m_CallState: 2
+ m_IsOn: 0
+--- !u!1 &2021718438
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 2021718439}
+ - component: {fileID: 2021718441}
+ - component: {fileID: 2021718440}
+ m_Layer: 5
+ m_Name: Background
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &2021718439
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2021718438}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 2058276876}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0.25}
+ m_AnchorMax: {x: 1, y: 0.75}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &2021718440
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2021718438}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, 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_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0}
+ m_Type: 1
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!222 &2021718441
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2021718438}
+ m_CullTransparentMesh: 1
+--- !u!1 &2028091268
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 2028091272}
+ - component: {fileID: 2028091271}
+ - component: {fileID: 2028091270}
+ - component: {fileID: 2028091269}
+ m_Layer: 0
+ m_Name: Side
+ m_TagString: Boundary
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!65 &2028091269
+BoxCollider:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2028091268}
+ m_Material: {fileID: 0}
+ m_IsTrigger: 0
+ m_Enabled: 1
+ serializedVersion: 2
+ m_Size: {x: 1, y: 1, z: 1}
+ m_Center: {x: 0, y: 0, z: 0}
+--- !u!23 &2028091270
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2028091268}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_StaticShadowCaster: 0
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RayTracingMode: 2
+ m_RayTraceProcedural: 0
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: 2100000, guid: 00cf8ac777c8c42e8967157f70fbfcbf, type: 2}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_ReceiveGI: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+ m_AdditionalVertexStreams: {fileID: 0}
+--- !u!33 &2028091271
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2028091268}
+ m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!4 &2028091272
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2028091268}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0.49999994, z: 30.5}
+ m_LocalScale: {x: 60, y: 3, z: 1}
+ m_Children: []
+ m_Father: {fileID: 1332123092}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &2058276875
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 2058276876}
+ - component: {fileID: 2058276877}
+ m_Layer: 5
+ m_Name: BoxGeneratorSlider
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &2058276876
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2058276875}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 2021718439}
+ - {fileID: 1889006547}
+ - {fileID: 1387688805}
+ - {fileID: 562991979}
+ m_Father: {fileID: 290861172}
+ m_RootOrder: 4
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 1}
+ m_AnchorMax: {x: 0.5, y: 1}
+ m_AnchoredPosition: {x: 0.99993896, y: -63.99997}
+ m_SizeDelta: {x: 400, y: 20}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &2058276877
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2058276875}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 67db9e8f0e2ae9c40bc1e2b64352a6b4, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_WrapAround: 0
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_SelectedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_SelectedTrigger: Selected
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 1523424138}
+ m_FillRect: {fileID: 1549858059}
+ m_HandleRect: {fileID: 1523424137}
+ m_Direction: 0
+ m_MinValue: 0
+ m_MaxValue: 550
+ m_WholeNumbers: 1
+ m_Value: 4
+ m_OnValueChanged:
+ m_PersistentCalls:
+ m_Calls:
+ - m_Target: {fileID: 1113539279}
+ m_TargetAssemblyTypeName: ServerBoxGenerator, Core
+ m_MethodName: UpdateSpawnsPerSecond
+ m_Mode: 1
+ m_Arguments:
+ m_ObjectArgument: {fileID: 0}
+ m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
+ m_IntArgument: 0
+ m_FloatArgument: 0
+ m_StringArgument:
+ m_BoolArgument: 0
+ m_CallState: 2
+--- !u!1 &2107482020
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 2107482021}
+ - component: {fileID: 2107482022}
+ - component: {fileID: 2107482023}
+ m_Layer: 0
+ m_Name: Stats
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &2107482021
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2107482020}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 318.45444, y: 110.697815, z: 216.79077}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 7
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &2107482022
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2107482020}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: cb5f3e55f5dd247129d8a4979b80ebbb, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_ClientServerToggle: {fileID: 1588117327}
+ m_TrackSceneEvents: 1
+ m_LogSceneEventsToConsole: 1
+--- !u!114 &2107482023
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2107482020}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ GlobalObjectIdHash: 3197939627
+ AlwaysReplicateAsRoot: 0
+ DontDestroyWithOwner: 0
+ AutoObjectParentSync: 1
+--- !u!1001 &2848221156282925290
+PrefabInstance:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_Modification:
+ m_TransformParent: {fileID: 290861172}
+ m_Modifications:
+ - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7,
+ type: 3}
+ propertyPath: m_Pivot.x
+ value: 0.5
+ objectReference: {fileID: 0}
+ - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7,
+ type: 3}
+ propertyPath: m_Pivot.y
+ value: 0.5
+ objectReference: {fileID: 0}
+ - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7,
+ type: 3}
+ propertyPath: m_RootOrder
+ value: 2
+ objectReference: {fileID: 0}
+ - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7,
+ type: 3}
+ propertyPath: m_AnchorMax.x
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7,
+ type: 3}
+ propertyPath: m_AnchorMax.y
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7,
+ type: 3}
+ propertyPath: m_AnchorMin.x
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7,
+ type: 3}
+ propertyPath: m_AnchorMin.y
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7,
+ type: 3}
+ propertyPath: m_SizeDelta.x
+ value: 20
+ objectReference: {fileID: 0}
+ - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7,
+ type: 3}
+ propertyPath: m_SizeDelta.y
+ value: 25
+ objectReference: {fileID: 0}
+ - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7,
+ type: 3}
+ propertyPath: m_LocalPosition.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7,
+ type: 3}
+ propertyPath: m_LocalPosition.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7,
+ type: 3}
+ propertyPath: m_LocalPosition.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7,
+ type: 3}
+ propertyPath: m_LocalRotation.w
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7,
+ type: 3}
+ propertyPath: m_LocalRotation.x
+ value: -0
+ objectReference: {fileID: 0}
+ - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7,
+ type: 3}
+ propertyPath: m_LocalRotation.y
+ value: -0
+ objectReference: {fileID: 0}
+ - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7,
+ type: 3}
+ propertyPath: m_LocalRotation.z
+ value: -0
+ objectReference: {fileID: 0}
+ - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7,
+ type: 3}
+ propertyPath: m_AnchoredPosition.x
+ value: -23.40039
+ objectReference: {fileID: 0}
+ - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7,
+ type: 3}
+ propertyPath: m_AnchoredPosition.y
+ value: -23.800293
+ objectReference: {fileID: 0}
+ - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7,
+ type: 3}
+ propertyPath: m_LocalEulerAnglesHint.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7,
+ type: 3}
+ propertyPath: m_LocalEulerAnglesHint.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7,
+ type: 3}
+ propertyPath: m_LocalEulerAnglesHint.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 2848221156307247795, guid: 3200770c16e3b2b4ebe7f604154faac7,
+ type: 3}
+ propertyPath: m_Name
+ value: ExitButton
+ objectReference: {fileID: 0}
+ - target: {fileID: 5266522511616468950, guid: 3200770c16e3b2b4ebe7f604154faac7,
+ type: 3}
+ propertyPath: m_SceneMenuToLoad
+ value:
+ objectReference: {fileID: 11400000, guid: c10d995498e0c514a853c3506031d3fb,
+ type: 2}
+ m_RemovedComponents: []
+ m_SourcePrefab: {fileID: 100100000, guid: 3200770c16e3b2b4ebe7f604154faac7, type: 3}
diff --git a/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/SceneTransitioningBase1.unity.meta b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/SceneTransitioningBase1.unity.meta
new file mode 100644
index 0000000000..b672e0c94a
--- /dev/null
+++ b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/SceneTransitioningBase1.unity.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 780f96a61e8ac8e41b638ae8ec3a3236
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/SceneTransitioningBase2.unity b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/SceneTransitioningBase2.unity
new file mode 100644
index 0000000000..2b0771283c
--- /dev/null
+++ b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/SceneTransitioningBase2.unity
@@ -0,0 +1,3339 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!29 &1
+OcclusionCullingSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_OcclusionBakeSettings:
+ smallestOccluder: 5
+ smallestHole: 0.25
+ backfaceThreshold: 100
+ m_SceneGUID: 00000000000000000000000000000000
+ m_OcclusionCullingData: {fileID: 0}
+--- !u!104 &2
+RenderSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 9
+ m_Fog: 0
+ m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
+ m_FogMode: 3
+ m_FogDensity: 0.01
+ m_LinearFogStart: 0
+ m_LinearFogEnd: 300
+ m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}
+ m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
+ m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
+ m_AmbientIntensity: 1
+ m_AmbientMode: 0
+ m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
+ m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0}
+ m_HaloStrength: 0.5
+ m_FlareStrength: 1
+ m_FlareFadeSpeed: 3
+ m_HaloTexture: {fileID: 0}
+ m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
+ m_DefaultReflectionMode: 0
+ m_DefaultReflectionResolution: 128
+ m_ReflectionBounces: 1
+ m_ReflectionIntensity: 1
+ m_CustomReflection: {fileID: 0}
+ m_Sun: {fileID: 0}
+ m_IndirectSpecularColor: {r: 0.44657898, g: 0.4964133, b: 0.5748178, a: 1}
+ m_UseRadianceAmbientProbe: 0
+--- !u!157 &3
+LightmapSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 12
+ m_GIWorkflowMode: 1
+ m_GISettings:
+ serializedVersion: 2
+ m_BounceScale: 1
+ m_IndirectOutputScale: 1
+ m_AlbedoBoost: 1
+ m_EnvironmentLightingMode: 0
+ m_EnableBakedLightmaps: 1
+ m_EnableRealtimeLightmaps: 0
+ m_LightmapEditorSettings:
+ serializedVersion: 12
+ m_Resolution: 2
+ m_BakeResolution: 40
+ m_AtlasSize: 1024
+ m_AO: 0
+ m_AOMaxDistance: 1
+ m_CompAOExponent: 1
+ m_CompAOExponentDirect: 0
+ m_ExtractAmbientOcclusion: 0
+ m_Padding: 2
+ m_LightmapParameters: {fileID: 0}
+ m_LightmapsBakeMode: 1
+ m_TextureCompression: 1
+ m_FinalGather: 0
+ m_FinalGatherFiltering: 1
+ m_FinalGatherRayCount: 256
+ m_ReflectionCompression: 2
+ m_MixedBakeMode: 2
+ m_BakeBackend: 1
+ m_PVRSampling: 1
+ m_PVRDirectSampleCount: 32
+ m_PVRSampleCount: 512
+ m_PVRBounces: 2
+ m_PVREnvironmentSampleCount: 256
+ m_PVREnvironmentReferencePointCount: 2048
+ m_PVRFilteringMode: 1
+ m_PVRDenoiserTypeDirect: 1
+ m_PVRDenoiserTypeIndirect: 1
+ m_PVRDenoiserTypeAO: 1
+ m_PVRFilterTypeDirect: 0
+ m_PVRFilterTypeIndirect: 0
+ m_PVRFilterTypeAO: 0
+ m_PVREnvironmentMIS: 1
+ m_PVRCulling: 1
+ m_PVRFilteringGaussRadiusDirect: 1
+ m_PVRFilteringGaussRadiusIndirect: 5
+ m_PVRFilteringGaussRadiusAO: 2
+ m_PVRFilteringAtrousPositionSigmaDirect: 0.5
+ m_PVRFilteringAtrousPositionSigmaIndirect: 2
+ m_PVRFilteringAtrousPositionSigmaAO: 1
+ m_ExportTrainingData: 0
+ m_TrainingDataDestination: TrainingData
+ m_LightProbeSampleCountMultiplier: 4
+ m_LightingDataAsset: {fileID: 0}
+ m_LightingSettings: {fileID: 903034822}
+--- !u!196 &4
+NavMeshSettings:
+ serializedVersion: 2
+ m_ObjectHideFlags: 0
+ m_BuildSettings:
+ serializedVersion: 2
+ agentTypeID: 0
+ agentRadius: 0.5
+ agentHeight: 2
+ agentSlope: 45
+ agentClimb: 0.4
+ ledgeDropHeight: 0
+ maxJumpAcrossDistance: 0
+ minRegionArea: 2
+ manualCellSize: 0
+ cellSize: 0.16666667
+ manualTileSize: 0
+ tileSize: 256
+ accuratePlacement: 0
+ maxJobWorkers: 0
+ preserveTilesOutsideBounds: 0
+ debug:
+ m_Flags: 0
+ m_NavMeshData: {fileID: 0}
+--- !u!1 &34066664
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 34066665}
+ - component: {fileID: 34066667}
+ m_Layer: 5
+ m_Name: SwitchSceneParent
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &34066665
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 34066664}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 1347823142}
+ m_Father: {fileID: 290861172}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0}
+ m_AnchorMax: {x: 0.5, y: 0}
+ m_AnchoredPosition: {x: 0, y: 100}
+ m_SizeDelta: {x: 100, y: 100}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &34066667
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 34066664}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 244f0414ea8419b41ac51adb305d64b0, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_SwitchSceneButtonObject: {fileID: 1347823141}
+ m_SceneToSwitchTo: SceneTransitioningBase1
+ m_EnableAutoSwitch: 0
+ m_AutoSwitchTimeOut: 60
+--- !u!1 &37242881
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 37242883}
+ - component: {fileID: 37242882}
+ m_Layer: 0
+ m_Name: Directional Light
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!108 &37242882
+Light:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 37242881}
+ m_Enabled: 1
+ serializedVersion: 10
+ m_Type: 1
+ m_Shape: 0
+ m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1}
+ m_Intensity: 1
+ m_Range: 10
+ m_SpotAngle: 30
+ m_InnerSpotAngle: 21.80208
+ m_CookieSize: 10
+ m_Shadows:
+ m_Type: 2
+ m_Resolution: -1
+ m_CustomResolution: -1
+ m_Strength: 1
+ m_Bias: 0.05
+ m_NormalBias: 0.4
+ m_NearPlane: 0.2
+ m_CullingMatrixOverride:
+ e00: 1
+ e01: 0
+ e02: 0
+ e03: 0
+ e10: 0
+ e11: 1
+ e12: 0
+ e13: 0
+ e20: 0
+ e21: 0
+ e22: 1
+ e23: 0
+ e30: 0
+ e31: 0
+ e32: 0
+ e33: 1
+ m_UseCullingMatrixOverride: 0
+ m_Cookie: {fileID: 0}
+ m_DrawHalo: 0
+ m_Flare: {fileID: 0}
+ m_RenderMode: 0
+ m_CullingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+ m_RenderingLayerMask: 1
+ m_Lightmapping: 4
+ m_LightShadowCasterMode: 0
+ m_AreaSize: {x: 1, y: 1}
+ m_BounceIntensity: 1
+ m_ColorTemperature: 6570
+ m_UseColorTemperature: 0
+ m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0}
+ m_UseBoundingSphereOverride: 0
+ m_UseViewFrustumForShadowCasterCull: 1
+ m_ShadowRadius: 0
+ m_ShadowAngle: 0
+--- !u!4 &37242883
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 37242881}
+ m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261}
+ m_LocalPosition: {x: 0, y: 3, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0}
+--- !u!224 &42803802 stripped
+RectTransform:
+ m_CorrespondingSourceObject: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7,
+ type: 3}
+ m_PrefabInstance: {fileID: 2848221156282925290}
+ m_PrefabAsset: {fileID: 0}
+--- !u!1 &44393279
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 44393280}
+ - component: {fileID: 44393282}
+ - component: {fileID: 44393281}
+ m_Layer: 5
+ m_Name: Background
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &44393280
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 44393279}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 1429502879}
+ m_Father: {fileID: 362129048}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 1}
+ m_AnchorMax: {x: 0, y: 1}
+ m_AnchoredPosition: {x: 10, y: -10}
+ m_SizeDelta: {x: 20, y: 20}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &44393281
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 44393279}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, 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_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
+ m_Type: 1
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!222 &44393282
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 44393279}
+ m_CullTransparentMesh: 1
+--- !u!1 &57065841
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 57065842}
+ - component: {fileID: 57065844}
+ - component: {fileID: 57065843}
+ m_Layer: 5
+ m_Name: Label
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &57065842
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 57065841}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 362129048}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 9, y: -0.5}
+ m_SizeDelta: {x: -28, y: -3}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &57065843
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 57065841}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 14
+ m_FontStyle: 1
+ m_BestFit: 1
+ m_MinSize: 1
+ m_MaxSize: 40
+ m_Alignment: 0
+ m_AlignByGeometry: 1
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: Additive Scene - 4
+--- !u!222 &57065844
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 57065841}
+ m_CullTransparentMesh: 1
+--- !u!1 &57392470
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 57392474}
+ - component: {fileID: 57392473}
+ - component: {fileID: 57392472}
+ - component: {fileID: 57392471}
+ m_Layer: 0
+ m_Name: Side
+ m_TagString: Boundary
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!65 &57392471
+BoxCollider:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 57392470}
+ m_Material: {fileID: 0}
+ m_IsTrigger: 0
+ m_Enabled: 1
+ serializedVersion: 2
+ m_Size: {x: 1, y: 1, z: 1}
+ m_Center: {x: 0, y: 0, z: 0}
+--- !u!23 &57392472
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 57392470}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_StaticShadowCaster: 0
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RayTracingMode: 2
+ m_RayTraceProcedural: 0
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: 2100000, guid: 00cf8ac777c8c42e8967157f70fbfcbf, type: 2}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_ReceiveGI: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+ m_AdditionalVertexStreams: {fileID: 0}
+--- !u!33 &57392473
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 57392470}
+ m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!4 &57392474
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 57392470}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: -30.5, y: 0.49999994, z: 0}
+ m_LocalScale: {x: 1, y: 3, z: 62}
+ m_Children: []
+ m_Father: {fileID: 1332123092}
+ m_RootOrder: 3
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &167044830
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 167044834}
+ - component: {fileID: 167044833}
+ - component: {fileID: 167044832}
+ - component: {fileID: 167044831}
+ m_Layer: 5
+ m_Name: Canvas
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!114 &167044831
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 167044830}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_IgnoreReversedGraphics: 1
+ m_BlockingObjects: 0
+ m_BlockingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+--- !u!114 &167044832
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 167044830}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_UiScaleMode: 0
+ m_ReferencePixelsPerUnit: 100
+ m_ScaleFactor: 1
+ m_ReferenceResolution: {x: 800, y: 600}
+ m_ScreenMatchMode: 0
+ m_MatchWidthOrHeight: 0
+ m_PhysicalUnit: 3
+ m_FallbackScreenDPI: 96
+ m_DefaultSpriteDPI: 96
+ m_DynamicPixelsPerUnit: 1
+ m_PresetInfoIsWorld: 0
+--- !u!223 &167044833
+Canvas:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 167044830}
+ m_Enabled: 1
+ serializedVersion: 3
+ m_RenderMode: 0
+ m_Camera: {fileID: 0}
+ m_PlaneDistance: 100
+ m_PixelPerfect: 0
+ m_ReceivesEvents: 1
+ m_OverrideSorting: 0
+ m_OverridePixelPerfect: 0
+ m_SortingBucketNormalizedSize: 0
+ m_AdditionalShaderChannelsFlag: 0
+ m_SortingLayerID: 0
+ m_SortingOrder: 0
+ m_TargetDisplay: 0
+--- !u!224 &167044834
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 167044830}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 0, y: 0, z: 0}
+ m_Children:
+ - {fileID: 1865409449}
+ m_Father: {fileID: 0}
+ m_RootOrder: 2
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0, y: 0}
+--- !u!1 &290861168
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 290861172}
+ - component: {fileID: 290861171}
+ - component: {fileID: 290861170}
+ - component: {fileID: 290861169}
+ m_Layer: 5
+ m_Name: UI
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!114 &290861169
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 290861168}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_IgnoreReversedGraphics: 1
+ m_BlockingObjects: 0
+ m_BlockingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+--- !u!114 &290861170
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 290861168}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_UiScaleMode: 1
+ m_ReferencePixelsPerUnit: 100
+ m_ScaleFactor: 1
+ m_ReferenceResolution: {x: 1024, y: 768}
+ m_ScreenMatchMode: 0
+ m_MatchWidthOrHeight: 0.5
+ m_PhysicalUnit: 3
+ m_FallbackScreenDPI: 96
+ m_DefaultSpriteDPI: 96
+ m_DynamicPixelsPerUnit: 1
+ m_PresetInfoIsWorld: 0
+--- !u!223 &290861171
+Canvas:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 290861168}
+ m_Enabled: 1
+ serializedVersion: 3
+ m_RenderMode: 0
+ m_Camera: {fileID: 575203309}
+ m_PlaneDistance: 100
+ m_PixelPerfect: 0
+ m_ReceivesEvents: 1
+ m_OverrideSorting: 0
+ m_OverridePixelPerfect: 0
+ m_SortingBucketNormalizedSize: 0
+ m_AdditionalShaderChannelsFlag: 0
+ m_SortingLayerID: 0
+ m_SortingOrder: 0
+ m_TargetDisplay: 0
+--- !u!224 &290861172
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 290861168}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 0, y: 0, z: 0}
+ m_Children:
+ - {fileID: 1588117328}
+ - {fileID: 34066665}
+ - {fileID: 42803802}
+ - {fileID: 1834318148}
+ - {fileID: 2058276876}
+ - {fileID: 1383741138}
+ - {fileID: 884557066}
+ - {fileID: 291820796}
+ m_Father: {fileID: 0}
+ m_RootOrder: 3
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0, y: 0}
+--- !u!1 &291820795
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 291820796}
+ - component: {fileID: 291820797}
+ m_Layer: 5
+ m_Name: ToggleTwoParent
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &291820796
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 291820795}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 362129048}
+ m_Father: {fileID: 290861172}
+ m_RootOrder: 7
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 100, y: 100}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &291820797
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 291820795}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 475de064003ff104fb88b1fbccd0f417, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_ActivateOnLoad: 1
+ m_SceneToLoad: AdditiveScene4
+ m_SceneAsset: {fileID: 102900000, guid: dc7e17c86f5ca81478043be306027c13, type: 3}
+--- !u!1 &300124661
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 300124662}
+ - component: {fileID: 300124663}
+ m_Layer: 5
+ m_Name: AdditiveSceneOne
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &300124662
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 300124661}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 1689223598}
+ - {fileID: 1638885888}
+ m_Father: {fileID: 884557066}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 448, y: 236.09998}
+ m_SizeDelta: {x: 160, y: 20}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &300124663
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 300124661}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_WrapAround: 0
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_SelectedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_SelectedTrigger: Selected
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 1689223599}
+ toggleTransition: 1
+ graphic: {fileID: 1691305197}
+ m_Group: {fileID: 0}
+ onValueChanged:
+ m_PersistentCalls:
+ m_Calls:
+ - m_Target: {fileID: 884557067}
+ m_TargetAssemblyTypeName: TestProject.ManualTests.AdditiveSceneToggleHandler,
+ Assembly-CSharp
+ m_MethodName: OnToggle
+ m_Mode: 1
+ m_Arguments:
+ m_ObjectArgument: {fileID: 0}
+ m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
+ m_IntArgument: 0
+ m_FloatArgument: 0
+ m_StringArgument:
+ m_BoolArgument: 0
+ m_CallState: 2
+ m_IsOn: 0
+--- !u!1 &336568645
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 336568649}
+ - component: {fileID: 336568648}
+ - component: {fileID: 336568647}
+ - component: {fileID: 336568646}
+ m_Layer: 0
+ m_Name: Floor
+ m_TagString: Floor
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!65 &336568646
+BoxCollider:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 336568645}
+ m_Material: {fileID: 0}
+ m_IsTrigger: 0
+ m_Enabled: 1
+ serializedVersion: 2
+ m_Size: {x: 1, y: 1, z: 1}
+ m_Center: {x: 0, y: 0, z: 0}
+--- !u!23 &336568647
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 336568645}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_StaticShadowCaster: 0
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RayTracingMode: 2
+ m_RayTraceProcedural: 0
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: 2100000, guid: 00cf8ac777c8c42e8967157f70fbfcbf, type: 2}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_ReceiveGI: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+ m_AdditionalVertexStreams: {fileID: 0}
+--- !u!33 &336568648
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 336568645}
+ m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!4 &336568649
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 336568645}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: -0.50000006, z: 0}
+ m_LocalScale: {x: 60, y: 1, z: 60}
+ m_Children: []
+ m_Father: {fileID: 1332123092}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &362129047
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 362129048}
+ - component: {fileID: 362129049}
+ m_Layer: 5
+ m_Name: AdditiveSceneTwo
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &362129048
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 362129047}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 44393280}
+ - {fileID: 57065842}
+ m_Father: {fileID: 291820796}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 448, y: 210}
+ m_SizeDelta: {x: 160, y: 20}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &362129049
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 362129047}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_WrapAround: 0
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_SelectedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_SelectedTrigger: Selected
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 44393281}
+ toggleTransition: 1
+ graphic: {fileID: 1429502880}
+ m_Group: {fileID: 0}
+ onValueChanged:
+ m_PersistentCalls:
+ m_Calls:
+ - m_Target: {fileID: 291820797}
+ m_TargetAssemblyTypeName: TestProject.ManualTests.AdditiveSceneToggleHandler,
+ Assembly-CSharp
+ m_MethodName: OnToggle
+ m_Mode: 1
+ m_Arguments:
+ m_ObjectArgument: {fileID: 0}
+ m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
+ m_IntArgument: 0
+ m_FloatArgument: 0
+ m_StringArgument:
+ m_BoolArgument: 0
+ m_CallState: 2
+ m_IsOn: 0
+--- !u!1 &562991978
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 562991979}
+ - component: {fileID: 562991981}
+ - component: {fileID: 562991980}
+ m_Layer: 5
+ m_Name: BoxGeneratorCount
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &562991979
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 562991978}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 2058276876}
+ m_RootOrder: 3
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 3, y: 20}
+ m_SizeDelta: {x: 160, y: 30}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &562991980
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 562991978}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.9811321, g: 0.9811321, b: 0.9811321, 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_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 18
+ m_FontStyle: 1
+ m_BestFit: 0
+ m_MinSize: 1
+ m_MaxSize: 40
+ m_Alignment: 4
+ m_AlignByGeometry: 0
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: 0
+--- !u!222 &562991981
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 562991978}
+ m_CullTransparentMesh: 1
+--- !u!1 &575203307
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 575203310}
+ - component: {fileID: 575203309}
+ - component: {fileID: 575203308}
+ m_Layer: 0
+ m_Name: Main Camera
+ m_TagString: MainCamera
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!81 &575203308
+AudioListener:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 575203307}
+ m_Enabled: 1
+--- !u!20 &575203309
+Camera:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 575203307}
+ m_Enabled: 1
+ serializedVersion: 2
+ m_ClearFlags: 1
+ m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0}
+ m_projectionMatrixMode: 1
+ m_GateFitMode: 2
+ m_FOVAxisMode: 0
+ m_SensorSize: {x: 36, y: 24}
+ m_LensShift: {x: 0, y: 0}
+ m_FocalLength: 50
+ m_NormalizedViewPortRect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 1
+ height: 1
+ near clip plane: 0.3
+ far clip plane: 1000
+ field of view: 60
+ orthographic: 0
+ orthographic size: 5
+ m_Depth: -1
+ m_CullingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+ m_RenderingPath: -1
+ m_TargetTexture: {fileID: 0}
+ m_TargetDisplay: 0
+ m_TargetEye: 3
+ m_HDR: 1
+ m_AllowMSAA: 1
+ m_AllowDynamicResolution: 0
+ m_ForceIntoRT: 0
+ m_OcclusionCulling: 1
+ m_StereoConvergence: 10
+ m_StereoSeparation: 0.022
+--- !u!4 &575203310
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 575203307}
+ m_LocalRotation: {x: 0.41890106, y: -0, z: -0, w: 0.9080319}
+ m_LocalPosition: {x: 0, y: 42, z: -46}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 49.530003, y: 0, z: 0}
+--- !u!1 &599972120
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 599972121}
+ - component: {fileID: 599972123}
+ - component: {fileID: 599972122}
+ m_Layer: 5
+ m_Name: Text
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &599972121
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 599972120}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 1588117328}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &599972122
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 599972120}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 0.5058824, b: 0.003921569, 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_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 14
+ m_FontStyle: 0
+ m_BestFit: 0
+ m_MinSize: 10
+ m_MaxSize: 40
+ m_Alignment: 4
+ m_AlignByGeometry: 0
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: Show Server Stats
+--- !u!222 &599972123
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 599972120}
+ m_CullTransparentMesh: 1
+--- !u!1 &884557065
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 884557066}
+ - component: {fileID: 884557067}
+ m_Layer: 5
+ m_Name: ToggleOneParent
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &884557066
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 884557065}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 300124662}
+ m_Father: {fileID: 290861172}
+ m_RootOrder: 6
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 100, y: 100}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &884557067
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 884557065}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 475de064003ff104fb88b1fbccd0f417, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_ActivateOnLoad: 1
+ m_SceneToLoad: AdditiveScene3
+ m_SceneAsset: {fileID: 102900000, guid: 7da3dd618f5b5a34db1f6d3c9511e221, type: 3}
+--- !u!850595691 &903034822
+LightingSettings:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name:
+ serializedVersion: 3
+ m_GIWorkflowMode: 1
+ m_EnableBakedLightmaps: 1
+ m_EnableRealtimeLightmaps: 0
+ m_RealtimeEnvironmentLighting: 1
+ m_BounceScale: 1
+ m_AlbedoBoost: 1
+ m_IndirectOutputScale: 1
+ m_UsingShadowmask: 1
+ m_BakeBackend: 1
+ m_LightmapMaxSize: 1024
+ m_BakeResolution: 40
+ m_Padding: 2
+ m_TextureCompression: 1
+ m_AO: 0
+ m_AOMaxDistance: 1
+ m_CompAOExponent: 1
+ m_CompAOExponentDirect: 0
+ m_ExtractAO: 0
+ m_MixedBakeMode: 2
+ m_LightmapsBakeMode: 1
+ m_FilterMode: 1
+ m_LightmapParameters: {fileID: 15204, guid: 0000000000000000f000000000000000, type: 0}
+ m_ExportTrainingData: 0
+ m_TrainingDataDestination: TrainingData
+ m_RealtimeResolution: 2
+ m_ForceWhiteAlbedo: 0
+ m_ForceUpdates: 0
+ m_FinalGather: 0
+ m_FinalGatherRayCount: 256
+ m_FinalGatherFiltering: 1
+ m_PVRCulling: 1
+ m_PVRSampling: 1
+ m_PVRDirectSampleCount: 32
+ m_PVRSampleCount: 512
+ m_PVREnvironmentSampleCount: 256
+ m_PVREnvironmentReferencePointCount: 2048
+ m_LightProbeSampleCountMultiplier: 4
+ m_PVRBounces: 2
+ m_PVRMinBounces: 1
+ m_PVREnvironmentMIS: 1
+ m_PVRFilteringMode: 1
+ m_PVRDenoiserTypeDirect: 1
+ m_PVRDenoiserTypeIndirect: 1
+ m_PVRDenoiserTypeAO: 1
+ m_PVRFilterTypeDirect: 0
+ m_PVRFilterTypeIndirect: 0
+ m_PVRFilterTypeAO: 0
+ m_PVRFilteringGaussRadiusDirect: 1
+ m_PVRFilteringGaussRadiusIndirect: 5
+ m_PVRFilteringGaussRadiusAO: 2
+ m_PVRFilteringAtrousPositionSigmaDirect: 0.5
+ m_PVRFilteringAtrousPositionSigmaIndirect: 2
+ m_PVRFilteringAtrousPositionSigmaAO: 1
+--- !u!1 &1113539278
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1113539280}
+ - component: {fileID: 1113539281}
+ - component: {fileID: 1113539279}
+ m_Layer: 0
+ m_Name: PooledPrefabSpawnHandler
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!114 &1113539279
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1113539278}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 8c48ea35c67e64f7fac22a3f6831ca88, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ AutoSpawnEnable: 1
+ InitialSpawnDelay: 0.2
+ SpawnsPerSecond: 1
+ PoolSize: 32
+ ObjectSpeed: 8
+ EnableHandler: 1
+ RegisterUsingNetworkObject: 0
+ ServerObjectToPool: {fileID: 47844432802121000, guid: 894296ee6a442ef49b3637b680c7bdf7,
+ type: 3}
+ ClientObjectToPool: {fileID: 0}
+ SwitchScene: {fileID: 0}
+ SpawnSlider: {fileID: 2058276877}
+ SpawnSliderValueText: {fileID: 562991980}
+--- !u!4 &1113539280
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1113539278}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0.5, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 4
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &1113539281
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1113539278}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ GlobalObjectIdHash: 3420537353
+ AlwaysReplicateAsRoot: 0
+ DontDestroyWithOwner: 0
+ AutoObjectParentSync: 1
+--- !u!1 &1332123091
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1332123092}
+ m_Layer: 0
+ m_Name: Level
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &1332123092
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1332123091}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0.000000059604645, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 336568649}
+ - {fileID: 2028091272}
+ - {fileID: 1857685347}
+ - {fileID: 57392474}
+ - {fileID: 1336081255}
+ m_Father: {fileID: 0}
+ m_RootOrder: 5
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &1336081251
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1336081255}
+ - component: {fileID: 1336081254}
+ - component: {fileID: 1336081253}
+ - component: {fileID: 1336081252}
+ m_Layer: 0
+ m_Name: Side
+ m_TagString: Boundary
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!65 &1336081252
+BoxCollider:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1336081251}
+ m_Material: {fileID: 0}
+ m_IsTrigger: 0
+ m_Enabled: 1
+ serializedVersion: 2
+ m_Size: {x: 1, y: 1, z: 1}
+ m_Center: {x: 0, y: 0, z: 0}
+--- !u!23 &1336081253
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1336081251}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_StaticShadowCaster: 0
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RayTracingMode: 2
+ m_RayTraceProcedural: 0
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: 2100000, guid: 00cf8ac777c8c42e8967157f70fbfcbf, type: 2}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_ReceiveGI: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+ m_AdditionalVertexStreams: {fileID: 0}
+--- !u!33 &1336081254
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1336081251}
+ m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!4 &1336081255
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1336081251}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 30.5, y: 0.49999994, z: 0}
+ m_LocalScale: {x: 1, y: 3, z: 62}
+ m_Children: []
+ m_Father: {fileID: 1332123092}
+ m_RootOrder: 4
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &1347823141
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1347823142}
+ - component: {fileID: 1347823145}
+ - component: {fileID: 1347823144}
+ - component: {fileID: 1347823143}
+ m_Layer: 5
+ m_Name: SwitchSceneButton
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1347823142
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1347823141}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 1846334315}
+ m_Father: {fileID: 34066665}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0}
+ m_AnchorMax: {x: 0.5, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 160, y: 30}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1347823143
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1347823141}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_WrapAround: 0
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_SelectedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_SelectedTrigger: Selected
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 1347823144}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls:
+ - m_Target: {fileID: 34066667}
+ m_TargetAssemblyTypeName: TestProject.ManualTests.SwitchSceneHandler, TestProject.ManualTests
+ m_MethodName: OnSwitchScene
+ m_Mode: 1
+ m_Arguments:
+ m_ObjectArgument: {fileID: 0}
+ m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
+ m_IntArgument: 0
+ m_FloatArgument: 0
+ m_StringArgument:
+ m_BoolArgument: 0
+ m_CallState: 2
+--- !u!114 &1347823144
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1347823141}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.1981132, g: 0.1981132, b: 0.1981132, 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_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
+ m_Type: 1
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!222 &1347823145
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1347823141}
+ m_CullTransparentMesh: 1
+--- !u!1 &1383741137
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1383741138}
+ - component: {fileID: 1383741140}
+ - component: {fileID: 1383741139}
+ m_Layer: 5
+ m_Name: SceneName
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1383741138
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1383741137}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 290861172}
+ m_RootOrder: 5
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 1, y: 0}
+ m_AnchorMax: {x: 1, y: 0}
+ m_AnchoredPosition: {x: -139.70001, y: 45.59999}
+ m_SizeDelta: {x: 250, y: 30}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1383741139
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1383741137}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.990566, g: 0.990566, b: 0.990566, 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_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 18
+ m_FontStyle: 1
+ m_BestFit: 0
+ m_MinSize: 1
+ m_MaxSize: 40
+ m_Alignment: 4
+ m_AlignByGeometry: 0
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: Scene Transitioning Base - 2
+--- !u!222 &1383741140
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1383741137}
+ m_CullTransparentMesh: 0
+--- !u!1 &1387688804
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1387688805}
+ m_Layer: 5
+ m_Name: Handle Slide Area
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1387688805
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1387688804}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 1523424137}
+ m_Father: {fileID: 2058276876}
+ m_RootOrder: 2
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: -20, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!1 &1429502878
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1429502879}
+ - component: {fileID: 1429502881}
+ - component: {fileID: 1429502880}
+ m_Layer: 5
+ m_Name: Checkmark
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1429502879
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1429502878}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 44393280}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 20, y: 20}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1429502880
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1429502878}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, 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_Sprite: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!222 &1429502881
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1429502878}
+ m_CullTransparentMesh: 1
+--- !u!1 &1523424136
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1523424137}
+ - component: {fileID: 1523424139}
+ - component: {fileID: 1523424138}
+ m_Layer: 5
+ m_Name: Handle
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1523424137
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1523424136}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 1387688805}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 20, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1523424138
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1523424136}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, 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_Sprite: {fileID: 10913, guid: 0000000000000000f000000000000000, type: 0}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!222 &1523424139
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1523424136}
+ m_CullTransparentMesh: 1
+--- !u!1 &1549858058
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1549858059}
+ - component: {fileID: 1549858061}
+ - component: {fileID: 1549858060}
+ m_Layer: 5
+ m_Name: Fill
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1549858059
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1549858058}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 1889006547}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 10, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1549858060
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1549858058}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, 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_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
+ m_Type: 1
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!222 &1549858061
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1549858058}
+ m_CullTransparentMesh: 1
+--- !u!1 &1588117327
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1588117328}
+ - component: {fileID: 1588117331}
+ - component: {fileID: 1588117330}
+ - component: {fileID: 1588117329}
+ m_Layer: 5
+ m_Name: ToggleClientServerStats
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1588117328
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1588117327}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 599972121}
+ m_Father: {fileID: 290861172}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 130, y: 51}
+ m_SizeDelta: {x: 160, y: 30}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1588117329
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1588117327}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_WrapAround: 0
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_SelectedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_SelectedTrigger: Selected
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 1588117330}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls:
+ - m_Target: {fileID: 2107482022}
+ m_TargetAssemblyTypeName: StatsDisplay, Assembly-CSharp
+ m_MethodName: ToggleClientSever
+ m_Mode: 1
+ m_Arguments:
+ m_ObjectArgument: {fileID: 0}
+ m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
+ m_IntArgument: 0
+ m_FloatArgument: 0
+ m_StringArgument:
+ m_BoolArgument: 0
+ m_CallState: 2
+--- !u!114 &1588117330
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1588117327}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.1981132, g: 0.1981132, b: 0.1981132, 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_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
+ m_Type: 1
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!222 &1588117331
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1588117327}
+ m_CullTransparentMesh: 1
+--- !u!1 &1638885887
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1638885888}
+ - component: {fileID: 1638885890}
+ - component: {fileID: 1638885889}
+ m_Layer: 5
+ m_Name: Label
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1638885888
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1638885887}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 300124662}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 9, y: -0.5}
+ m_SizeDelta: {x: -28, y: -3}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1638885889
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1638885887}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, 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_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 14
+ m_FontStyle: 1
+ m_BestFit: 1
+ m_MinSize: 1
+ m_MaxSize: 40
+ m_Alignment: 0
+ m_AlignByGeometry: 1
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: Additive Scene - 3
+--- !u!222 &1638885890
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1638885887}
+ m_CullTransparentMesh: 1
+--- !u!1 &1689223597
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1689223598}
+ - component: {fileID: 1689223600}
+ - component: {fileID: 1689223599}
+ m_Layer: 5
+ m_Name: Background
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1689223598
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1689223597}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 1691305196}
+ m_Father: {fileID: 300124662}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 1}
+ m_AnchorMax: {x: 0, y: 1}
+ m_AnchoredPosition: {x: 10, y: -10}
+ m_SizeDelta: {x: 20, y: 20}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1689223599
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1689223597}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, 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_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
+ m_Type: 1
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!222 &1689223600
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1689223597}
+ m_CullTransparentMesh: 1
+--- !u!1 &1691305195
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1691305196}
+ - component: {fileID: 1691305198}
+ - component: {fileID: 1691305197}
+ m_Layer: 5
+ m_Name: Checkmark
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1691305196
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1691305195}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 1689223598}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 20, y: 20}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1691305197
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1691305195}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, 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_Sprite: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!222 &1691305198
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1691305195}
+ m_CullTransparentMesh: 1
+--- !u!1 &1834318145
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1834318148}
+ - component: {fileID: 1834318147}
+ - component: {fileID: 1834318146}
+ m_Layer: 0
+ m_Name: EventSystem
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!114 &1834318146
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1834318145}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_HorizontalAxis: Horizontal
+ m_VerticalAxis: Vertical
+ m_SubmitButton: Submit
+ m_CancelButton: Cancel
+ m_InputActionsPerSecond: 10
+ m_RepeatDelay: 0.5
+ m_ForceModuleActive: 0
+--- !u!114 &1834318147
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1834318145}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_FirstSelected: {fileID: 0}
+ m_sendNavigationEvents: 1
+ m_DragThreshold: 10
+--- !u!4 &1834318148
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1834318145}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: -431, y: -242.5, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 290861172}
+ m_RootOrder: 3
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &1846334314
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1846334315}
+ - component: {fileID: 1846334317}
+ - component: {fileID: 1846334316}
+ m_Layer: 5
+ m_Name: Text
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1846334315
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1846334314}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 1347823142}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1846334316
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1846334314}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 0.5058824, b: 0.003921569, 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_FontData:
+ m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+ m_FontSize: 14
+ m_FontStyle: 0
+ m_BestFit: 0
+ m_MinSize: 10
+ m_MaxSize: 40
+ m_Alignment: 4
+ m_AlignByGeometry: 0
+ m_RichText: 1
+ m_HorizontalOverflow: 0
+ m_VerticalOverflow: 0
+ m_LineSpacing: 1
+ m_Text: Switch Scene
+--- !u!222 &1846334317
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1846334314}
+ m_CullTransparentMesh: 1
+--- !u!1 &1857685343
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1857685347}
+ - component: {fileID: 1857685346}
+ - component: {fileID: 1857685345}
+ - component: {fileID: 1857685344}
+ m_Layer: 0
+ m_Name: Side
+ m_TagString: Boundary
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!65 &1857685344
+BoxCollider:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1857685343}
+ m_Material: {fileID: 0}
+ m_IsTrigger: 0
+ m_Enabled: 1
+ serializedVersion: 2
+ m_Size: {x: 1, y: 1, z: 1}
+ m_Center: {x: 0, y: 0, z: 0}
+--- !u!23 &1857685345
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1857685343}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_StaticShadowCaster: 0
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RayTracingMode: 2
+ m_RayTraceProcedural: 0
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: 2100000, guid: 00cf8ac777c8c42e8967157f70fbfcbf, type: 2}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_ReceiveGI: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+ m_AdditionalVertexStreams: {fileID: 0}
+--- !u!33 &1857685346
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1857685343}
+ m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!4 &1857685347
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1857685343}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0.49999994, z: -30.5}
+ m_LocalScale: {x: 60, y: 3, z: 1}
+ m_Children: []
+ m_Father: {fileID: 1332123092}
+ m_RootOrder: 2
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1001 &1865409448
+PrefabInstance:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_Modification:
+ m_TransformParent: {fileID: 167044834}
+ m_Modifications:
+ - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84,
+ type: 3}
+ propertyPath: m_Pivot.x
+ value: 0.5
+ objectReference: {fileID: 0}
+ - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84,
+ type: 3}
+ propertyPath: m_Pivot.y
+ value: 0.5
+ objectReference: {fileID: 0}
+ - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84,
+ type: 3}
+ propertyPath: m_RootOrder
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84,
+ type: 3}
+ propertyPath: m_AnchorMax.x
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84,
+ type: 3}
+ propertyPath: m_AnchorMax.y
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84,
+ type: 3}
+ propertyPath: m_AnchorMin.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84,
+ type: 3}
+ propertyPath: m_AnchorMin.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84,
+ type: 3}
+ propertyPath: m_SizeDelta.x
+ value: -952
+ objectReference: {fileID: 0}
+ - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84,
+ type: 3}
+ propertyPath: m_SizeDelta.y
+ value: -344
+ objectReference: {fileID: 0}
+ - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84,
+ type: 3}
+ propertyPath: m_LocalPosition.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84,
+ type: 3}
+ propertyPath: m_LocalPosition.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84,
+ type: 3}
+ propertyPath: m_LocalPosition.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84,
+ type: 3}
+ propertyPath: m_LocalRotation.w
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84,
+ type: 3}
+ propertyPath: m_LocalRotation.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84,
+ type: 3}
+ propertyPath: m_LocalRotation.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84,
+ type: 3}
+ propertyPath: m_LocalRotation.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84,
+ type: 3}
+ propertyPath: m_AnchoredPosition.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84,
+ type: 3}
+ propertyPath: m_AnchoredPosition.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84,
+ type: 3}
+ propertyPath: m_LocalEulerAnglesHint.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84,
+ type: 3}
+ propertyPath: m_LocalEulerAnglesHint.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84,
+ type: 3}
+ propertyPath: m_LocalEulerAnglesHint.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 6963777608485144162, guid: d725b5588e1b956458798319e6541d84,
+ type: 3}
+ propertyPath: m_Name
+ value: ConnectionModeButtons
+ objectReference: {fileID: 0}
+ m_RemovedComponents: []
+ m_SourcePrefab: {fileID: 100100000, guid: d725b5588e1b956458798319e6541d84, type: 3}
+--- !u!224 &1865409449 stripped
+RectTransform:
+ m_CorrespondingSourceObject: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84,
+ type: 3}
+ m_PrefabInstance: {fileID: 1865409448}
+ m_PrefabAsset: {fileID: 0}
+--- !u!1 &1889006546
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1889006547}
+ m_Layer: 5
+ m_Name: Fill Area
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &1889006547
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1889006546}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 1549858059}
+ m_Father: {fileID: 2058276876}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0.25}
+ m_AnchorMax: {x: 1, y: 0.75}
+ m_AnchoredPosition: {x: -5, y: 0}
+ m_SizeDelta: {x: -20, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!1 &2021718438
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 2021718439}
+ - component: {fileID: 2021718441}
+ - component: {fileID: 2021718440}
+ m_Layer: 5
+ m_Name: Background
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &2021718439
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2021718438}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 2058276876}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0.25}
+ m_AnchorMax: {x: 1, y: 0.75}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &2021718440
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2021718438}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, 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_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0}
+ m_Type: 1
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!222 &2021718441
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2021718438}
+ m_CullTransparentMesh: 1
+--- !u!1 &2028091268
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 2028091272}
+ - component: {fileID: 2028091271}
+ - component: {fileID: 2028091270}
+ - component: {fileID: 2028091269}
+ m_Layer: 0
+ m_Name: Side
+ m_TagString: Boundary
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!65 &2028091269
+BoxCollider:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2028091268}
+ m_Material: {fileID: 0}
+ m_IsTrigger: 0
+ m_Enabled: 1
+ serializedVersion: 2
+ m_Size: {x: 1, y: 1, z: 1}
+ m_Center: {x: 0, y: 0, z: 0}
+--- !u!23 &2028091270
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2028091268}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_StaticShadowCaster: 0
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RayTracingMode: 2
+ m_RayTraceProcedural: 0
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: 2100000, guid: 00cf8ac777c8c42e8967157f70fbfcbf, type: 2}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_ReceiveGI: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+ m_AdditionalVertexStreams: {fileID: 0}
+--- !u!33 &2028091271
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2028091268}
+ m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!4 &2028091272
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2028091268}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0.49999994, z: 30.5}
+ m_LocalScale: {x: 60, y: 3, z: 1}
+ m_Children: []
+ m_Father: {fileID: 1332123092}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &2058276875
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 2058276876}
+ - component: {fileID: 2058276877}
+ m_Layer: 5
+ m_Name: BoxGeneratorSlider
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &2058276876
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2058276875}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 2021718439}
+ - {fileID: 1889006547}
+ - {fileID: 1387688805}
+ - {fileID: 562991979}
+ m_Father: {fileID: 290861172}
+ m_RootOrder: 4
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 1}
+ m_AnchorMax: {x: 0.5, y: 1}
+ m_AnchoredPosition: {x: 0.99993896, y: -63.99997}
+ m_SizeDelta: {x: 400, y: 20}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &2058276877
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2058276875}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 67db9e8f0e2ae9c40bc1e2b64352a6b4, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_WrapAround: 0
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_SelectedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_SelectedTrigger: Selected
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 1523424138}
+ m_FillRect: {fileID: 1549858059}
+ m_HandleRect: {fileID: 1523424137}
+ m_Direction: 0
+ m_MinValue: 0
+ m_MaxValue: 550
+ m_WholeNumbers: 1
+ m_Value: 2
+ m_OnValueChanged:
+ m_PersistentCalls:
+ m_Calls:
+ - m_Target: {fileID: 1113539279}
+ m_TargetAssemblyTypeName: ServerBoxGenerator, Core
+ m_MethodName: UpdateSpawnsPerSecond
+ m_Mode: 1
+ m_Arguments:
+ m_ObjectArgument: {fileID: 0}
+ m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
+ m_IntArgument: 0
+ m_FloatArgument: 0
+ m_StringArgument:
+ m_BoolArgument: 0
+ m_CallState: 2
+--- !u!1 &2107482020
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 2107482021}
+ - component: {fileID: 2107482022}
+ - component: {fileID: 2107482023}
+ m_Layer: 0
+ m_Name: Stats
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &2107482021
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2107482020}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 318.45444, y: 110.697815, z: 216.79077}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 6
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &2107482022
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2107482020}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: cb5f3e55f5dd247129d8a4979b80ebbb, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_ClientServerToggle: {fileID: 1588117327}
+ m_TrackSceneEvents: 1
+ m_LogSceneEventsToConsole: 1
+--- !u!114 &2107482023
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2107482020}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ GlobalObjectIdHash: 515328755
+ AlwaysReplicateAsRoot: 0
+ DontDestroyWithOwner: 0
+ AutoObjectParentSync: 1
+--- !u!1001 &2848221156282925290
+PrefabInstance:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_Modification:
+ m_TransformParent: {fileID: 290861172}
+ m_Modifications:
+ - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7,
+ type: 3}
+ propertyPath: m_Pivot.x
+ value: 0.5
+ objectReference: {fileID: 0}
+ - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7,
+ type: 3}
+ propertyPath: m_Pivot.y
+ value: 0.5
+ objectReference: {fileID: 0}
+ - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7,
+ type: 3}
+ propertyPath: m_RootOrder
+ value: 2
+ objectReference: {fileID: 0}
+ - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7,
+ type: 3}
+ propertyPath: m_AnchorMax.x
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7,
+ type: 3}
+ propertyPath: m_AnchorMax.y
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7,
+ type: 3}
+ propertyPath: m_AnchorMin.x
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7,
+ type: 3}
+ propertyPath: m_AnchorMin.y
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7,
+ type: 3}
+ propertyPath: m_SizeDelta.x
+ value: 20
+ objectReference: {fileID: 0}
+ - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7,
+ type: 3}
+ propertyPath: m_SizeDelta.y
+ value: 25
+ objectReference: {fileID: 0}
+ - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7,
+ type: 3}
+ propertyPath: m_LocalPosition.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7,
+ type: 3}
+ propertyPath: m_LocalPosition.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7,
+ type: 3}
+ propertyPath: m_LocalPosition.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7,
+ type: 3}
+ propertyPath: m_LocalRotation.w
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7,
+ type: 3}
+ propertyPath: m_LocalRotation.x
+ value: -0
+ objectReference: {fileID: 0}
+ - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7,
+ type: 3}
+ propertyPath: m_LocalRotation.y
+ value: -0
+ objectReference: {fileID: 0}
+ - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7,
+ type: 3}
+ propertyPath: m_LocalRotation.z
+ value: -0
+ objectReference: {fileID: 0}
+ - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7,
+ type: 3}
+ propertyPath: m_AnchoredPosition.x
+ value: -23.40039
+ objectReference: {fileID: 0}
+ - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7,
+ type: 3}
+ propertyPath: m_AnchoredPosition.y
+ value: -23.800293
+ objectReference: {fileID: 0}
+ - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7,
+ type: 3}
+ propertyPath: m_LocalEulerAnglesHint.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7,
+ type: 3}
+ propertyPath: m_LocalEulerAnglesHint.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7,
+ type: 3}
+ propertyPath: m_LocalEulerAnglesHint.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 2848221156307247795, guid: 3200770c16e3b2b4ebe7f604154faac7,
+ type: 3}
+ propertyPath: m_Name
+ value: ExitButton
+ objectReference: {fileID: 0}
+ - target: {fileID: 5266522511616468950, guid: 3200770c16e3b2b4ebe7f604154faac7,
+ type: 3}
+ propertyPath: m_SceneMenuToLoad
+ value:
+ objectReference: {fileID: 11400000, guid: c10d995498e0c514a853c3506031d3fb,
+ type: 2}
+ m_RemovedComponents: []
+ m_SourcePrefab: {fileID: 100100000, guid: 3200770c16e3b2b4ebe7f604154faac7, type: 3}
diff --git a/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/SceneTransitioningBase2.unity.meta b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/SceneTransitioningBase2.unity.meta
new file mode 100644
index 0000000000..bc0e9d74fa
--- /dev/null
+++ b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/SceneTransitioningBase2.unity.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 9e437cc704801bc47add735d743985f5
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/SceneTransitioningBaseSceneRegistration.asset b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/SceneTransitioningBaseSceneRegistration.asset
new file mode 100644
index 0000000000..3fad7d44e8
--- /dev/null
+++ b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/SceneTransitioningBaseSceneRegistration.asset
@@ -0,0 +1,23 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 0}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 39a16938ffb5cd846a9f6df7a686a9c4, type: 3}
+ m_Name: SceneTransitioningBaseSceneRegistration
+ m_EditorClassIdentifier:
+ SceneToReference: {fileID: 102900000, guid: 780f96a61e8ac8e41b638ae8ec3a3236, type: 3}
+ m_IncludedScenes:
+ - {fileID: 102900000, guid: 41a0239b0c49e2047b7063c822f0df8a, type: 3}
+ - {fileID: 102900000, guid: c6a3d883c8253ee43bca4f2b03797d7b, type: 3}
+ m_DisplayName: Additive Scene Loading
+ m_ReferencedScenes:
+ - SceneTransitioningBase
+ - SecondSceneAddtive
+ - ThirdSceneAdditive
diff --git a/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/SceneTransitioningBaseSceneRegistration.asset.meta b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/SceneTransitioningBaseSceneRegistration.asset.meta
new file mode 100644
index 0000000000..a112789c5a
--- /dev/null
+++ b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/SceneTransitioningBaseSceneRegistration.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 9a8d9296fb33f794f95514bf38de3cf9
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/SwitchSceneHandlerAdditive.cs b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/SwitchSceneHandlerAdditive.cs
new file mode 100644
index 0000000000..c83cadd4e6
--- /dev/null
+++ b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/SwitchSceneHandlerAdditive.cs
@@ -0,0 +1,133 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+#if UNITY_EDITOR
+using UnityEditor;
+#endif
+
+using Unity.Netcode;
+
+namespace TestProject.ManualTests
+{
+ public class SwitchSceneHandlerAdditive : NetworkBehaviour
+ {
+ public static bool ExitingNow { get; internal set; }
+
+ [SerializeField]
+ private GameObject m_SwitchSceneButtonObject;
+
+ [HideInInspector]
+ [SerializeField]
+ private List m_SceneToSwitchTo;
+
+#if UNITY_EDITOR
+ [SerializeField]
+ private List m_SceneAssets;
+ private void OnValidate()
+ {
+ m_SceneToSwitchTo = new List();
+ foreach (var sceneAsset in m_SceneAssets)
+ {
+ m_SceneToSwitchTo.Add(sceneAsset.name);
+ }
+ }
+#endif
+
+ private int m_CurrentSceneIndex;
+
+ private void Awake()
+ {
+ m_CurrentSceneIndex = 0;
+ ExitingNow = false;
+ }
+
+ private void Start()
+ {
+ m_SwitchSceneButtonObject.SetActive(false);
+ StartCoroutine(CheckForVisibility());
+ }
+
+ private bool m_ExitingScene;
+ private void OnDestroy()
+ {
+ m_ExitingScene = true;
+ StopAllCoroutines();
+ }
+
+ private IEnumerator CheckForVisibility()
+ {
+ while (!m_ExitingScene)
+ {
+ if (NetworkManager.Singleton && NetworkManager.Singleton.IsListening && NetworkManager.Singleton.IsServer)
+ {
+ if (m_SwitchSceneButtonObject)
+ {
+ m_SwitchSceneButtonObject.SetActive(true);
+ }
+ }
+ else
+ {
+ m_SwitchSceneButtonObject.SetActive(false);
+ }
+
+ yield return new WaitForSeconds(0.5f);
+ }
+
+ yield return null;
+ }
+
+ public override void OnNetworkSpawn()
+ {
+ if (NetworkManager.Singleton && NetworkManager.Singleton.IsListening && NetworkManager.Singleton.IsServer)
+ {
+ if (m_SwitchSceneButtonObject)
+ {
+ m_SwitchSceneButtonObject.SetActive(true);
+ }
+ }
+ else
+ {
+ m_SwitchSceneButtonObject.SetActive(false);
+ }
+ base.OnNetworkSpawn();
+ }
+
+ private bool m_IsReversing;
+
+ public void OnSwitchScene()
+ {
+ if (NetworkManager.Singleton && NetworkManager.Singleton.IsListening)
+ {
+ m_ExitingScene = true;
+ ExitingNow = true;
+
+ if (!m_IsReversing)
+ {
+ if (NetworkManager.Singleton.SceneManager.LoadScene(m_SceneToSwitchTo[m_CurrentSceneIndex], UnityEngine.SceneManagement.LoadSceneMode.Additive)
+ == SceneEventProgressStatus.Started)
+ {
+ m_CurrentSceneIndex++;
+
+ if (m_CurrentSceneIndex == m_SceneToSwitchTo.Count)
+ {
+ m_IsReversing = true;
+ m_CurrentSceneIndex--;
+ }
+ }
+ }
+ //else
+ //{
+ // if (NetworkManager.Singleton.SceneManager.UnloadScene(m_SceneToSwitchTo[m_CurrentSceneIndex]) == SceneEventProgressStatus.Started)
+ // {
+ // m_CurrentSceneIndex--;
+ // if (m_CurrentSceneIndex < 0)
+ // {
+ // m_IsReversing = false;
+ // m_CurrentSceneIndex = 0;
+ // }
+ // }
+ //}
+ }
+ }
+ }
+}
diff --git a/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/SwitchSceneHandlerAdditive.cs.meta b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/SwitchSceneHandlerAdditive.cs.meta
new file mode 100644
index 0000000000..54a2c9df0d
--- /dev/null
+++ b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/SwitchSceneHandlerAdditive.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: fd82b56fddb35f2418f27a65b6bb3b54
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/testproject/Assets/Tests/Manual/Scripts/GenericNetworkObjectBehaviour.cs b/testproject/Assets/Tests/Manual/Scripts/GenericNetworkObjectBehaviour.cs
index ba7f496c84..3c09afd0cd 100644
--- a/testproject/Assets/Tests/Manual/Scripts/GenericNetworkObjectBehaviour.cs
+++ b/testproject/Assets/Tests/Manual/Scripts/GenericNetworkObjectBehaviour.cs
@@ -67,6 +67,11 @@ public override void OnNetworkSpawn()
base.OnNetworkSpawn();
}
+ public void ShouldMoveRandomly(bool shouldMoveRandomly)
+ {
+ m_MoveRandomly = shouldMoveRandomly;
+ }
+
///
/// Sets the object's direction and velocity
///
@@ -104,28 +109,31 @@ private void FixedUpdate()
{
Debug.LogWarning($"{nameof(GenericNetworkObjectBehaviour)} id {NetworkObject.NetworkObjectId} is not active and enabled but game object is still active!");
}
-
- if (NetworkObject != null && !NetworkObject.IsSpawned)
- {
- Debug.LogWarning($"{nameof(GenericNetworkObjectBehaviour)} id {NetworkObject.NetworkObjectId} is not spawned but still active and enabled");
- gameObject.SetActive(false);
- }
}
}
}
+ ///
+ /// Tells us that we are registered with a NetworkPefab pool
+ /// This is primarily for late joining clients and object synchronization.
+ ///
+ public bool IsRegisteredPoolObject;
+
+ ///
+ /// This tells us that the NetworkObject has been removed from a pool
+ /// This is primarily to handle NetworkPrefab pool that was loaded in an additive scene and the
+ /// additive scene was unloaded but the NetworkObject persisted (i.e. was spawned in a different scene)
+ ///
+ public bool IsRemovedFromPool;
private void Update()
{
if (IsOwner && m_ShouldDespawn && NetworkObject != null)
{
m_ShouldDespawn = false;
-
- NetworkObject.Despawn(HasHandler);
- if (!HasHandler)
+ if (NetworkObject.NetworkManager != null)
{
- NetworkObject.gameObject.SetActive(false);
- NetworkObject.gameObject.transform.position = Vector3.zero;
+ NetworkObject.Despawn(true);
}
}
else if (!IsServer)
@@ -141,7 +149,6 @@ private void Update()
}
}
}
-
}
[HideInInspector]
@@ -151,7 +158,7 @@ private void Update()
private void OnTriggerEnter(Collider other)
{
- if (IsOwner && gameObject.activeInHierarchy)
+ if (IsOwner && !m_ShouldDespawn)
{
if (other.CompareTag("GenericObject") || other.CompareTag("Floor"))
{
diff --git a/testproject/Assets/Tests/Manual/Scripts/IndependentMover.cs b/testproject/Assets/Tests/Manual/Scripts/IndependentMover.cs
new file mode 100644
index 0000000000..15eebb6dc2
--- /dev/null
+++ b/testproject/Assets/Tests/Manual/Scripts/IndependentMover.cs
@@ -0,0 +1,72 @@
+using UnityEngine;
+using Unity.Netcode;
+
+namespace TestProject.ManualTests
+{
+ ///
+ /// Used with GenericObjects to randomly move them around
+ ///
+ public class IndependentMover : NetworkBehaviour
+ {
+ private Vector3 m_Direction;
+ private Rigidbody m_Rigidbody;
+
+
+ public override void OnNetworkSpawn()
+ {
+ Debug.Log($"{nameof(IndependentMover)} NID: {NetworkObjectId}");
+ m_Rigidbody = GetComponent();
+ if (NetworkObject != null && m_Rigidbody != null)
+ {
+ m_Rigidbody.isKinematic = !NetworkObject.IsOwner;
+ if (!m_Rigidbody.isKinematic)
+ {
+ ChangeDirection(true, true);
+ }
+ }
+ }
+
+ private void FixedUpdate()
+ {
+ if (IsServer && IsOwner)
+ {
+ Move(4);
+ }
+ }
+
+ public void Move(int speed)
+ {
+ if (m_Rigidbody == null)
+ {
+ m_Rigidbody = GetComponent();
+ }
+ if (m_Rigidbody != null)
+ {
+ m_Rigidbody.MovePosition(transform.position + m_Direction * (speed * Time.fixedDeltaTime));
+ }
+ }
+
+ private void OnCollisionStay(Collision collision)
+ {
+ if (collision.gameObject.CompareTag("Floor") || collision.gameObject.CompareTag("GenericObject"))
+ {
+ return;
+ }
+ Vector3 collisionPoint = collision.collider.ClosestPoint(transform.position);
+ bool moveRight = collisionPoint.x < transform.position.x;
+ bool moveDown = collisionPoint.z > transform.position.z;
+ ChangeDirection(moveRight, moveDown);
+ }
+
+ private void ChangeDirection(bool moveRight, bool moveDown)
+ {
+ float ang = Random.Range(0, 2 * Mathf.PI);
+
+ m_Direction.x = Mathf.Cos(ang);
+ m_Direction.y = 0.0f;
+ ang = Random.Range(0, 2 * Mathf.PI);
+ m_Direction.z = Mathf.Sin(ang);
+ m_Direction.Normalize();
+ }
+ }
+}
diff --git a/testproject/Assets/Tests/Manual/Scripts/IndependentMover.cs.meta b/testproject/Assets/Tests/Manual/Scripts/IndependentMover.cs.meta
new file mode 100644
index 0000000000..37294f1a0e
--- /dev/null
+++ b/testproject/Assets/Tests/Manual/Scripts/IndependentMover.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: c552ef0ccf6ff8148a9c9606e7d3fc15
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/testproject/Assets/Tests/Manual/Scripts/NetworkPrefabPool.cs b/testproject/Assets/Tests/Manual/Scripts/NetworkPrefabPool.cs
index ee81669ced..bd62dc4c9d 100644
--- a/testproject/Assets/Tests/Manual/Scripts/NetworkPrefabPool.cs
+++ b/testproject/Assets/Tests/Manual/Scripts/NetworkPrefabPool.cs
@@ -1,6 +1,7 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
+using UnityEngine.SceneManagement;
using UnityEngine.UI;
using Unity.Netcode;
@@ -81,9 +82,14 @@ private void RegisterCustomPrefabHandler()
}
}
+ private void OnDisable()
+ {
+ OnUnloadScene();
+ }
private void DeregisterCustomPrefabHandler()
{
+ // Register the custom spawn handler?
if (EnableHandler && NetworkManager && NetworkManager.PrefabHandler != null && m_MyCustomPrefabSpawnHandler != null)
{
NetworkManager.PrefabHandler.RemoveHandler(ServerObjectToPool);
@@ -94,74 +100,93 @@ private void DeregisterCustomPrefabHandler()
}
}
-
-
- ///
- /// When disabled, stop spawning objects
- ///
- private void OnDisable()
+ private void OnSceneEvent(SceneEvent sceneEvent)
{
- m_IsSpawningObjects = false;
- if (NetworkManager.Singleton && EnableHandler && m_MyCustomPrefabSpawnHandler != null)
+ switch (sceneEvent.SceneEventType)
{
- var no = ServerObjectToPool.GetComponent();
- NetworkManager.Singleton.PrefabHandler.RemoveHandler(no);
- m_MyCustomPrefabSpawnHandler = null;
+ case SceneEventData.SceneEventTypes.S2C_Unload:
+ {
+ if (sceneEvent.LoadSceneMode == LoadSceneMode.Single && (gameObject.scene.name == sceneEvent.SceneName))
+ {
+ OnUnloadScene();
+ }
+ break;
+ }
}
-
-
}
///
- /// General clean up
- /// The custom prefab handler is de-registered here
+ /// Detect when we are switching scenes in order
+ /// to assure we stop spawning objects
///
- private void OnDestroy()
+ private void OnUnloadScene()
{
- if (SwitchScene)
+ if (IsServer)
{
- SwitchScene.OnSceneSwitchBegin -= OnSceneSwitchBegin;
+ StopCoroutine(SpawnObjects());
}
+
+ // De-register the custom prefab handler
+ DeregisterCustomPrefabHandler();
+
+ CleanNetworkObjects();
}
- // Start is called before the first frame update
- private void Start()
- {
- if (SpawnSliderValueText != null)
- {
- SpawnSliderValueText.text = SpawnsPerSecond.ToString();
- }
- if (SwitchScene)
+ public override void OnNetworkDespawn()
+ {
+ if (NetworkManager != null)
{
- SwitchScene.OnSceneSwitchBegin += OnSceneSwitchBegin;
+ NetworkManager.SceneManager.OnSceneEvent -= OnSceneEvent;
}
}
- ///
- /// Detect when we are switching scenes in order
- /// to assure we stop spawning objects
- ///
- private void OnSceneSwitchBegin()
+ private void CleanNetworkObjects()
{
- DeregisterCustomPrefabHandler();
- if (IsServer)
+ if (m_ObjectPool != null)
{
- StopCoroutine(SpawnObjects());
-
- if (m_ObjectPool != null)
+ foreach (var obj in m_ObjectPool)
{
- foreach (var obj in m_ObjectPool)
+ if (obj != null)
{
var networkObject = obj.GetComponent();
- if (networkObject.IsSpawned)
+ var genericBehaviour = obj.GetComponent();
+ if (genericBehaviour != null)
{
- networkObject.Despawn(true);
+ genericBehaviour.IsRegisteredPoolObject = false;
+ genericBehaviour.IsRemovedFromPool = true;
+ if (IsServer)
+ {
+ if (networkObject.IsSpawned)
+ {
+ networkObject.Despawn(true);
+ }
+ else
+ {
+ DestroyImmediate(obj);
+ }
+ }
+ else //Client
+ {
+ if (!networkObject.IsSpawned)
+ {
+ DestroyImmediate(obj);
+ }
+ }
}
- Destroy(obj);
}
- m_ObjectPool.Clear();
}
+ m_ObjectPool.Clear();
+ }
+ }
+
+
+ // Start is called before the first frame update
+ private void Start()
+ {
+ if (SpawnSliderValueText != null)
+ {
+ SpawnSliderValueText.text = SpawnsPerSecond.ToString();
}
}
@@ -170,6 +195,7 @@ private void OnSceneSwitchBegin()
///
public override void OnNetworkSpawn()
{
+ NetworkManager.SceneManager.OnSceneEvent += OnSceneEvent;
InitializeObjectPool();
if (IsServer)
{
@@ -259,12 +285,13 @@ private GameObject AddNewInstance()
var obj = Instantiate(m_ObjectToSpawn);
var genericNetworkObjectBehaviour = obj.GetComponent();
genericNetworkObjectBehaviour.HasHandler = EnableHandler;
+ genericNetworkObjectBehaviour.IsRegisteredPoolObject = true;
m_ObjectPool.Add(obj);
return m_ObjectPool[m_ObjectPool.Count - 1];
}
///
- /// Starts the
+ /// Starts spawning
///
private void StartSpawningBoxes()
{
@@ -374,14 +401,25 @@ public class MyCustomPrefabSpawnHandler : INetworkPrefabInstanceHandler
public NetworkObject Instantiate(ulong ownerClientId, Vector3 position, Quaternion rotation)
{
var obj = m_PrefabPool.GetObject();
- obj.transform.position = position;
- obj.transform.rotation = rotation;
- return obj.GetComponent();
+ if (obj != null)
+ {
+ obj.transform.position = position;
+ obj.transform.rotation = rotation;
+ return obj.GetComponent();
+ }
+ return null;
}
public void Destroy(NetworkObject networkObject)
{
- networkObject.transform.position = new Vector3(0, 0, 0);
- networkObject.gameObject.SetActive(false);
+ var genericBehaviour = networkObject.gameObject.GetComponent();
+ if (genericBehaviour.IsRegisteredPoolObject)
+ {
+ networkObject.gameObject.SetActive(false);
+ }
+ else
+ {
+ Object.Destroy(networkObject.gameObject);
+ }
}
public MyCustomPrefabSpawnHandler(NetworkPrefabPool objectPool)
diff --git a/testproject/Assets/Tests/Manual/Scripts/NetworkPrefabPoolAdditive.cs b/testproject/Assets/Tests/Manual/Scripts/NetworkPrefabPoolAdditive.cs
new file mode 100644
index 0000000000..b4c0c2f515
--- /dev/null
+++ b/testproject/Assets/Tests/Manual/Scripts/NetworkPrefabPoolAdditive.cs
@@ -0,0 +1,467 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.SceneManagement;
+using Unity.Netcode;
+
+namespace TestProject.ManualTests
+{
+ public class NetworkPrefabPoolAdditive : NetworkBehaviour
+ {
+ [Header("General Settings")]
+ public bool RandomMovement = true;
+ public bool AutoSpawnEnable = true;
+ [Tooltip("When enabled, this will spawn the objects in the source spawn generator's scene")]
+ public bool SpawnInSourceScene = true;
+
+ [Tooltip("When enabled, this will despawn or destroy all associated network prefab instances when the additive scene is unloaded.")]
+ public bool DestroyOnUnload = false;
+
+ public float InitialSpawnDelay;
+ public int SpawnsPerSecond = 3;
+ public int PoolSize;
+ public float ObjectSpeed = 10.0f;
+
+
+ [Header("Prefab Instance Handling")]
+ [Tooltip("When enabled, this will utilize the NetworkPrefabHandler to register a custom INetworkPrefabInstanceHandler")]
+ public bool EnableHandler;
+
+ [Tooltip("When enabled, this will register a custom INetworkPrefabInstanceHandler using a NetworkObject reference")]
+ public bool RegisterUsingNetworkObject;
+
+ [Tooltip("What is going to be spawned on the server side from the pool.")]
+ public GameObject ServerObjectToPool;
+ [Tooltip("What is going to be spawned on the client side from the ")]
+ public GameObject ClientObjectToPool;
+
+ private bool m_IsSpawningObjects;
+
+ private float m_EntitiesPerFrame;
+ private float m_DelaySpawning;
+
+ private GameObject m_ObjectToSpawn;
+ private List m_ObjectPool;
+
+ private MyAdditiveCustomPrefabSpawnHandler m_AdditiveCustomPrefabSpawnHandler;
+
+ ///
+ /// Handles registering the custom prefab handler
+ ///
+ private void RegisterCustomPrefabHandler()
+ {
+ // Register the custom spawn handler?
+ if (m_AdditiveCustomPrefabSpawnHandler == null && EnableHandler)
+ {
+ if (NetworkManager && NetworkManager.PrefabHandler != null)
+ {
+ m_AdditiveCustomPrefabSpawnHandler = new MyAdditiveCustomPrefabSpawnHandler(this);
+ if (RegisterUsingNetworkObject)
+ {
+ NetworkManager.PrefabHandler.AddHandler(ServerObjectToPool.GetComponent(), m_AdditiveCustomPrefabSpawnHandler);
+ }
+ else
+ {
+ NetworkManager.PrefabHandler.AddHandler(ServerObjectToPool, m_AdditiveCustomPrefabSpawnHandler);
+ }
+ }
+ }
+ }
+
+ private void DeregisterCustomPrefabHandler()
+ {
+ // Register the custom spawn handler?
+ if (EnableHandler && NetworkManager && NetworkManager.PrefabHandler != null && m_AdditiveCustomPrefabSpawnHandler != null)
+ {
+ NetworkManager.PrefabHandler.RemoveHandler(ServerObjectToPool);
+ if (IsClient && m_ObjectToSpawn != null)
+ {
+ NetworkManager.PrefabHandler.RemoveHandler(m_ObjectToSpawn);
+ }
+ }
+ }
+
+ ///
+ /// General clean up
+ /// The custom prefab handler is unregistered here
+ ///
+ private void OnDestroy()
+ {
+ if (IsServer)
+ {
+ StopCoroutine(SpawnObjects());
+ }
+ DeregisterCustomPrefabHandler();
+
+
+
+ if (NetworkManager != null && NetworkManager.SceneManager != null)
+ {
+ NetworkManager.SceneManager.OnSceneEvent -= OnSceneEvent;
+ }
+ }
+
+ // Start is called before the first frame update
+ private void Start()
+ {
+ NetworkManager.SceneManager.OnSceneEvent += OnSceneEvent;
+ }
+
+
+
+ ///
+ /// For additive scenes, we only clear out our pooled NetworkObjects if we are migrating them from the ActiveScene
+ /// to the scene where this NetworkPrefabPoolAdditive component is instantiated.
+ ///
+ ///
+ ///
+ private void OnSceneEvent(SceneEvent sceneEvent)
+ {
+ switch (sceneEvent.SceneEventType)
+ {
+ case SceneEventData.SceneEventTypes.S2C_Unload:
+ {
+ if (sceneEvent.LoadSceneMode == LoadSceneMode.Additive && (gameObject.scene.name == sceneEvent.SceneName))
+ {
+ OnUnloadScene();
+ }
+ break;
+ }
+ case SceneEventData.SceneEventTypes.S2C_Load:
+ {
+ if (sceneEvent.LoadSceneMode == LoadSceneMode.Single && ((gameObject.scene.name == sceneEvent.SceneName) || !SpawnInSourceScene))
+ {
+ OnUnloadScene();
+ }
+ break;
+ }
+ }
+ }
+
+ private void CleanNetworkObjects()
+ {
+ if (m_ObjectPool != null)
+ {
+ foreach (var obj in m_ObjectPool)
+ {
+ if (obj == null)
+ {
+ continue;
+ }
+ var networkObject = obj.GetComponent();
+ var genericBehaviour = obj.GetComponent();
+ genericBehaviour.IsRegisteredPoolObject = false;
+ genericBehaviour.IsRemovedFromPool = true;
+ genericBehaviour.HasHandler = false;
+ if (IsServer)
+ {
+ if (networkObject.IsSpawned)
+ {
+ if (DestroyOnUnload)
+ {
+ networkObject.Despawn(true);
+ }
+ else if (SpawnInSourceScene)
+ {
+ // If we are spawning in the source scene and we are not supposed to destroy this object
+ // then move it to the currently active scene.
+ var activeScene = SceneManager.GetActiveScene();
+ if (gameObject.scene != SceneManager.GetActiveScene())
+ {
+ SceneManager.MoveGameObjectToScene(obj, activeScene);
+ }
+ }
+ }
+ else
+ {
+ DestroyImmediate(obj);
+ }
+ }
+ else //Client
+ {
+ if (!networkObject.IsSpawned)
+ {
+ DestroyImmediate(obj);
+ }
+ else if (SpawnInSourceScene)
+ {
+ // If we are spawning in the source scene and we are not supposed to destroy this object
+ // then move it to the currently active scene.
+ var activeScene = SceneManager.GetActiveScene();
+ if (gameObject.scene != SceneManager.GetActiveScene())
+ {
+ SceneManager.MoveGameObjectToScene(obj, activeScene);
+ }
+ }
+ }
+ }
+ m_ObjectPool.Clear();
+ }
+ }
+
+ ///
+ /// Detect when we are switching scenes in order
+ /// to assure we stop spawning objects
+ ///
+ private void OnUnloadScene()
+ {
+ if (IsServer)
+ {
+ StopCoroutine(SpawnObjects());
+ }
+
+ // De-register the custom prefab handler
+ DeregisterCustomPrefabHandler();
+
+ CleanNetworkObjects();
+
+ NetworkManager.SceneManager.OnSceneEvent -= OnSceneEvent;
+ }
+
+ ///
+ /// Override NetworkBehaviour.NetworkStart
+ ///
+ public override void OnNetworkSpawn()
+ {
+ InitializeObjectPool();
+ if (IsServer)
+ {
+ if (isActiveAndEnabled)
+ {
+ m_DelaySpawning = Time.realtimeSinceStartup + InitialSpawnDelay;
+ StartSpawningBoxes();
+
+ //Make sure our slider reflects the current spawn rate
+ UpdateSpawnsPerSecond();
+ }
+ }
+ }
+
+ ///
+ /// Determines which object is going to be spawned and then
+ /// initializes the object pool based on
+ ///
+ public void InitializeObjectPool()
+ {
+ // Base construction and registration of the custom prefab handler.
+ RegisterCustomPrefabHandler();
+
+ // Default to the server side object
+ m_ObjectToSpawn = ServerObjectToPool;
+
+ // Host and Client need to do an extra step
+ if (IsClient)
+ {
+ if (EnableHandler && ClientObjectToPool != null)
+ {
+ m_ObjectToSpawn = NetworkManager.GetNetworkPrefabOverride(ClientObjectToPool);
+ }
+ else
+ {
+ m_ObjectToSpawn = NetworkManager.GetNetworkPrefabOverride(m_ObjectToSpawn);
+ }
+
+ // Since the host should spawn the override, we need to register the host to link it to the originally registered ServerObjectToPool
+ if (IsHost && EnableHandler && ServerObjectToPool != m_ObjectToSpawn)
+ {
+ // While this seems redundant, we could theoretically have several objects that we could potentially be spawning
+ NetworkManager.PrefabHandler.RegisterHostGlobalObjectIdHashValues(ServerObjectToPool, new List() { m_ObjectToSpawn });
+ }
+ }
+
+ if (EnableHandler || IsServer)
+ {
+ m_ObjectPool = new List(PoolSize);
+
+ for (int i = 0; i < PoolSize; i++)
+ {
+ var gameObject = AddNewInstance();
+ gameObject.SetActive(false);
+ }
+ }
+ }
+
+ ///
+ /// Gets an object from the pool
+ ///
+ ///
+ public GameObject GetObject()
+ {
+ if (m_ObjectPool != null)
+ {
+ foreach (var obj in m_ObjectPool)
+ {
+ if (obj == null)
+ {
+ continue;
+ }
+
+ if (!obj.activeInHierarchy)
+ {
+ obj.SetActive(true);
+ return obj;
+ }
+ }
+ var newObj = AddNewInstance();
+ newObj.SetActive(true);
+ return newObj;
+ }
+ return null;
+ }
+
+ ///
+ /// Add a new instance to the object pool
+ ///
+ /// new instance of the m_ObjectToSpawn prefab
+ private GameObject AddNewInstance()
+ {
+ var obj = Instantiate(m_ObjectToSpawn);
+ var genericNetworkObjectBehaviour = obj.GetComponent();
+ if (genericNetworkObjectBehaviour)
+ {
+ genericNetworkObjectBehaviour.ShouldMoveRandomly(RandomMovement);
+ genericNetworkObjectBehaviour.IsRegisteredPoolObject = true;
+ }
+
+ // Example of how to keep your pooled NetworkObjects in the same scene as your spawn generator (additive scenes only)
+ if (SpawnInSourceScene && gameObject.scene != null)
+ {
+ // If you move your NetworkObject into the same scene as the spawn generator, then you do not need to worry
+ // about setting the NetworkObject's scene dependency.
+ SceneManager.MoveGameObjectToScene(obj, gameObject.scene);
+ }
+
+ obj.SetActive(false);
+
+
+ m_ObjectPool.Add(obj);
+ return obj;
+ }
+
+ ///
+ /// Starts spawning
+ ///
+ private void StartSpawningBoxes()
+ {
+ if (SpawnsPerSecond > 0)
+ {
+ StartCoroutine(SpawnObjects());
+ }
+ }
+
+ ///
+ /// Checks to determine if we need to update our spawns per second calculations
+ ///
+ public void UpdateSpawnsPerSecond()
+ {
+ // Handle case where the initial value is set to zero and so coroutine needs to be started
+ if (SpawnsPerSecond > 0 && !m_IsSpawningObjects)
+ {
+ StartSpawningBoxes();
+ }
+ else //Handle case where spawning coroutine is running but we set our spawn rate to zero
+ if (SpawnsPerSecond == 0 && m_IsSpawningObjects)
+ {
+ m_IsSpawningObjects = false;
+ StopCoroutine(SpawnObjects());
+ }
+
+ }
+
+ ///
+ /// Coroutine to spawn boxes
+ ///
+ ///
+ private IEnumerator SpawnObjects()
+ {
+ //Exit if we are a client or we happen to not have a NetworkManager
+ if (NetworkManager == null || (NetworkManager.IsClient && !NetworkManager.IsHost && !NetworkManager.IsServer))
+ {
+ yield return null;
+ }
+
+ if (m_DelaySpawning > Time.realtimeSinceStartup)
+ {
+ yield return new WaitForSeconds(m_DelaySpawning - Time.realtimeSinceStartup);
+ }
+
+ m_IsSpawningObjects = true;
+ while (m_IsSpawningObjects)
+ {
+ //Start spawning if auto spawn is enabled
+ if (AutoSpawnEnable)
+ {
+ float entitySpawnUpdateRate = 1.0f;
+ if (SpawnsPerSecond > 0)
+ {
+ entitySpawnUpdateRate = 1.0f / Mathf.Min(SpawnsPerSecond, 60.0f);
+ //While not 100% accurate, this basically allows for higher entities per second generation
+ m_EntitiesPerFrame = (float)SpawnsPerSecond * entitySpawnUpdateRate;
+ int entitityCountPerFrame = Mathf.RoundToInt(m_EntitiesPerFrame);
+ //Spawn (n) entities then wait for 1/60th of a second and repeat
+ for (int i = 0; i < entitityCountPerFrame; i++)
+ {
+ GameObject go = GetObject();
+ if (go != null)
+ {
+ go.transform.position = transform.position;
+
+ float ang = Random.Range(0.0f, 2 * Mathf.PI);
+ go.GetComponent().SetDirectionAndVelocity(new Vector3(Mathf.Cos(ang), 0, Mathf.Sin(ang)), ObjectSpeed);
+
+ var no = go.GetComponent();
+ if (!no.IsSpawned)
+ {
+ no.Spawn(true);
+ }
+ }
+ }
+ }
+ yield return new WaitForSeconds(entitySpawnUpdateRate);
+ }
+ else //Just hang out until it is enabled
+ {
+ yield return new WaitForSeconds(1.0f);
+ }
+ }
+ }
+ }
+
+
+ ///
+ /// The custom prefab handler that returns an object from the prefab pool
+ ///
+ public class MyAdditiveCustomPrefabSpawnHandler : INetworkPrefabInstanceHandler
+ {
+ private NetworkPrefabPoolAdditive m_PrefabPool;
+ public NetworkObject Instantiate(ulong ownerClientId, Vector3 position, Quaternion rotation)
+ {
+ var obj = m_PrefabPool.GetObject();
+ if (obj != null)
+ {
+ obj.transform.position = position;
+ obj.transform.rotation = rotation;
+ return obj.GetComponent();
+ }
+ return null;
+ }
+ public void Destroy(NetworkObject networkObject)
+ {
+ var genericBehaviour = networkObject.gameObject.GetComponent();
+ if (genericBehaviour.IsRegisteredPoolObject)
+ {
+ networkObject.transform.position = Vector3.zero;
+ networkObject.gameObject.SetActive(false);
+ }
+ else
+ {
+ Object.Destroy(networkObject.gameObject);
+ }
+ }
+
+ public MyAdditiveCustomPrefabSpawnHandler(NetworkPrefabPoolAdditive objectPool)
+ {
+ m_PrefabPool = objectPool;
+ }
+ }
+}
diff --git a/testproject/Assets/Tests/Manual/Scripts/NetworkPrefabPoolAdditive.cs.meta b/testproject/Assets/Tests/Manual/Scripts/NetworkPrefabPoolAdditive.cs.meta
new file mode 100644
index 0000000000..45f6535d2a
--- /dev/null
+++ b/testproject/Assets/Tests/Manual/Scripts/NetworkPrefabPoolAdditive.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 398d7c0793567354082687193357a99f
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/testproject/Assets/Tests/Manual/Scripts/NetworkSceneManagerCallbackTests.cs b/testproject/Assets/Tests/Manual/Scripts/NetworkSceneManagerCallbackTests.cs
deleted file mode 100644
index 619d8d804f..0000000000
--- a/testproject/Assets/Tests/Manual/Scripts/NetworkSceneManagerCallbackTests.cs
+++ /dev/null
@@ -1,32 +0,0 @@
-using UnityEngine;
-using Unity.Netcode;
-
-namespace TestProject.ManualTests
-{
- [AddComponentMenu("Netcode/" + nameof(NetworkSceneManagerCallbackTests))]
- public class NetworkSceneManagerCallbackTests : NetworkBehaviour
- {
- public void StartHost()
- {
- NetworkManager.StartHost();
- }
-
- public override void OnNetworkSpawn()
- {
- if (IsServer)
- {
- NetworkManager.SceneManager.OnNotifyServerClientLoadedScene += (progress, clientId) =>
- {
- Debug.Log("OnNotifyServerClientLoadedScene invoked on the host - Passed");
- };
-
- NetworkManager.SceneManager.OnNotifyServerAllClientsLoadedScene += (progress, timedOut) =>
- {
- Debug.Log("OnNotifyServerAllClientsLoadedScene invoked on the host - Passed");
- };
-
- NetworkManager.SceneManager.SwitchScene("SceneWeAreSwitchingTo");
- }
- }
- }
-}
diff --git a/testproject/Assets/Tests/Manual/Scripts/StatsDisplay.cs b/testproject/Assets/Tests/Manual/Scripts/StatsDisplay.cs
index 100c370961..64a31001b5 100644
--- a/testproject/Assets/Tests/Manual/Scripts/StatsDisplay.cs
+++ b/testproject/Assets/Tests/Manual/Scripts/StatsDisplay.cs
@@ -1,15 +1,26 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
+using UnityEngine.SceneManagement;
using UnityEngine.UI;
using Unity.Netcode;
+
namespace TestProject.ManualTests
{
public class StatsDisplay : NetworkBehaviour
{
[SerializeField]
private GameObject m_ClientServerToggle;
+
+ [Tooltip("When enabled, this will display all scene events in the display window.")]
+ [SerializeField]
+ private bool m_TrackSceneEvents;
+
+ [Tooltip("When enabled, this will log all messages to the console.")]
+ [SerializeField]
+ private bool m_LogSceneEventsToConsole;
+
private bool m_ClientMode = true;
private Rect m_Stats;
private string m_LastStatsDump;
@@ -18,9 +29,10 @@ public class StatsDisplay : NetworkBehaviour
private bool m_IsServer;
+ private SceneEventNotificationQueue m_SceneEventNotificationQueue;
+
private void Start()
{
- m_Stats = new Rect(5, 10, 175, 300);
GUI.contentColor = new Color(196, 196, 196, 196);
GUI.backgroundColor = new Color(96, 96, 96, 96);
if (m_ClientServerToggle != null)
@@ -50,6 +62,12 @@ public override void OnNetworkSpawn()
m_ClientServerToggle.SetActive(true);
UpdateButton();
}
+
+ if (m_TrackSceneEvents)
+ {
+ m_SceneEventNotificationQueue = NetworkManager.gameObject.GetComponent();
+ }
+
StartCoroutine("UpdateTextStatus");
}
@@ -69,6 +87,17 @@ private void OnClientConnectedCallback(ulong clientId)
}
}
+ ///
+ /// Remove our OnClientConnectedCallback registration when we are destroyed
+ ///
+ private void OnDestroy()
+ {
+ if (NetworkManager != null)
+ {
+ NetworkManager.OnClientConnectedCallback -= OnClientConnectedCallback;
+ }
+ }
+
///
/// Used by UI Button click event
///
@@ -89,11 +118,13 @@ private void OnGUI()
{
if (NetworkManager && NetworkManager.IsListening)
{
+ var width = 0.25f * Screen.width;
+ var height = 0.50f * Screen.height;
+ m_Stats = new Rect(5, 10, width, height);
GUI.TextArea(m_Stats, m_LastStatsDump);
}
}
-
///
/// Updates the text of the button for switching between server and client stats
///
@@ -113,24 +144,8 @@ private void UpdateButton()
private void ReceiveStatsClientRpc(StatsInfoContainer statsinfo)
{
m_LastStatsDump = "Server Stats";
- m_LastStatsDump += "\ndeltaTime: [" + Time.deltaTime.ToString() + "]";
- /* if (ProfilerStatManager.AllStats.Count != statsinfo.StatValues.Count)
- {
- Debug.LogError("[StatsDisplay-Error][Mismatch] Recieved " + statsinfo.StatValues.Count.ToString() + " values and have " + ProfilerStatManager.AllStats.Count.ToString() + " profiler stats entries!");
- }
- else
- {
- var statsCounter = 0;
- foreach (ProfilerStat p in ProfilerStatManager.AllStats)
- {
- if (m_LastStatsDump != string.Empty)
- {
- m_LastStatsDump += "\n";
- }
- m_LastStatsDump += p.PrettyPrintName + ": " + statsinfo.StatValues[statsCounter].ToString(("0.0"));
- statsCounter++;
- }
- } */
+ m_LastStatsDump += "\ndeltaTime: [" + statsinfo.StatValues[0] + "]";
+ m_LastStatsDump += $"\nActive Scene: {SceneManager.GetActiveScene().name}";
}
///
@@ -164,23 +179,23 @@ private IEnumerator UpdateTextStatus()
{
m_LastStatsDump = m_IsServer ? "Server Stats" : "Client Stats";
m_LastStatsDump += "\ndeltaTime: [" + Time.deltaTime.ToString() + "]";
- /* foreach (ProfilerStat p in ProfilerStatManager.AllStats)
+ m_LastStatsDump += "\n";
+ m_LastStatsDump += $"Active Scene: {SceneManager.GetActiveScene().name}\n";
+ if (m_SceneEventNotificationQueue != null)
{
- if (m_LastStatsDump != string.Empty)
+ var sceneEvents = m_SceneEventNotificationQueue.GetCurrentNotifications();
+ m_LastStatsDump += $"Scene Events {sceneEvents.Count}:\n";
+ foreach (var sceneEventEntry in sceneEvents)
{
- m_LastStatsDump += "\n";
+ m_LastStatsDump += sceneEventEntry + "\n";
}
- m_LastStatsDump += p.PrettyPrintName + ": " + p.SampleRate().ToString("0.0");
- } */
+ }
}
if (NetworkManager.Singleton.IsServer && m_ClientsToUpdate.Count > 0)
{
var statsInfoContainer = new StatsInfoContainer();
statsInfoContainer.StatValues = new List();
- /* foreach (ProfilerStat p in ProfilerStatManager.AllStats)
- {
- statsInfoContainer.StatValues.Add(p.SampleRate());
- } */
+ statsInfoContainer.StatValues.Add(Time.deltaTime);
ReceiveStatsClientRpc(statsInfoContainer);
}
}
diff --git a/testproject/Assets/Tests/Manual/Scripts/SwitchSceneHandler.cs b/testproject/Assets/Tests/Manual/Scripts/SwitchSceneHandler.cs
index e4d56c4ee6..841feabb3d 100644
--- a/testproject/Assets/Tests/Manual/Scripts/SwitchSceneHandler.cs
+++ b/testproject/Assets/Tests/Manual/Scripts/SwitchSceneHandler.cs
@@ -88,32 +88,18 @@ private IEnumerator AutoSwitch()
}
- private SceneSwitchProgress m_CurrentSceneSwitchProgress;
-
- public delegate void OnSceneSwitchBeginDelegateHandler();
-
- public event OnSceneSwitchBeginDelegateHandler OnSceneSwitchBegin;
-
public void OnSwitchScene()
{
if (NetworkManager.Singleton && NetworkManager.Singleton.IsListening)
{
- OnSceneSwitchBegin?.Invoke();
m_ExitingScene = true;
ExitingNow = true;
- m_CurrentSceneSwitchProgress = NetworkManager.Singleton.SceneManager.SwitchScene(m_SceneToSwitchTo);
-
- m_CurrentSceneSwitchProgress.OnComplete += CurrentSceneSwitchProgress_OnComplete;
+ var sceneEventProgressStatus = NetworkManager.Singleton.SceneManager.LoadScene(m_SceneToSwitchTo, UnityEngine.SceneManagement.LoadSceneMode.Single);
+ if (sceneEventProgressStatus != SceneEventProgressStatus.Started)
+ {
+ Debug.LogError($"{nameof(NetworkSceneManager.LoadScene)} returned a {nameof(SceneEventProgressStatus)} value of {sceneEventProgressStatus}");
+ }
}
}
-
- public delegate void OnSceneSwitchCompletedDelegateHandler();
-
- public event OnSceneSwitchCompletedDelegateHandler OnSceneSwitchCompleted;
-
- private void CurrentSceneSwitchProgress_OnComplete(bool timedOut)
- {
- OnSceneSwitchCompleted?.Invoke();
- }
}
}
diff --git a/testproject/Assets/Tests/Runtime/MessageOrdering.cs b/testproject/Assets/Tests/Runtime/MessageOrdering.cs
index 4b395434ba..70506cdd08 100644
--- a/testproject/Assets/Tests/Runtime/MessageOrdering.cs
+++ b/testproject/Assets/Tests/Runtime/MessageOrdering.cs
@@ -12,6 +12,14 @@ public class MessageOrderingTests
{
private GameObject m_Prefab;
+ [UnitySetUp]
+ public IEnumerator SetUp()
+ {
+ // Make sure these static values are reset
+ Support.SpawnRpcDespawn.ClientUpdateCount = 0;
+ Support.SpawnRpcDespawn.ServerUpdateCount = 0;
+ yield break;
+ }
[UnityTearDown]
public IEnumerator Teardown()
@@ -70,7 +78,7 @@ public IEnumerator SpawnChangeOwnership()
// Wait until all objects have spawned.
const int expectedNetworkObjects = numClients + 2; // +2 = one for prefab, one for server.
const int maxFrames = 240;
- var doubleCheckTime = Time.realtimeSinceStartup + 10.0f;
+ var doubleCheckTime = Time.realtimeSinceStartup + 5.0f;
while (Object.FindObjectsOfType().Length != expectedNetworkObjects)
{
if (Time.frameCount > maxFrames)
@@ -143,7 +151,7 @@ public IEnumerator SpawnRpcDespawn([Values] NetworkUpdateStage testStage)
// Wait until all objects have spawned.
int expectedCount = Support.SpawnRpcDespawn.ClientUpdateCount + 1;
const int maxFrames = 240;
- var doubleCheckTime = Time.realtimeSinceStartup + 1.0f;
+ var doubleCheckTime = Time.realtimeSinceStartup + 5.0f;
while (Support.SpawnRpcDespawn.ClientUpdateCount < expectedCount)
{
if (Time.frameCount > maxFrames)
diff --git a/testproject/Assets/Tests/Runtime/SceneLoadingTest.cs b/testproject/Assets/Tests/Runtime/SceneLoadingTest.cs
index a43bdd3a55..6640ecb89c 100644
--- a/testproject/Assets/Tests/Runtime/SceneLoadingTest.cs
+++ b/testproject/Assets/Tests/Runtime/SceneLoadingTest.cs
@@ -1,3 +1,4 @@
+#if IGNORETHISTEST
using System.Collections;
using UnityEngine;
using NUnit.Framework;
@@ -7,6 +8,7 @@
namespace TestProject.RuntimeTests
{
+
///
/// This is nothing more than a template to follow in order to
/// use a scene to configure your NetworkManager as well as how
@@ -16,6 +18,7 @@ namespace TestProject.RuntimeTests
///
public class SceneLoadingTest
{
+
private NetworkManager m_NetworkManager;
private bool m_SceneLoaded;
@@ -26,11 +29,15 @@ public class SceneLoadingTest
[UnityTest]
public IEnumerator SceneLoading()
{
+
+
+
// Keep track of the original test scene
Scene originalScene = SceneManager.GetActiveScene();
// Load the first scene with the predefined NetworkManager
m_TargetSceneNameToLoad = "SceneTransitioningTest";
+
SceneManager.sceneLoaded += SceneManager_sceneLoaded;
SceneManager.LoadScene(m_TargetSceneNameToLoad, LoadSceneMode.Additive);
@@ -74,6 +81,8 @@ public IEnumerator SceneLoading()
m_NetworkManager = gameObject.GetComponent();
+
+
Assert.IsNotNull(m_NetworkManager);
// Start in host mode
@@ -82,6 +91,7 @@ public IEnumerator SceneLoading()
m_NetworkManager.StartHost();
}
+
// Next, we want to do a scene transition using NetworkSceneManager
m_TargetSceneNameToLoad = "SecondSceneToLoad";
@@ -90,9 +100,6 @@ public IEnumerator SceneLoading()
// m_NetworkManager.NetworkConfig.AllowRuntimeSceneChanges = true;
// m_NetworkManager.SceneManager.AddRuntimeSceneName(m_TargetSceneNameToLoad, (uint)m_NetworkManager.SceneManager.RegisteredSceneNames.Count);
- // Store off the currently active scene so we can unload it
- primaryScene = SceneManager.GetActiveScene();
-
// Switch the scene using NetworkSceneManager
var sceneSwitchProgress = m_NetworkManager.SceneManager.SwitchScene(m_TargetSceneNameToLoad, LoadSceneMode.Additive);
@@ -100,7 +107,7 @@ public IEnumerator SceneLoading()
m_SceneLoaded = false;
// Wait for the scene to load
- timeOut = Time.realtimeSinceStartup + 5;
+ timeOut = Time.realtimeSinceStartup + 30;
m_TimedOut = false;
while (!m_SceneLoaded)
{
@@ -123,13 +130,19 @@ public IEnumerator SceneLoading()
// (This is to assure spawned objects instantiate in the newly loaded scene)
if (!SceneManager.GetActiveScene().name.Contains(m_LoadedScene.name))
{
+
Debug.Log($"Loaded scene not active, activating scene {m_TargetSceneNameToLoad}");
SceneManager.SetActiveScene(m_LoadedScene);
Assert.IsTrue(SceneManager.GetActiveScene().name == m_LoadedScene.name);
}
- // Now unload the previous scene
- SceneManager.UnloadSceneAsync(primaryScene).completed += UnloadAsync_completed;
+ m_SceneLoaded = false;
+ primaryScene = m_LoadedScene;
+ m_NetworkManager.SceneManager.OnAdditiveSceneEvent += SceneManager_OnAdditiveSceneEvent;
+ m_NetworkManager.SceneManager.UnloadScene(primaryScene.name);
+
+ //// Now unload the previous scene
+ //SceneManager.UnloadSceneAsync(primaryScene).completed += UnloadAsync_completed;
// Now track the newly loaded and currently active scene
primaryScene = SceneManager.GetActiveScene();
@@ -145,13 +158,12 @@ public IEnumerator SceneLoading()
break;
}
}
+ Assert.IsFalse(m_TimedOut);
- // We are now done with the NetworkSceneManager switch scene test so stop the host
- m_NetworkManager.StopHost();
+ m_NetworkManager.SceneManager.OnAdditiveSceneEvent -= SceneManager_OnAdditiveSceneEvent;
// Set the original Test Runner Scene to be the active scene
SceneManager.SetActiveScene(originalScene);
-
// Unload the previously active scene
SceneManager.UnloadSceneAsync(primaryScene).completed += UnloadAsync_completed;
@@ -166,14 +178,27 @@ public IEnumerator SceneLoading()
break;
}
}
- // Done!
+ Assert.IsFalse(m_TimedOut);
+
+ m_NetworkManager.DontDestroy = false;
+ SceneManager.MoveGameObjectToScene(m_NetworkManager.gameObject, originalScene);
+ // We are now done with the NetworkSceneManager switch scene test so stop the host
+ m_NetworkManager.StopHost();
+
+ Object.DestroyImmediate(m_NetworkManager.gameObject);
}
- [UnityTearDown]
- public IEnumerator Teardown()
+ private void SceneManager_OnAdditiveSceneEvent(AsyncOperation operation, string sceneName, bool isLoading)
{
- Object.Destroy(m_NetworkManager);
- yield return null;
+ if(!isLoading)
+ {
+ m_SceneLoaded = true;
+ }
+ }
+
+ private void SceneManager_sceneUnloaded(Scene arg0)
+ {
+ m_SceneLoaded = true;
}
///
@@ -216,5 +241,22 @@ private void SceneManager_sceneLoaded(Scene scene, LoadSceneMode sceneMode)
m_LoadedScene = scene;
}
}
+
+ [UnitySetUp]
+ private IEnumerator SetUp()
+ {
+
+ yield return null;
+ }
+
+ [UnityTearDown]
+ private IEnumerator TearDown()
+ {
+
+
+ yield return null;
+ }
}
+
}
+#endif
diff --git a/testproject/ProjectSettings/EditorBuildSettings.asset b/testproject/ProjectSettings/EditorBuildSettings.asset
index 019bfe7fbe..cd3a7b3f89 100644
--- a/testproject/ProjectSettings/EditorBuildSettings.asset
+++ b/testproject/ProjectSettings/EditorBuildSettings.asset
@@ -41,19 +41,37 @@ EditorBuildSettings:
- enabled: 1
path: Assets/Tests/Manual/NetworkSceneManagerCallbacks/SceneWeAreSwitchingFrom.unity
guid: 073bd2111475c0643be45b7abe6a97ad
- - enabled: 1
- path: Assets/Tests/Manual/NetworkAnimatorTests/NetworkAnimatorEnhancement.unity
- guid: f88da8bb8d07e11418eaad6524d5cc12
- enabled: 1
path: Assets/Scenes/MultiprocessTestScene.unity
guid: 76743cb7b342c49279327834918a9c6e
- enabled: 1
path: Assets/Scenes/EmptyScene.unity
guid: a2545a872c007404fbb6b0393ab74974
+ - enabled: 1
+ path: Assets/Tests/Manual/SceneTransitioningAdditive/SceneTransitioningBase1.unity
+ guid: 780f96a61e8ac8e41b638ae8ec3a3236
+ - enabled: 1
+ path: Assets/Tests/Manual/SceneTransitioningAdditive/SceneTransitioningBase2.unity
+ guid: 9e437cc704801bc47add735d743985f5
+ - enabled: 1
+ path: Assets/Tests/Manual/SceneTransitioningAdditive/AdditiveScene1.unity
+ guid: 41a0239b0c49e2047b7063c822f0df8a
+ - enabled: 1
+ path: Assets/Tests/Manual/SceneTransitioningAdditive/AdditiveScene2.unity
+ guid: c6a3d883c8253ee43bca4f2b03797d7b
+ - enabled: 1
+ path: Assets/Tests/Manual/SceneTransitioningAdditive/AdditiveScene3.unity
+ guid: 7da3dd618f5b5a34db1f6d3c9511e221
+ - enabled: 1
+ path: Assets/Tests/Manual/SceneTransitioningAdditive/AdditiveScene4.unity
+ guid: dc7e17c86f5ca81478043be306027c13
- enabled: 1
path: Assets/Samples/PrefabPool/PrefabPoolExample.unity
guid: e4732b28c18f52c4dbe06c8a37f7997f
- enabled: 1
path: Assets/Samples/PrefabPool/PrefabPoolOverrideExample.unity
guid: 8c9bee1332e0526429d8a2c929945d60
+ - enabled: 1
+ path: Assets/Tests/Manual/SceneTransitioningAdditive/AdditiveSceneMultiInstance.unity
+ guid: 0ae94f636016d3b40bfbecad57d99553
m_configObjects: {}