From e73a72084e9cb58d959032a4eb7cc4bb5a5af50c Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Sun, 23 May 2021 17:30:45 +0100 Subject: [PATCH 01/44] networkobject parent tracking --- .../Runtime/Core/NetworkObject.cs | 62 ++++++++++++++++++- .../Runtime/Spawning/NetworkSpawnManager.cs | 2 + 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs index d1e62c92f0..6bd9b74969 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs @@ -504,6 +504,66 @@ internal void InvokeBehaviourOnGainedOwnership() } } + private bool m_IsReparented; + private ulong? m_LatestParent; + private Transform m_CachedParent; + + private void OnTransformParentChanged() + { + if (!IsSpawned) + { + print("is not spawned"); + return; + } + + var newParent = transform.parent; + + if (newParent == m_CachedParent) + { + print("new parent == cached parent"); + return; + } + + m_CachedParent = newParent; + + if (newParent == null) + { + m_IsReparented = true; + m_LatestParent = null; + + print("moved to the root"); + return; + } + + var parentObject = newParent.GetComponent(); + if (parentObject != null && parentObject.IsSpawned) + { + m_IsReparented = true; + m_LatestParent = parentObject.NetworkObjectId; + + print($"moved under {newParent.name}:{m_LatestParent}"); + return; + } + + print("moved under a non-root, non-networkobject parent, moving to the root"); + + m_IsReparented = true; + m_LatestParent = null; + m_CachedParent = null; + + // move to the root + transform.parent = null; + } + + internal void ResetNetworkParenting() + { + m_IsReparented = false; + m_LatestParent = null; + m_CachedParent = null; + + print($"{nameof(ResetNetworkParenting)} ({name})"); + } + internal void ResetNetworkStartInvoked() { if (ChildNetworkBehaviours != null) @@ -698,7 +758,7 @@ internal void SerializeSceneObject(NetworkWriter writer, ulong targetClientId) // If our current buffer position is greater than our positionBeforeNetworkVariableData then we wrote NetworkVariable data // Part 1: This will include the total NetworkVariable data size, if there was NetworkVariable data written, to the stream // in order to be able to skip past this entry on the deserialization side in the event this NetworkObject fails to be - // constructed (See Part 2 below in the DeserializeSceneObject method) + // constructed (See Part 2 below in the DeserializeSceneObject method) if (buffer.Position > positionBeforeNetworkVariableData) { // Store our current stream buffer position diff --git a/com.unity.multiplayer.mlapi/Runtime/Spawning/NetworkSpawnManager.cs b/com.unity.multiplayer.mlapi/Runtime/Spawning/NetworkSpawnManager.cs index 8a19ba9e1f..37d8ceebbc 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Spawning/NetworkSpawnManager.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Spawning/NetworkSpawnManager.cs @@ -332,6 +332,8 @@ internal void SpawnNetworkObjectLocally(NetworkObject networkObject, ulong netwo } } + networkObject.ResetNetworkParenting(); + networkObject.ResetNetworkStartInvoked(); if (readPayload) From ea6b6e7afc9bf7b0a918b63845b42da843adc4ff Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Sun, 23 May 2021 17:33:24 +0100 Subject: [PATCH 02/44] NetworkConstants.PARENT_SYNC = 16 --- .../Runtime/Configuration/NetworkConstants.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/com.unity.multiplayer.mlapi/Runtime/Configuration/NetworkConstants.cs b/com.unity.multiplayer.mlapi/Runtime/Configuration/NetworkConstants.cs index 6afbf53b41..81e148f23f 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Configuration/NetworkConstants.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Configuration/NetworkConstants.cs @@ -19,6 +19,7 @@ internal static class NetworkConstants internal const byte NETWORK_VARIABLE_DELTA = 12; internal const byte NETWORK_VARIABLE_UPDATE = 13; internal const byte ALL_CLIENTS_LOADED_SCENE = 14; + internal const byte PARENT_SYNC = 16; internal const byte UNNAMED_MESSAGE = 20; internal const byte DESTROY_OBJECTS = 21; internal const byte NAMED_MESSAGE = 22; @@ -46,7 +47,7 @@ internal static class NetworkConstants "NETWORK_VARIABLE_UPDATE", "ALL_CLIENTS_SWITCH_SCENE_COMPLETED", "", - "", // 16 + "PARENT_SYNC", // 16 "", "", "", From 68c18121892914072c7f52e71f72e2e9cf843f4e Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Sun, 23 May 2021 18:48:50 +0100 Subject: [PATCH 03/44] minor nullptr fix --- testproject/Assets/Scripts/ScalingCube.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/testproject/Assets/Scripts/ScalingCube.cs b/testproject/Assets/Scripts/ScalingCube.cs index 637db73bb5..4ec6249915 100644 --- a/testproject/Assets/Scripts/ScalingCube.cs +++ b/testproject/Assets/Scripts/ScalingCube.cs @@ -1,5 +1,3 @@ -using System.Collections; -using System.Collections.Generic; using MLAPI; using UnityEngine; @@ -7,10 +5,11 @@ public class ScalingCube : MonoBehaviour { private void Update() { - if (!NetworkManager.Singleton.IsServer) + if (NetworkManager.Singleton == null || !NetworkManager.Singleton.IsServer) { return; } + transform.localScale = new Vector3(Mathf.Repeat(Time.time * 2, 3f), transform.localScale.y, transform.localScale.z); } } From 2df134da8889e45e24019b24e10ba5f4bd65fdb8 Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Sun, 23 May 2021 18:49:43 +0100 Subject: [PATCH 04/44] minor cleanup --- .../Prototyping/NetworkTransform.cs | 8 -------- .../Runtime/Core/NetworkBehaviour.cs | 1 - 2 files changed, 9 deletions(-) diff --git a/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs b/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs index 2e7ab08182..bf5b9726d4 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs @@ -2,7 +2,6 @@ using MLAPI.NetworkVariable; using MLAPI.Transports; using UnityEngine; -using UnityEngine.Serialization; namespace MLAPI.Prototyping { @@ -41,8 +40,6 @@ public enum Authority /// TODO MTT-766 once we have per var interpolation /// Enable interpolation /// - // ReSharper disable once NotAccessedField.Global - [FormerlySerializedAs("m_InterpolatePosition")] [SerializeField, Tooltip("This requires AssumeSyncedSends to be true")] public bool InterpolatePosition = true; @@ -50,7 +47,6 @@ public enum Authority /// TODO MTT-766 once we have per var interpolation /// The distance before snaping to the position /// - // ReSharper disable once NotAccessedField.Global [SerializeField, Tooltip("The transform will snap if the distance is greater than this distance")] public float SnapDistance = 10f; @@ -58,7 +54,6 @@ public enum Authority /// TODO MTT-766 once we have per var interpolation /// Should the server interpolate /// - // ReSharper disable once NotAccessedField.Global [SerializeField] public bool InterpolateServer = true; @@ -68,7 +63,6 @@ public enum Authority /// The setting in the NetworkTransform would be to just apply it to our netvars when available /// The min meters to move before a send is sent /// - // ReSharper disable once NotAccessedField.Global [SerializeField, Tooltip("The min meters to move before a send is sent")] public float MinMeters = 0.15f; @@ -76,7 +70,6 @@ public enum Authority /// TODO MTT-767 once we have this per var setting /// The min degrees to rotate before a send is sent /// - // ReSharper disable once NotAccessedField.Global [SerializeField, Tooltip("The min degrees to rotate before a send is sent")] public float MinDegrees = 1.5f; @@ -84,7 +77,6 @@ public enum Authority /// TODO MTT-767 once we have this per var setting /// The min meters to scale before a send is sent /// - // ReSharper disable once NotAccessedField.Global [SerializeField, Tooltip("The min meters to scale before a send is sent")] public float MinSize = 0.15f; diff --git a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkBehaviour.cs b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkBehaviour.cs index fdc8a06896..6dab4a501b 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkBehaviour.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkBehaviour.cs @@ -14,7 +14,6 @@ using MLAPI.Reflection; using MLAPI.Serialization; using MLAPI.Serialization.Pooled; -using MLAPI.Spawning; using MLAPI.Transports; using Unity.Profiling; From a175ef3417ebbba2c067b29daa6aa770c5192ce9 Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Sun, 23 May 2021 18:50:27 +0100 Subject: [PATCH 05/44] sync networkobject reparenting props --- .../Runtime/Core/NetworkObject.cs | 57 ++++++++++++++++++- .../Messaging/InternalMessageHandler.cs | 6 +- .../Runtime/Spawning/NetworkSpawnManager.cs | 12 +++- 3 files changed, 68 insertions(+), 7 deletions(-) diff --git a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs index 6bd9b74969..811bb413cc 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs @@ -555,13 +555,54 @@ private void OnTransformParentChanged() transform.parent = null; } + internal static void WriteNetworkParenting(NetworkWriter writer, bool isReparented, ulong? latestParent) + { + writer.WriteBool(isReparented); + if (isReparented) + { + var isLatestParentSet = latestParent != null && latestParent.HasValue; + writer.WriteBool(isLatestParentSet); + if (isLatestParentSet) + { + writer.WriteUInt64Packed(latestParent.Value); + } + } + } + + internal static (bool IsReparented, ulong? LatestParent) ReadNetworkParenting(NetworkReader reader) + { + ulong? latestParent = null; + bool isReparented = reader.ReadBool(); + if (isReparented) + { + var isLatestParentSet = reader.ReadBool(); + if (isLatestParentSet) + { + latestParent = reader.ReadUInt64Packed(); + } + } + + return (isReparented, latestParent); + } + + internal void DebugNetworkParenting() + { + print($"{nameof(NetworkObject)} ({name}) -> isReparented:{m_IsReparented} --- latestParent:{m_LatestParent}"); + } + + internal (bool IsReparented, ulong? LatestParent) GetNetworkParenting() => (m_IsReparented, m_LatestParent); + + internal void SetNetworkParenting(bool isReparented, ulong? latestParent) + { + m_IsReparented = isReparented; + m_LatestParent = latestParent; + } + internal void ResetNetworkParenting() { m_IsReparented = false; m_LatestParent = null; m_CachedParent = null; - - print($"{nameof(ResetNetworkParenting)} ({name})"); } internal void ResetNetworkStartInvoked() @@ -738,6 +779,11 @@ internal void SerializeSceneObject(NetworkWriter writer, ulong targetClientId) writer.WriteBool(false); } + { + var (isReparented, latestParent) = GetNetworkParenting(); + WriteNetworkParenting(writer, isReparented, latestParent); + } + // Write whether we are including network variable data writer.WriteBool(NetworkManager.NetworkConfig.EnableNetworkVariable); @@ -813,8 +859,10 @@ internal static NetworkObject DeserializeSceneObject(NetworkBuffer objectStream, rotation = Quaternion.Euler(reader.ReadSinglePacked(), reader.ReadSinglePacked(), reader.ReadSinglePacked()); } + var (isReparented, latestParent) = ReadNetworkParenting(reader); + //Attempt to create a local NetworkObject - var networkObject = networkManager.SpawnManager.CreateLocalNetworkObject(isSceneObject, prefabHash, ownerClientId, parentNetworkId, position, rotation); + var networkObject = networkManager.SpawnManager.CreateLocalNetworkObject(isSceneObject, prefabHash, ownerClientId, parentNetworkId, position, rotation, isReparented); // Determine if this NetworkObject has NetworkVariable data to read var networkVariableDataIsIncluded = reader.ReadBool(); @@ -843,6 +891,9 @@ internal static NetworkObject DeserializeSceneObject(NetworkBuffer objectStream, // Spawn the NetworkObject networkManager.SpawnManager.SpawnNetworkObjectLocally(networkObject, networkId, isSceneObject, isPlayerObject, ownerClientId, objectStream, false, 0, true, false); + networkObject.SetNetworkParenting(isReparented, latestParent); + Debug.Log($"[{nameof(DeserializeSceneObject)}] {nameof(NetworkObject)} ({networkObject.name}) -> isReparented:{isReparented} --- latestParent:{latestParent}"); + var bufferQueue = networkManager.BufferManager.ConsumeBuffersForNetworkId(networkId); // Apply buffered messages diff --git a/com.unity.multiplayer.mlapi/Runtime/Messaging/InternalMessageHandler.cs b/com.unity.multiplayer.mlapi/Runtime/Messaging/InternalMessageHandler.cs index 8dccf5bc95..10a5d0fd41 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Messaging/InternalMessageHandler.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Messaging/InternalMessageHandler.cs @@ -199,11 +199,15 @@ public void HandleAddObject(ulong clientId, Stream stream) rot = Quaternion.Euler(reader.ReadSinglePacked(), reader.ReadSinglePacked(), reader.ReadSinglePacked()); } + var (isReparented, latestParent) = NetworkObject.ReadNetworkParenting(reader); + var hasPayload = reader.ReadBool(); var payLoadLength = hasPayload ? reader.ReadInt32Packed() : 0; - var networkObject = NetworkManager.SpawnManager.CreateLocalNetworkObject(softSync, prefabHash, ownerClientId, parentNetworkId, pos, rot); + var networkObject = NetworkManager.SpawnManager.CreateLocalNetworkObject(softSync, prefabHash, ownerClientId, parentNetworkId, pos, rot, isReparented); NetworkManager.SpawnManager.SpawnNetworkObjectLocally(networkObject, networkId, softSync, isPlayerObject, ownerClientId, stream, hasPayload, payLoadLength, true, false); + networkObject.SetNetworkParenting(isReparented, latestParent); + Debug.Log($"[{nameof(HandleAddObject)}] {nameof(NetworkObject)} ({networkObject.name}) -> isReparented:{isReparented} --- latestParent:{latestParent}"); Queue bufferQueue = NetworkManager.BufferManager.ConsumeBuffersForNetworkId(networkId); diff --git a/com.unity.multiplayer.mlapi/Runtime/Spawning/NetworkSpawnManager.cs b/com.unity.multiplayer.mlapi/Runtime/Spawning/NetworkSpawnManager.cs index 37d8ceebbc..3cd610c789 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Spawning/NetworkSpawnManager.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Spawning/NetworkSpawnManager.cs @@ -8,6 +8,7 @@ using MLAPI.Logging; using MLAPI.Messaging; using MLAPI.SceneManagement; +using MLAPI.Serialization; using MLAPI.Serialization.Pooled; using MLAPI.Transports; using UnityEngine; @@ -157,11 +158,11 @@ internal void ChangeOwnership(NetworkObject networkObject, ulong clientId) /// /// Should only run on the client /// - internal NetworkObject CreateLocalNetworkObject(bool softCreate, uint prefabHash, ulong ownerClientId, ulong? parentNetworkId, Vector3? position, Quaternion? rotation) + internal NetworkObject CreateLocalNetworkObject(bool softCreate, uint prefabHash, ulong ownerClientId, ulong? parentNetworkId, Vector3? position, Quaternion? rotation, bool isReparented = false) { NetworkObject parentNetworkObject = null; - if (parentNetworkId != null) + if (parentNetworkId != null && !isReparented) { if (SpawnedObjects.TryGetValue(parentNetworkId.Value, out NetworkObject networkObject)) { @@ -379,7 +380,7 @@ internal void SendSpawnCallForObject(ulong clientId, NetworkObject networkObject rpcQueueContainer.AddToInternalMLAPISendQueue(queueItem); } - internal void WriteSpawnCallForObject(Serialization.NetworkBuffer buffer, ulong clientId, NetworkObject networkObject, Stream payload) + internal void WriteSpawnCallForObject(NetworkBuffer buffer, ulong clientId, NetworkObject networkObject, Stream payload) { using (var writer = PooledNetworkWriter.Get(buffer)) { @@ -423,6 +424,11 @@ internal void WriteSpawnCallForObject(Serialization.NetworkBuffer buffer, ulong writer.WriteBool(false); } + { + var (isReparented, latestParent) = networkObject.GetNetworkParenting(); + NetworkObject.WriteNetworkParenting(writer, isReparented, latestParent); + } + writer.WriteBool(payload != null); if (payload != null) From 3c03ddb9fdb42851e91f8a5ff022e435ceb59084 Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Sun, 23 May 2021 19:38:54 +0100 Subject: [PATCH 06/44] parent sync with orphan children --- .../Runtime/Core/NetworkObject.cs | 63 +++++++++++++++++-- .../Messaging/InternalMessageHandler.cs | 3 +- .../Runtime/Spawning/NetworkSpawnManager.cs | 3 +- 3 files changed, 61 insertions(+), 8 deletions(-) diff --git a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs index 811bb413cc..3905832f98 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs @@ -598,11 +598,63 @@ internal void SetNetworkParenting(bool isReparented, ulong? latestParent) m_LatestParent = latestParent; } - internal void ResetNetworkParenting() + internal static HashSet OrphanChildren = new HashSet(); + + internal bool ApplyNetworkParenting() { - m_IsReparented = false; - m_LatestParent = null; - m_CachedParent = null; + if (!IsSpawned) + { + return false; + } + + if (!m_IsReparented) + { + return true; + } + + if (transform.parent == m_CachedParent) + { + return true; + } + + if (m_LatestParent == null || !m_LatestParent.HasValue) + { + Debug.Log($"{nameof(ApplyNetworkParenting)} reparented {name}:{NetworkObjectId} under the root"); + m_CachedParent = null; + transform.parent = null; + return true; + } + + if (!NetworkManager.SpawnManager.SpawnedObjects.ContainsKey(m_LatestParent.Value)) + { + OrphanChildren.Add(this); + return false; + } + + var parentObject = NetworkManager.SpawnManager.SpawnedObjects[m_LatestParent.Value]; + + m_CachedParent = parentObject.transform; + transform.parent = parentObject.transform; + + Debug.Log($"{nameof(ApplyNetworkParenting)} reparented {name}:{NetworkObjectId} under {parentObject.name}:{parentObject.NetworkObjectId}"); + + return true; + } + + internal static void CheckOrphanChildren() + { + var itemsToRemove = new List(); + foreach (var networkObject in OrphanChildren) + { + if (networkObject.ApplyNetworkParenting()) + { + itemsToRemove.Add(networkObject); + } + } + foreach (var networkObject in itemsToRemove) + { + OrphanChildren.Remove(networkObject); + } } internal void ResetNetworkStartInvoked() @@ -864,6 +916,8 @@ internal static NetworkObject DeserializeSceneObject(NetworkBuffer objectStream, //Attempt to create a local NetworkObject var networkObject = networkManager.SpawnManager.CreateLocalNetworkObject(isSceneObject, prefabHash, ownerClientId, parentNetworkId, position, rotation, isReparented); + networkObject.SetNetworkParenting(isReparented, latestParent); + // Determine if this NetworkObject has NetworkVariable data to read var networkVariableDataIsIncluded = reader.ReadBool(); @@ -891,7 +945,6 @@ internal static NetworkObject DeserializeSceneObject(NetworkBuffer objectStream, // Spawn the NetworkObject networkManager.SpawnManager.SpawnNetworkObjectLocally(networkObject, networkId, isSceneObject, isPlayerObject, ownerClientId, objectStream, false, 0, true, false); - networkObject.SetNetworkParenting(isReparented, latestParent); Debug.Log($"[{nameof(DeserializeSceneObject)}] {nameof(NetworkObject)} ({networkObject.name}) -> isReparented:{isReparented} --- latestParent:{latestParent}"); var bufferQueue = networkManager.BufferManager.ConsumeBuffersForNetworkId(networkId); diff --git a/com.unity.multiplayer.mlapi/Runtime/Messaging/InternalMessageHandler.cs b/com.unity.multiplayer.mlapi/Runtime/Messaging/InternalMessageHandler.cs index 10a5d0fd41..9381b9042b 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Messaging/InternalMessageHandler.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Messaging/InternalMessageHandler.cs @@ -205,9 +205,8 @@ public void HandleAddObject(ulong clientId, Stream stream) var payLoadLength = hasPayload ? reader.ReadInt32Packed() : 0; var networkObject = NetworkManager.SpawnManager.CreateLocalNetworkObject(softSync, prefabHash, ownerClientId, parentNetworkId, pos, rot, isReparented); - NetworkManager.SpawnManager.SpawnNetworkObjectLocally(networkObject, networkId, softSync, isPlayerObject, ownerClientId, stream, hasPayload, payLoadLength, true, false); networkObject.SetNetworkParenting(isReparented, latestParent); - Debug.Log($"[{nameof(HandleAddObject)}] {nameof(NetworkObject)} ({networkObject.name}) -> isReparented:{isReparented} --- latestParent:{latestParent}"); + NetworkManager.SpawnManager.SpawnNetworkObjectLocally(networkObject, networkId, softSync, isPlayerObject, ownerClientId, stream, hasPayload, payLoadLength, true, false); Queue bufferQueue = NetworkManager.BufferManager.ConsumeBuffersForNetworkId(networkId); diff --git a/com.unity.multiplayer.mlapi/Runtime/Spawning/NetworkSpawnManager.cs b/com.unity.multiplayer.mlapi/Runtime/Spawning/NetworkSpawnManager.cs index 3cd610c789..bc612a2496 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Spawning/NetworkSpawnManager.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Spawning/NetworkSpawnManager.cs @@ -333,7 +333,8 @@ internal void SpawnNetworkObjectLocally(NetworkObject networkObject, ulong netwo } } - networkObject.ResetNetworkParenting(); + networkObject.ApplyNetworkParenting(); + NetworkObject.CheckOrphanChildren(); networkObject.ResetNetworkStartInvoked(); From dac2e0f747107d53900e50896f4134bd43e1925a Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Sun, 23 May 2021 20:56:15 +0100 Subject: [PATCH 07/44] sync reparenting at runtime --- .../Runtime/Core/NetworkManager.cs | 19 +++++ .../Runtime/Core/NetworkObject.cs | 75 ++++++++++--------- .../Messaging/InternalMessageHandler.cs | 1 - 3 files changed, 59 insertions(+), 36 deletions(-) diff --git a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs index 0eac75309d..a454d49aa7 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs @@ -1340,6 +1340,25 @@ internal void HandleIncomingData(ulong clientId, NetworkChannel networkChannel, } } + break; + } + case NetworkConstants.PARENT_SYNC: + { + if (IsClient) + { + using (var reader = PooledNetworkReader.Get(messageStream)) + { + var networkObjectId = reader.ReadUInt64Packed(); + var (isReparented, latestParent) = NetworkObject.ReadNetworkParenting(reader); + if (SpawnManager.SpawnedObjects.ContainsKey(networkObjectId)) + { + var networkObject = SpawnManager.SpawnedObjects[networkObjectId]; + networkObject.SetNetworkParenting(isReparented, latestParent); + networkObject.ApplyNetworkParenting(); + } + } + } + break; } default: diff --git a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs index 3905832f98..bcabd50849 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs @@ -516,43 +516,49 @@ private void OnTransformParentChanged() return; } - var newParent = transform.parent; - - if (newParent == m_CachedParent) + var parentTransform = transform.parent; + if (parentTransform != null) { - print("new parent == cached parent"); - return; + var parentObject = transform.parent.GetComponent(); + if (parentObject != null) + { + m_LatestParent = parentObject.NetworkObjectId; + } + else + { + Debug.LogError("parent is not a network-object, moving to the root!"); + m_LatestParent = null; + } } - - m_CachedParent = newParent; - - if (newParent == null) + else { - m_IsReparented = true; m_LatestParent = null; - - print("moved to the root"); - return; } - var parentObject = newParent.GetComponent(); - if (parentObject != null && parentObject.IsSpawned) { - m_IsReparented = true; - m_LatestParent = parentObject.NetworkObjectId; + // todo: send internal message, handle on the other side + using (var buffer = PooledNetworkBuffer.Get()) + { + using (var writer = PooledNetworkWriter.Get(buffer)) + { + writer.WriteUInt64Packed(NetworkObjectId); + WriteNetworkParenting(writer, m_IsReparented, m_LatestParent); + } - print($"moved under {newParent.name}:{m_LatestParent}"); - return; + // todo: send to everyone + for (int i = 0; i < NetworkManager.ConnectedClientsList.Count; i++) + { + var targetClientId = NetworkManager.ConnectedClientsList[i].ClientId; + if (Observers.Contains(targetClientId)) + { + NetworkManager.MessageSender.Send(targetClientId, NetworkConstants.PARENT_SYNC, NetworkChannel.Internal, buffer); + } + } + } } - print("moved under a non-root, non-networkobject parent, moving to the root"); - m_IsReparented = true; - m_LatestParent = null; - m_CachedParent = null; - - // move to the root - transform.parent = null; + ApplyNetworkParenting(); } internal static void WriteNetworkParenting(NetworkWriter writer, bool isReparented, ulong? latestParent) @@ -612,11 +618,6 @@ internal bool ApplyNetworkParenting() return true; } - if (transform.parent == m_CachedParent) - { - return true; - } - if (m_LatestParent == null || !m_LatestParent.HasValue) { Debug.Log($"{nameof(ApplyNetworkParenting)} reparented {name}:{NetworkObjectId} under the root"); @@ -627,14 +628,20 @@ internal bool ApplyNetworkParenting() if (!NetworkManager.SpawnManager.SpawnedObjects.ContainsKey(m_LatestParent.Value)) { - OrphanChildren.Add(this); + if (OrphanChildren.Add(this)) + { + Debug.Log($"{name} is orphan"); + } return false; } var parentObject = NetworkManager.SpawnManager.SpawnedObjects[m_LatestParent.Value]; m_CachedParent = parentObject.transform; - transform.parent = parentObject.transform; + if (transform.parent != m_CachedParent) + { + transform.parent = m_CachedParent; + } Debug.Log($"{nameof(ApplyNetworkParenting)} reparented {name}:{NetworkObjectId} under {parentObject.name}:{parentObject.NetworkObjectId}"); @@ -945,8 +952,6 @@ internal static NetworkObject DeserializeSceneObject(NetworkBuffer objectStream, // Spawn the NetworkObject networkManager.SpawnManager.SpawnNetworkObjectLocally(networkObject, networkId, isSceneObject, isPlayerObject, ownerClientId, objectStream, false, 0, true, false); - Debug.Log($"[{nameof(DeserializeSceneObject)}] {nameof(NetworkObject)} ({networkObject.name}) -> isReparented:{isReparented} --- latestParent:{latestParent}"); - var bufferQueue = networkManager.BufferManager.ConsumeBuffersForNetworkId(networkId); // Apply buffered messages diff --git a/com.unity.multiplayer.mlapi/Runtime/Messaging/InternalMessageHandler.cs b/com.unity.multiplayer.mlapi/Runtime/Messaging/InternalMessageHandler.cs index 9381b9042b..d9a836df2c 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Messaging/InternalMessageHandler.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Messaging/InternalMessageHandler.cs @@ -4,7 +4,6 @@ using MLAPI.Logging; using MLAPI.SceneManagement; using MLAPI.Serialization.Pooled; -using MLAPI.Spawning; using UnityEngine; using UnityEngine.Events; using UnityEngine.SceneManagement; From e161d73824d74ab43951ef906f2518b47d3a30e0 Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Sun, 23 May 2021 21:36:00 +0100 Subject: [PATCH 08/44] working poc --- .../Prototyping/NetworkTransform.cs | 2 +- .../Runtime/Core/NetworkObject.cs | 2 +- testproject/Assets/Scenes/SampleScene.unity | 981 +++++++++++++++++- testproject/Assets/Scripts/NetworkDevDebug.cs | 52 + .../Assets/Scripts/NetworkDevDebug.cs.meta | 11 + testproject/Assets/Scripts/testproject.asmdef | 15 +- 6 files changed, 1015 insertions(+), 48 deletions(-) create mode 100644 testproject/Assets/Scripts/NetworkDevDebug.cs create mode 100644 testproject/Assets/Scripts/NetworkDevDebug.cs.meta diff --git a/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs b/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs index bf5b9726d4..2bf22018a3 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs @@ -170,7 +170,7 @@ private void SetWorldScale(Vector3 globalScale) m_Transform.localScale = new Vector3(globalScale.x / lossyScale.x, globalScale.y / lossyScale.y, globalScale.z / lossyScale.z); } - private bool CanUpdateTransform() + public bool CanUpdateTransform() { return (IsClient && TransformAuthority == Authority.Client && IsOwner) || (IsServer && TransformAuthority == Authority.Server) || TransformAuthority == Authority.Shared; } diff --git a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs index bcabd50849..8c1677f61e 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs @@ -591,7 +591,7 @@ internal static (bool IsReparented, ulong? LatestParent) ReadNetworkParenting(Ne return (isReparented, latestParent); } - internal void DebugNetworkParenting() + public void DebugNetworkParenting() { print($"{nameof(NetworkObject)} ({name}) -> isReparented:{m_IsReparented} --- latestParent:{m_LatestParent}"); } diff --git a/testproject/Assets/Scenes/SampleScene.unity b/testproject/Assets/Scenes/SampleScene.unity index 97db527944..56b44530b5 100644 --- a/testproject/Assets/Scenes/SampleScene.unity +++ b/testproject/Assets/Scenes/SampleScene.unity @@ -377,6 +377,199 @@ Transform: m_Father: {fileID: 1815329520} m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &384254998 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 384254999} + - component: {fileID: 384255000} + - component: {fileID: 384255001} + - component: {fileID: 384255002} + - component: {fileID: 384255003} + m_Layer: 0 + m_Name: NetworkDevDebug (NetObj) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &384254999 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 384254998} + 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: 0} + m_RootOrder: 15 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &384255000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 384254998} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0df54db83472e4dca9a001e0695d645e, type: 3} + m_Name: + m_EditorClassIdentifier: + SourceToMove: {fileID: 920644580} +--- !u!114 &384255001 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 384254998} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} + m_Name: + m_EditorClassIdentifier: + GlobalObjectIdHash: 348433834 + AlwaysReplicateAsRoot: 0 + DontDestroyWithOwner: 0 +--- !u!114 &384255002 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 384254998} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3} + m_Name: + m_EditorClassIdentifier: + TransformAuthority: 0 + FixedSendsPerSecond: 30 + InterpolatePosition: 1 + SnapDistance: 10 + InterpolateServer: 1 + MinMeters: 0.15 + MinDegrees: 1.5 + MinSize: 0.15 + Channel: 10 + m_UseLocal: + m_InternalValue: 0 +--- !u!96 &384255003 +TrailRenderer: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 384254998} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 0 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 0 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 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_Time: 5 + m_Parameters: + serializedVersion: 3 + widthMultiplier: 0.1 + widthCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + colorGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + numCornerVertices: 0 + numCapVertices: 0 + alignment: 0 + textureMode: 0 + shadowBias: 0.5 + generateLightingData: 0 + m_MinVertexDistance: 0.1 + m_Autodestruct: 0 + m_Emitting: 1 --- !u!1 &402668297 GameObject: m_ObjectHideFlags: 0 @@ -589,6 +782,36 @@ BoxCollider: serializedVersion: 2 m_Size: {x: 1, y: 1, z: 1} m_Center: {x: 0, y: 0, z: 0} +--- !u!1 &445473726 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 445473727} + m_Layer: 0 + m_Name: Pivot + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &445473727 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 445473726} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 2, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 533513584} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &457860556 GameObject: m_ObjectHideFlags: 0 @@ -686,6 +909,119 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 457860556} m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &533513580 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 533513584} + - component: {fileID: 533513583} + - component: {fileID: 533513582} + - component: {fileID: 533513581} + - component: {fileID: 533513585} + m_Layer: 0 + m_Name: Sphere (NetObj) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!135 &533513581 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 533513580} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &533513582 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 533513580} + 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: 10303, guid: 0000000000000000f000000000000000, 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!33 &533513583 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 533513580} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &533513584 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 533513580} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 5, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 445473727} + m_Father: {fileID: 0} + m_RootOrder: 13 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &533513585 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 533513580} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} + m_Name: + m_EditorClassIdentifier: + GlobalObjectIdHash: 479816849 + AlwaysReplicateAsRoot: 0 + DontDestroyWithOwner: 0 --- !u!1 &535968794 GameObject: m_ObjectHideFlags: 0 @@ -827,6 +1163,103 @@ BoxCollider: serializedVersion: 2 m_Size: {x: 1, y: 1, z: 1} m_Center: {x: 0, y: 0, z: 0} +--- !u!1 &589597413 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 589597414} + - component: {fileID: 589597417} + - component: {fileID: 589597416} + - component: {fileID: 589597415} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &589597414 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 589597413} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 2, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 2034182552} + m_Father: {fileID: 1840701983} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &589597415 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 589597413} + 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 &589597416 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 589597413} + 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: 10303, guid: 0000000000000000f000000000000000, 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!33 &589597417 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 589597413} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} --- !u!1 &620561609 GameObject: m_ObjectHideFlags: 0 @@ -1747,6 +2180,144 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 878759701} m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &920644580 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 920644585} + - component: {fileID: 920644584} + - component: {fileID: 920644583} + - component: {fileID: 920644582} + - component: {fileID: 920644581} + - component: {fileID: 920644586} + m_Layer: 0 + m_Name: Capsule (NetObj) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &920644581 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 920644580} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} + m_Name: + m_EditorClassIdentifier: + GlobalObjectIdHash: 3030285231 + AlwaysReplicateAsRoot: 0 + DontDestroyWithOwner: 0 +--- !u!136 &920644582 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 920644580} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + m_Radius: 0.5 + m_Height: 2 + m_Direction: 1 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &920644583 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 920644580} + 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: 10303, guid: 0000000000000000f000000000000000, 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!33 &920644584 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 920644580} + m_Mesh: {fileID: 10208, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &920644585 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 920644580} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3, y: 5, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1134235528} + m_Father: {fileID: 0} + m_RootOrder: 14 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &920644586 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 920644580} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3} + m_Name: + m_EditorClassIdentifier: + TransformAuthority: 0 + FixedSendsPerSecond: 30 + InterpolatePosition: 1 + SnapDistance: 10 + InterpolateServer: 1 + MinMeters: 0.15 + MinDegrees: 1.5 + MinSize: 0.15 + Channel: 10 + m_UseLocal: + m_InternalValue: 0 --- !u!1 &963826002 GameObject: m_ObjectHideFlags: 0 @@ -1790,69 +2361,165 @@ MonoBehaviour: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 963826002} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 53eaad6aa77ed43acb8e4293f21f95b9, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!114 &963826005 -MonoBehaviour: + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 53eaad6aa77ed43acb8e4293f21f95b9, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &963826005 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 963826002} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3} + m_Name: + m_EditorClassIdentifier: + TransformAuthority: 0 + FixedSendsPerSecond: 30 + InterpolatePosition: 1 + SnapDistance: 10 + InterpolateServer: 1 + MinMeters: 0.15 + MinDegrees: 1.5 + MinSize: 0.15 + Channel: 10 + m_UseLocal: + m_InternalValue: 0 +--- !u!114 &963826006 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 963826002} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} + m_Name: + m_EditorClassIdentifier: + GlobalObjectIdHash: 3972363333 + AlwaysReplicateAsRoot: 0 + DontDestroyWithOwner: 0 +--- !u!65 &963826007 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 963826002} + 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 &963826008 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 963826002} + 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: 10303, guid: 0000000000000000f000000000000000, 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!33 &963826009 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 963826002} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1134235527 +GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 963826002} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3} - m_Name: - m_EditorClassIdentifier: - TransformAuthority: 0 - FixedSendsPerSecond: 30 - InterpolatePosition: 1 - SnapDistance: 10 - InterpolateServer: 1 - MinMeters: 0.15 - MinDegrees: 1.5 - MinSize: 0.15 - Channel: 10 - m_UseLocal: - m_InternalValue: 0 ---- !u!114 &963826006 -MonoBehaviour: + serializedVersion: 6 + m_Component: + - component: {fileID: 1134235528} + - component: {fileID: 1134235531} + - component: {fileID: 1134235530} + - component: {fileID: 1134235529} + m_Layer: 0 + m_Name: Sphere + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1134235528 +Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 963826002} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} - m_Name: - m_EditorClassIdentifier: - GlobalObjectIdHash: 3972363333 - AlwaysReplicateAsRoot: 0 - DontDestroyWithOwner: 0 ---- !u!65 &963826007 -BoxCollider: + m_GameObject: {fileID: 1134235527} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 2, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 920644585} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!135 &1134235529 +SphereCollider: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 963826002} + m_GameObject: {fileID: 1134235527} m_Material: {fileID: 0} m_IsTrigger: 0 m_Enabled: 1 serializedVersion: 2 - m_Size: {x: 1, y: 1, z: 1} + m_Radius: 0.5 m_Center: {x: 0, y: 0, z: 0} ---- !u!23 &963826008 +--- !u!23 &1134235530 MeshRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 963826002} + m_GameObject: {fileID: 1134235527} m_Enabled: 1 m_CastShadows: 1 m_ReceiveShadows: 1 @@ -1888,14 +2555,14 @@ MeshRenderer: m_SortingLayer: 0 m_SortingOrder: 0 m_AdditionalVertexStreams: {fileID: 0} ---- !u!33 &963826009 +--- !u!33 &1134235531 MeshFilter: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 963826002} - m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} + m_GameObject: {fileID: 1134235527} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} --- !u!1 &1202924672 GameObject: m_ObjectHideFlags: 0 @@ -3258,6 +3925,119 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1840701978 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1840701983} + - component: {fileID: 1840701982} + - component: {fileID: 1840701981} + - component: {fileID: 1840701980} + - component: {fileID: 1840701979} + m_Layer: 0 + m_Name: Cube (NetObj) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1840701979 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1840701978} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} + m_Name: + m_EditorClassIdentifier: + GlobalObjectIdHash: 4252323905 + AlwaysReplicateAsRoot: 0 + DontDestroyWithOwner: 0 +--- !u!65 &1840701980 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1840701978} + 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 &1840701981 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1840701978} + 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: 10303, guid: 0000000000000000f000000000000000, 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!33 &1840701982 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1840701978} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &1840701983 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1840701978} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 5, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 589597414} + m_Father: {fileID: 0} + m_RootOrder: 12 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1001 &1928839749 PrefabInstance: m_ObjectHideFlags: 0 @@ -3377,6 +4157,119 @@ PrefabInstance: objectReference: {fileID: 0} m_RemovedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: d725b5588e1b956458798319e6541d84, type: 3} +--- !u!1 &2034182551 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2034182552} + - component: {fileID: 2034182556} + - component: {fileID: 2034182555} + - component: {fileID: 2034182554} + - component: {fileID: 2034182553} + m_Layer: 0 + m_Name: Cylinder (NetObj) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2034182552 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2034182551} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 2, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 589597414} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &2034182553 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2034182551} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} + m_Name: + m_EditorClassIdentifier: + GlobalObjectIdHash: 1762784599 + AlwaysReplicateAsRoot: 0 + DontDestroyWithOwner: 0 +--- !u!136 &2034182554 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2034182551} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + m_Radius: 0.5000001 + m_Height: 2 + m_Direction: 1 + m_Center: {x: 0.000000059604645, y: 0, z: -0.00000008940697} +--- !u!23 &2034182555 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2034182551} + 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: 10303, guid: 0000000000000000f000000000000000, 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!33 &2034182556 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2034182551} + m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} --- !u!1 &2036456027 GameObject: m_ObjectHideFlags: 0 diff --git a/testproject/Assets/Scripts/NetworkDevDebug.cs b/testproject/Assets/Scripts/NetworkDevDebug.cs new file mode 100644 index 0000000000..693b1b9cfd --- /dev/null +++ b/testproject/Assets/Scripts/NetworkDevDebug.cs @@ -0,0 +1,52 @@ +using MLAPI.Prototyping; +using UnityEngine; + +namespace MLAPI +{ + public class NetworkDevDebug : MonoBehaviour + { + public GameObject SourceToMove; + // public GameObject TargetToParent; + + private NetworkTransform m_NetworkTransform; + private Vector3 m_CachedPosition = Vector3.zero; + + private void Awake() + { + m_NetworkTransform = GetComponent(); + } + + private void Update() + { + if (Input.GetKeyDown(KeyCode.G)) + { + foreach (var networkObject in NetworkManager.Singleton.SpawnManager.SpawnedObjectsList) + { + networkObject.DebugNetworkParenting(); + } + } + if (Input.GetKeyDown(KeyCode.T)) + { + if (SourceToMove.transform.parent == transform) + { + print("moved source to the root"); + SourceToMove.transform.parent = null; + SourceToMove.transform.position = m_CachedPosition; + } + else + { + print("moved source under the target"); + m_CachedPosition = SourceToMove.transform.position; + SourceToMove.transform.parent = transform; + SourceToMove.transform.localPosition = Vector3.zero; + } + } + + if (m_NetworkTransform != null && m_NetworkTransform.CanUpdateTransform()) + { + transform.Translate(0, 0, Time.deltaTime * 4); // move forward + transform.Rotate(0, Time.deltaTime * 48, 0); // turn a little + } + } + } +} diff --git a/testproject/Assets/Scripts/NetworkDevDebug.cs.meta b/testproject/Assets/Scripts/NetworkDevDebug.cs.meta new file mode 100644 index 0000000000..25c3130df1 --- /dev/null +++ b/testproject/Assets/Scripts/NetworkDevDebug.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0df54db83472e4dca9a001e0695d645e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/testproject/Assets/Scripts/testproject.asmdef b/testproject/Assets/Scripts/testproject.asmdef index 8ad2974762..dd4ef94614 100644 --- a/testproject/Assets/Scripts/testproject.asmdef +++ b/testproject/Assets/Scripts/testproject.asmdef @@ -1,7 +1,18 @@ { "name": "TestProject", + "rootNamespace": "", "references": [ "Unity.Multiplayer.MLAPI.Runtime", - "Unity.Multiplayer.MLAPI.Editor" - ] + "Unity.Multiplayer.MLAPI.Editor", + "Unity.Multiplayer.MLAPI.Prototyping" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false } \ No newline at end of file From e5eaf2aa5b6fc075cdd758ebedafdf386a0efd06 Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Mon, 24 May 2021 06:42:52 +0100 Subject: [PATCH 09/44] more networkobject parenting restrictions (IsListening && IsServer && IsSpawned) --- .../Runtime/Core/NetworkObject.cs | 32 ++++++++++++++++--- .../Runtime/Spawning/NetworkSpawnManager.cs | 1 + 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs index 8c1677f61e..c379d251bf 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs @@ -508,11 +508,36 @@ internal void InvokeBehaviourOnGainedOwnership() private ulong? m_LatestParent; private Transform m_CachedParent; + internal void SetCachedParent(Transform parentTransform) + { + m_CachedParent = parentTransform; + } + private void OnTransformParentChanged() { + if (transform.parent == m_CachedParent) + { + return; + } + + if (NetworkManager == null || !NetworkManager.IsListening) + { + transform.parent = m_CachedParent; + Debug.LogException(new NotListeningException($"{nameof(NetworkManager)} is not listening, start a server or host before reparenting")); + return; + } + + if (!NetworkManager.IsServer) + { + transform.parent = m_CachedParent; + Debug.LogException(new NotServerException($"Only the server can reparent {nameof(NetworkObject)}s")); + return; + } + if (!IsSpawned) { - print("is not spawned"); + transform.parent = m_CachedParent; + Debug.LogException(new SpawnStateException($"A {nameof(NetworkObject)} can only be reparented after being spawned")); return; } @@ -638,10 +663,7 @@ internal bool ApplyNetworkParenting() var parentObject = NetworkManager.SpawnManager.SpawnedObjects[m_LatestParent.Value]; m_CachedParent = parentObject.transform; - if (transform.parent != m_CachedParent) - { - transform.parent = m_CachedParent; - } + transform.parent = parentObject.transform; Debug.Log($"{nameof(ApplyNetworkParenting)} reparented {name}:{NetworkObjectId} under {parentObject.name}:{parentObject.NetworkObjectId}"); diff --git a/com.unity.multiplayer.mlapi/Runtime/Spawning/NetworkSpawnManager.cs b/com.unity.multiplayer.mlapi/Runtime/Spawning/NetworkSpawnManager.cs index bc612a2496..07bceb3209 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Spawning/NetworkSpawnManager.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Spawning/NetworkSpawnManager.cs @@ -333,6 +333,7 @@ internal void SpawnNetworkObjectLocally(NetworkObject networkObject, ulong netwo } } + networkObject.SetCachedParent(networkObject.transform.parent); networkObject.ApplyNetworkParenting(); NetworkObject.CheckOrphanChildren(); From 33fb6ac5323dcbe314e7144a8b354e60d511a4df Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Mon, 24 May 2021 19:08:17 +0100 Subject: [PATCH 10/44] minor fix --- com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs index c379d251bf..bcc934f211 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs @@ -209,6 +209,11 @@ public bool IsNetworkVisibleTo(ulong clientId) return Observers.Contains(clientId); } + private void Awake() + { + SetCachedParent(transform.parent); + } + /// /// Shows a previously hidden object to a client /// From 342495b9d88a1d8c7177a8d63d06933866831161 Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Mon, 24 May 2021 22:54:50 +0100 Subject: [PATCH 11/44] cleanup --- .../Runtime/Core/NetworkObject.cs | 55 +++++++++---------- testproject/Assets/Scripts/NetworkDevDebug.cs | 9 --- testproject/Assets/Scripts/testproject.asmdef | 12 +--- 3 files changed, 26 insertions(+), 50 deletions(-) diff --git a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs index bcc934f211..72d88aa1f5 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs @@ -542,7 +542,7 @@ private void OnTransformParentChanged() if (!IsSpawned) { transform.parent = m_CachedParent; - Debug.LogException(new SpawnStateException($"A {nameof(NetworkObject)} can only be reparented after being spawned")); + Debug.LogException(new SpawnStateException($"{nameof(NetworkObject)} can only be reparented after being spawned")); return; } @@ -556,7 +556,11 @@ private void OnTransformParentChanged() } else { - Debug.LogError("parent is not a network-object, moving to the root!"); + if (NetworkLog.CurrentLogLevel <= LogLevel.Error) + { + NetworkLog.LogError($"Invalid parenting, {nameof(NetworkObject)} moved under a non-{nameof(NetworkObject)} parent, will fix and move to the scene root"); + } + m_LatestParent = null; } } @@ -565,24 +569,20 @@ private void OnTransformParentChanged() m_LatestParent = null; } + using (var buffer = PooledNetworkBuffer.Get()) { - // todo: send internal message, handle on the other side - using (var buffer = PooledNetworkBuffer.Get()) + using (var writer = PooledNetworkWriter.Get(buffer)) { - using (var writer = PooledNetworkWriter.Get(buffer)) - { - writer.WriteUInt64Packed(NetworkObjectId); - WriteNetworkParenting(writer, m_IsReparented, m_LatestParent); - } + writer.WriteUInt64Packed(NetworkObjectId); + WriteNetworkParenting(writer, m_IsReparented, m_LatestParent); + } - // todo: send to everyone - for (int i = 0; i < NetworkManager.ConnectedClientsList.Count; i++) + for (int i = 0; i < NetworkManager.ConnectedClientsList.Count; i++) + { + var targetClientId = NetworkManager.ConnectedClientsList[i].ClientId; + if (Observers.Contains(targetClientId)) { - var targetClientId = NetworkManager.ConnectedClientsList[i].ClientId; - if (Observers.Contains(targetClientId)) - { - NetworkManager.MessageSender.Send(targetClientId, NetworkConstants.PARENT_SYNC, NetworkChannel.Internal, buffer); - } + NetworkManager.MessageSender.Send(targetClientId, NetworkConstants.PARENT_SYNC, NetworkChannel.Internal, buffer); } } } @@ -621,11 +621,6 @@ internal static (bool IsReparented, ulong? LatestParent) ReadNetworkParenting(Ne return (isReparented, latestParent); } - public void DebugNetworkParenting() - { - print($"{nameof(NetworkObject)} ({name}) -> isReparented:{m_IsReparented} --- latestParent:{m_LatestParent}"); - } - internal (bool IsReparented, ulong? LatestParent) GetNetworkParenting() => (m_IsReparented, m_LatestParent); internal void SetNetworkParenting(bool isReparented, ulong? latestParent) @@ -650,7 +645,6 @@ internal bool ApplyNetworkParenting() if (m_LatestParent == null || !m_LatestParent.HasValue) { - Debug.Log($"{nameof(ApplyNetworkParenting)} reparented {name}:{NetworkObjectId} under the root"); m_CachedParent = null; transform.parent = null; return true; @@ -660,7 +654,10 @@ internal bool ApplyNetworkParenting() { if (OrphanChildren.Add(this)) { - Debug.Log($"{name} is orphan"); + if (NetworkLog.CurrentLogLevel <= LogLevel.Normal) + { + NetworkLog.LogWarning($"{nameof(NetworkObject)} ({name}) cannot find its parent, added to {nameof(OrphanChildren)} set"); + } } return false; } @@ -670,22 +667,20 @@ internal bool ApplyNetworkParenting() m_CachedParent = parentObject.transform; transform.parent = parentObject.transform; - Debug.Log($"{nameof(ApplyNetworkParenting)} reparented {name}:{NetworkObjectId} under {parentObject.name}:{parentObject.NetworkObjectId}"); - return true; } internal static void CheckOrphanChildren() { - var itemsToRemove = new List(); - foreach (var networkObject in OrphanChildren) + var objectsToRemove = new List(); + foreach (var orphanObject in OrphanChildren) { - if (networkObject.ApplyNetworkParenting()) + if (orphanObject.ApplyNetworkParenting()) { - itemsToRemove.Add(networkObject); + objectsToRemove.Add(orphanObject); } } - foreach (var networkObject in itemsToRemove) + foreach (var networkObject in objectsToRemove) { OrphanChildren.Remove(networkObject); } diff --git a/testproject/Assets/Scripts/NetworkDevDebug.cs b/testproject/Assets/Scripts/NetworkDevDebug.cs index 693b1b9cfd..9eef73615d 100644 --- a/testproject/Assets/Scripts/NetworkDevDebug.cs +++ b/testproject/Assets/Scripts/NetworkDevDebug.cs @@ -18,24 +18,15 @@ private void Awake() private void Update() { - if (Input.GetKeyDown(KeyCode.G)) - { - foreach (var networkObject in NetworkManager.Singleton.SpawnManager.SpawnedObjectsList) - { - networkObject.DebugNetworkParenting(); - } - } if (Input.GetKeyDown(KeyCode.T)) { if (SourceToMove.transform.parent == transform) { - print("moved source to the root"); SourceToMove.transform.parent = null; SourceToMove.transform.position = m_CachedPosition; } else { - print("moved source under the target"); m_CachedPosition = SourceToMove.transform.position; SourceToMove.transform.parent = transform; SourceToMove.transform.localPosition = Vector3.zero; diff --git a/testproject/Assets/Scripts/testproject.asmdef b/testproject/Assets/Scripts/testproject.asmdef index dd4ef94614..a181237134 100644 --- a/testproject/Assets/Scripts/testproject.asmdef +++ b/testproject/Assets/Scripts/testproject.asmdef @@ -1,18 +1,8 @@ { "name": "TestProject", - "rootNamespace": "", "references": [ "Unity.Multiplayer.MLAPI.Runtime", "Unity.Multiplayer.MLAPI.Editor", "Unity.Multiplayer.MLAPI.Prototyping" - ], - "includePlatforms": [], - "excludePlatforms": [], - "allowUnsafeCode": false, - "overrideReferences": false, - "precompiledReferences": [], - "autoReferenced": true, - "defineConstraints": [], - "versionDefines": [], - "noEngineReferences": false + ] } \ No newline at end of file From 1766b586150af4ad08ea4a558246f79a35c3d5ca Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Tue, 25 May 2021 05:44:31 +0100 Subject: [PATCH 12/44] minor update: exception message --- com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs index 72d88aa1f5..3ec7daf516 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs @@ -411,7 +411,7 @@ private void SpawnInternal(Stream spawnPayload, bool destroyWithScene, ulong? ow { if (!NetworkManager.IsListening) { - throw new NotListeningException($"{nameof(NetworkManager)} isn't listening, start a server or host before spawning objects."); + throw new NotListeningException($"{nameof(NetworkManager)} is not listening, start a server or host before spawning objects"); } if (!NetworkManager.IsServer) From 86a1532adc668899c2ca1181fcfbaee4bc2bf366 Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Tue, 25 May 2021 06:07:13 +0100 Subject: [PATCH 13/44] nullptr check --- com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs index 3ec7daf516..d57823589e 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs @@ -945,7 +945,7 @@ internal static NetworkObject DeserializeSceneObject(NetworkBuffer objectStream, //Attempt to create a local NetworkObject var networkObject = networkManager.SpawnManager.CreateLocalNetworkObject(isSceneObject, prefabHash, ownerClientId, parentNetworkId, position, rotation, isReparented); - networkObject.SetNetworkParenting(isReparented, latestParent); + networkObject?.SetNetworkParenting(isReparented, latestParent); // Determine if this NetworkObject has NetworkVariable data to read var networkVariableDataIsIncluded = reader.ReadBool(); From d7a4a3cc556d7188aed6d6c99a87363d4c22094b Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Tue, 25 May 2021 06:44:01 +0100 Subject: [PATCH 14/44] reset networkobject.orphanchildren set on networkmanager.initialize --- .../Runtime/Core/NetworkManager.cs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs index a454d49aa7..6812292c22 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs @@ -318,11 +318,11 @@ private void OnValidate() } #endif - private void Init(bool server) + private void Initialize(bool server) { if (NetworkLog.CurrentLogLevel <= LogLevel.Developer) { - NetworkLog.LogInfo(nameof(Init)); + NetworkLog.LogInfo(nameof(Initialize)); } LocalClientId = 0; @@ -333,6 +333,7 @@ private void Init(bool server) PendingClients.Clear(); ConnectedClients.Clear(); ConnectedClientsList.Clear(); + NetworkObject.OrphanChildren.Clear(); // Create spawn manager instance SpawnManager = new NetworkSpawnManager(this); @@ -540,7 +541,7 @@ public SocketTasks StartServer() } } - Init(true); + Initialize(true); var socketTasks = NetworkConfig.NetworkTransport.StartServer(); @@ -575,7 +576,7 @@ public SocketTasks StartClient() return SocketTask.Fault.AsTasks(); } - Init(false); + Initialize(false); var socketTasks = NetworkConfig.NetworkTransport.StartClient(); @@ -701,7 +702,7 @@ public SocketTasks StartHost() } } - Init(true); + Initialize(true); var socketTasks = NetworkConfig.NetworkTransport.StartServer(); From 3588afe082056f78dcf53127cdf1fd691fe553a7 Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Thu, 27 May 2021 07:47:16 +0100 Subject: [PATCH 15/44] NetworkBehaviour.OnNetworkObjectParentChanged --- .../Runtime/Core/NetworkBehaviour.cs | 5 +++++ .../Runtime/Core/NetworkObject.cs | 13 +++++++++++++ 2 files changed, 18 insertions(+) diff --git a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkBehaviour.cs b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkBehaviour.cs index 1a2121ea1a..bac13dc143 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkBehaviour.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkBehaviour.cs @@ -378,6 +378,11 @@ public virtual void OnGainedOwnership() { } /// public virtual void OnLostOwnership() { } + /// + /// Gets called when the parent NetworkObject of this NetworkBehaviour's NetworkObject has changed + /// + public virtual void OnNetworkObjectParentChanged(NetworkObject parentNetworkObject) { } + private bool m_VarInit = false; private readonly List> m_ChannelMappedNetworkVariableIndexes = new List>(); diff --git a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs index d57823589e..47cbdca0c4 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs @@ -513,6 +513,14 @@ internal void InvokeBehaviourOnGainedOwnership() private ulong? m_LatestParent; private Transform m_CachedParent; + internal void InvokeBehaviourOnNetworkObjectParentChanged(NetworkObject parentNetworkObject) + { + for (int i = 0; i < ChildNetworkBehaviours.Count; i++) + { + ChildNetworkBehaviours[i].OnNetworkObjectParentChanged(parentNetworkObject); + } + } + internal void SetCachedParent(Transform parentTransform) { m_CachedParent = parentTransform; @@ -647,6 +655,9 @@ internal bool ApplyNetworkParenting() { m_CachedParent = null; transform.parent = null; + + InvokeBehaviourOnNetworkObjectParentChanged(null); + return true; } @@ -667,6 +678,8 @@ internal bool ApplyNetworkParenting() m_CachedParent = parentObject.transform; transform.parent = parentObject.transform; + InvokeBehaviourOnNetworkObjectParentChanged(parentObject); + return true; } From 73d64313a1d1f8a2ee6b725eb5813a48e70dd2b5 Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Tue, 1 Jun 2021 16:35:12 +0100 Subject: [PATCH 16/44] do not pop invalid moves to the root --- .../Runtime/Core/NetworkObject.cs | 14 ++++++-------- testproject/Assets/Scripts.meta | 8 ++++++++ 2 files changed, 14 insertions(+), 8 deletions(-) create mode 100644 testproject/Assets/Scripts.meta diff --git a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs index 47cbdca0c4..8bf7cbf94c 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs @@ -558,19 +558,17 @@ private void OnTransformParentChanged() if (parentTransform != null) { var parentObject = transform.parent.GetComponent(); - if (parentObject != null) - { - m_LatestParent = parentObject.NetworkObjectId; - } - else + if (parentObject == null) { + transform.parent = m_CachedParent; if (NetworkLog.CurrentLogLevel <= LogLevel.Error) { - NetworkLog.LogError($"Invalid parenting, {nameof(NetworkObject)} moved under a non-{nameof(NetworkObject)} parent, will fix and move to the scene root"); + NetworkLog.LogError($"Invalid parenting, {nameof(NetworkObject)} moved under a non-{nameof(NetworkObject)} parent"); } - - m_LatestParent = null; + return; } + + m_LatestParent = parentObject.NetworkObjectId; } else { diff --git a/testproject/Assets/Scripts.meta b/testproject/Assets/Scripts.meta new file mode 100644 index 0000000000..fbdac1c07d --- /dev/null +++ b/testproject/Assets/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7d4cd8efbd22842fb88268393e9d06a2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: From 778d60f05d68dfc65e6b2a6867a427e9942d1bf9 Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Wed, 2 Jun 2021 14:25:34 +0100 Subject: [PATCH 17/44] NetworkObject.TrySetParent & InvalidParentException --- .../Runtime/Core/NetworkObject.cs | 139 ++++++++++++------ .../Exceptions/InvalidParentException.cs | 14 ++ .../Exceptions/InvalidParentException.cs.meta | 11 ++ 3 files changed, 116 insertions(+), 48 deletions(-) create mode 100644 com.unity.multiplayer.mlapi/Runtime/Exceptions/InvalidParentException.cs create mode 100644 com.unity.multiplayer.mlapi/Runtime/Exceptions/InvalidParentException.cs.meta diff --git a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs index 8bf7cbf94c..ab5ef741b2 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs @@ -509,10 +509,6 @@ internal void InvokeBehaviourOnGainedOwnership() } } - private bool m_IsReparented; - private ulong? m_LatestParent; - private Transform m_CachedParent; - internal void InvokeBehaviourOnNetworkObjectParentChanged(NetworkObject parentNetworkObject) { for (int i = 0; i < ChildNetworkBehaviours.Count; i++) @@ -521,11 +517,94 @@ internal void InvokeBehaviourOnNetworkObjectParentChanged(NetworkObject parentNe } } + private bool m_IsReparented; + private ulong? m_LatestParent; + private Transform m_CachedParent; + internal void SetCachedParent(Transform parentTransform) { m_CachedParent = parentTransform; } + internal static void WriteNetworkParenting(NetworkWriter writer, bool isReparented, ulong? latestParent) + { + writer.WriteBool(isReparented); + if (isReparented) + { + var isLatestParentSet = latestParent != null && latestParent.HasValue; + writer.WriteBool(isLatestParentSet); + if (isLatestParentSet) + { + writer.WriteUInt64Packed(latestParent.Value); + } + } + } + + internal static (bool IsReparented, ulong? LatestParent) ReadNetworkParenting(NetworkReader reader) + { + ulong? latestParent = null; + bool isReparented = reader.ReadBool(); + if (isReparented) + { + var isLatestParentSet = reader.ReadBool(); + if (isLatestParentSet) + { + latestParent = reader.ReadUInt64Packed(); + } + } + + return (isReparented, latestParent); + } + + internal (bool IsReparented, ulong? LatestParent) GetNetworkParenting() => (m_IsReparented, m_LatestParent); + + internal void SetNetworkParenting(bool isReparented, ulong? latestParent) + { + m_IsReparented = isReparented; + m_LatestParent = latestParent; + } + + public bool TrySetParent(Transform parent, bool worldPositionStays = true) + { + return TrySetParent(parent.GetComponent(), worldPositionStays); + } + + public bool TrySetParent(GameObject parent, bool worldPositionStays = true) + { + return TrySetParent(parent.GetComponent(), worldPositionStays); + } + + public bool TrySetParent(NetworkObject parent, bool worldPositionStays = true) + { + if (NetworkManager == null || !NetworkManager.IsListening) + { + return false; + } + + if (!NetworkManager.IsServer) + { + return false; + } + + if (!IsSpawned) + { + return false; + } + + if (parent == null) + { + return false; + } + + if (!parent.IsSpawned) + { + return false; + } + + transform.SetParent(parent.transform, worldPositionStays); + return true; + } + private void OnTransformParentChanged() { if (transform.parent == m_CachedParent) @@ -561,10 +640,14 @@ private void OnTransformParentChanged() if (parentObject == null) { transform.parent = m_CachedParent; - if (NetworkLog.CurrentLogLevel <= LogLevel.Error) - { - NetworkLog.LogError($"Invalid parenting, {nameof(NetworkObject)} moved under a non-{nameof(NetworkObject)} parent"); - } + Debug.LogException(new InvalidParentException($"Invalid parenting, {nameof(NetworkObject)} moved under a non-{nameof(NetworkObject)} parent")); + return; + } + + if (!parentObject.IsSpawned) + { + transform.parent = m_CachedParent; + Debug.LogException(new SpawnStateException($"{nameof(NetworkObject)} can only be reparented under another spawned {nameof(NetworkObject)}")); return; } @@ -597,44 +680,6 @@ private void OnTransformParentChanged() ApplyNetworkParenting(); } - internal static void WriteNetworkParenting(NetworkWriter writer, bool isReparented, ulong? latestParent) - { - writer.WriteBool(isReparented); - if (isReparented) - { - var isLatestParentSet = latestParent != null && latestParent.HasValue; - writer.WriteBool(isLatestParentSet); - if (isLatestParentSet) - { - writer.WriteUInt64Packed(latestParent.Value); - } - } - } - - internal static (bool IsReparented, ulong? LatestParent) ReadNetworkParenting(NetworkReader reader) - { - ulong? latestParent = null; - bool isReparented = reader.ReadBool(); - if (isReparented) - { - var isLatestParentSet = reader.ReadBool(); - if (isLatestParentSet) - { - latestParent = reader.ReadUInt64Packed(); - } - } - - return (isReparented, latestParent); - } - - internal (bool IsReparented, ulong? LatestParent) GetNetworkParenting() => (m_IsReparented, m_LatestParent); - - internal void SetNetworkParenting(bool isReparented, ulong? latestParent) - { - m_IsReparented = isReparented; - m_LatestParent = latestParent; - } - internal static HashSet OrphanChildren = new HashSet(); internal bool ApplyNetworkParenting() @@ -655,7 +700,6 @@ internal bool ApplyNetworkParenting() transform.parent = null; InvokeBehaviourOnNetworkObjectParentChanged(null); - return true; } @@ -677,7 +721,6 @@ internal bool ApplyNetworkParenting() transform.parent = parentObject.transform; InvokeBehaviourOnNetworkObjectParentChanged(parentObject); - return true; } diff --git a/com.unity.multiplayer.mlapi/Runtime/Exceptions/InvalidParentException.cs b/com.unity.multiplayer.mlapi/Runtime/Exceptions/InvalidParentException.cs new file mode 100644 index 0000000000..14961877c4 --- /dev/null +++ b/com.unity.multiplayer.mlapi/Runtime/Exceptions/InvalidParentException.cs @@ -0,0 +1,14 @@ +using System; + +namespace MLAPI.Exceptions +{ + /// + /// Exception thrown when the new parent candidate of the NetworkObject is not valid + /// + public class InvalidParentException : Exception + { + public InvalidParentException() { } + public InvalidParentException(string message) : base(message) { } + public InvalidParentException(string message, Exception innerException) : base(message, innerException) { } + } +} diff --git a/com.unity.multiplayer.mlapi/Runtime/Exceptions/InvalidParentException.cs.meta b/com.unity.multiplayer.mlapi/Runtime/Exceptions/InvalidParentException.cs.meta new file mode 100644 index 0000000000..12b58cc424 --- /dev/null +++ b/com.unity.multiplayer.mlapi/Runtime/Exceptions/InvalidParentException.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: abe1766318991412cb1aba96c4dbcc4e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From 1025dbfa0310644c7ab98e68fb81fbabd2365a8b Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Thu, 3 Jun 2021 00:10:00 +0100 Subject: [PATCH 18/44] bool flag to enable/disable --- .../Runtime/Core/NetworkObject.cs | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs index ab5ef741b2..6091ecaa05 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs @@ -178,6 +178,11 @@ internal set /// public bool DontDestroyWithOwner; + /// + /// Whether or not to enable automatic NetworkObject parent synchronization. + /// + public bool AutoObjectParentSync = true; + internal readonly HashSet Observers = new HashSet(); /// @@ -576,6 +581,11 @@ public bool TrySetParent(GameObject parent, bool worldPositionStays = true) public bool TrySetParent(NetworkObject parent, bool worldPositionStays = true) { + if (!AutoObjectParentSync) + { + return false; + } + if (NetworkManager == null || !NetworkManager.IsListening) { return false; @@ -607,6 +617,11 @@ public bool TrySetParent(NetworkObject parent, bool worldPositionStays = true) private void OnTransformParentChanged() { + if (!AutoObjectParentSync) + { + return; + } + if (transform.parent == m_CachedParent) { return; @@ -684,6 +699,11 @@ private void OnTransformParentChanged() internal bool ApplyNetworkParenting() { + if (!AutoObjectParentSync) + { + return false; + } + if (!IsSpawned) { return false; From 0c593ff8f80ed0b969060e7f15e560e7fc80f70a Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Sat, 5 Jun 2021 04:34:03 +0100 Subject: [PATCH 19/44] implement networkobject runtime tests --- .../Runtime/Core/NetworkObject.cs | 8 +- .../NetworkObjectGlobalObjectIdHashTests.cs | 3 +- .../Tests/Runtime/ObjectParenting.meta | 8 + .../Runtime/ObjectParenting/BlueColMat.mat | 79 + .../ObjectParenting/BlueColMat.mat.meta | 8 + .../Runtime/ObjectParenting/GrayColMat.mat | 79 + .../ObjectParenting/GrayColMat.mat.meta | 8 + .../Runtime/ObjectParenting/GreenColMat.mat | 79 + .../ObjectParenting/GreenColMat.mat.meta | 8 + .../NetworkObjectParentingTests.cs | 271 ++ .../NetworkObjectParentingTests.cs.meta | 11 + .../NetworkObjectParentingTests.unity | 2214 +++++++++++++++++ .../NetworkObjectParentingTests.unity.meta | 7 + .../ObjectParenting/PlayerPrefab.prefab | 49 + .../ObjectParenting/PlayerPrefab.prefab.meta | 7 + 15 files changed, 2833 insertions(+), 6 deletions(-) create mode 100644 com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting.meta create mode 100644 com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/BlueColMat.mat create mode 100644 com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/BlueColMat.mat.meta create mode 100644 com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/GrayColMat.mat create mode 100644 com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/GrayColMat.mat.meta create mode 100644 com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/GreenColMat.mat create mode 100644 com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/GreenColMat.mat.meta create mode 100644 com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs create mode 100644 com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs.meta create mode 100644 com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.unity create mode 100644 com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.unity.meta create mode 100644 com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/PlayerPrefab.prefab create mode 100644 com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/PlayerPrefab.prefab.meta diff --git a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs index 6091ecaa05..c432ca6d1c 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs @@ -64,7 +64,7 @@ internal void GenerateGlobalObjectIdHash() /// /// Gets the NetworkManager that owns this NetworkObject instance /// - public NetworkManager NetworkManager => NetworkManagerOwner != null ? NetworkManagerOwner : NetworkManager.Singleton; + public NetworkManager NetworkManager => NetworkManagerOwner ?? NetworkManager.Singleton; /// /// The NetworkManager that owns this NetworkObject. @@ -673,6 +673,9 @@ private void OnTransformParentChanged() m_LatestParent = null; } + m_IsReparented = true; + ApplyNetworkParenting(); + using (var buffer = PooledNetworkBuffer.Get()) { using (var writer = PooledNetworkWriter.Get(buffer)) @@ -690,9 +693,6 @@ private void OnTransformParentChanged() } } } - - m_IsReparented = true; - ApplyNetworkParenting(); } internal static HashSet OrphanChildren = new HashSet(); diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/GlobalObjectIdHash/NetworkObjectGlobalObjectIdHashTests.cs b/com.unity.multiplayer.mlapi/Tests/Runtime/GlobalObjectIdHash/NetworkObjectGlobalObjectIdHashTests.cs index e9ff195a02..c1b52cf410 100644 --- a/com.unity.multiplayer.mlapi/Tests/Runtime/GlobalObjectIdHash/NetworkObjectGlobalObjectIdHashTests.cs +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/GlobalObjectIdHash/NetworkObjectGlobalObjectIdHashTests.cs @@ -32,6 +32,7 @@ public IEnumerator Setup() var scenePath = Path.Combine(packagePath, $"Tests/Runtime/GlobalObjectIdHash/{nameof(NetworkObjectGlobalObjectIdHashTests)}.unity"); yield return EditorSceneManager.LoadSceneAsyncInPlayMode(scenePath, new LoadSceneParameters(LoadSceneMode.Additive)); + Assert.That(m_TestScene.isLoaded, Is.True); } [UnityTearDown] @@ -48,8 +49,6 @@ public IEnumerator Teardown() [Test] public void VerifyUniquenessOfNetworkObjects() { - Assert.That(m_TestScene.isLoaded, Is.True); - var hashSet = new HashSet(); foreach (var rootObject in m_TestScene.GetRootGameObjects()) { diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting.meta b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting.meta new file mode 100644 index 0000000000..63a52b767a --- /dev/null +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4b0e72312f6c8404891c5cb3f2a3f36d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/BlueColMat.mat b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/BlueColMat.mat new file mode 100644 index 0000000000..f56846b713 --- /dev/null +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/BlueColMat.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: BlueColMat + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + 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: 0, g: 0, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + m_BuildTextureStacks: [] diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/BlueColMat.mat.meta b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/BlueColMat.mat.meta new file mode 100644 index 0000000000..6df17a3b9b --- /dev/null +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/BlueColMat.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 52c34e1beacd44c9bb0f6375c891b4cf +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/GrayColMat.mat b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/GrayColMat.mat new file mode 100644 index 0000000000..fba9482df6 --- /dev/null +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/GrayColMat.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: GrayColMat + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + 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: 0.2, g: 0.2, b: 0.2, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + m_BuildTextureStacks: [] diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/GrayColMat.mat.meta b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/GrayColMat.mat.meta new file mode 100644 index 0000000000..35533b8924 --- /dev/null +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/GrayColMat.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 03e094ab168544996a7d1d6dcdc60058 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/GreenColMat.mat b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/GreenColMat.mat new file mode 100644 index 0000000000..f4f7e2b5d3 --- /dev/null +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/GreenColMat.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: GreenColMat + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + 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: 0, g: 1, b: 0, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + m_BuildTextureStacks: [] diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/GreenColMat.mat.meta b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/GreenColMat.mat.meta new file mode 100644 index 0000000000..6cc05ba8f0 --- /dev/null +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/GreenColMat.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d8e0487da5b3d4659909d18d138cff5a +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs new file mode 100644 index 0000000000..645eed9d9a --- /dev/null +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs @@ -0,0 +1,271 @@ +using System.Collections; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text.RegularExpressions; +using NUnit.Framework; +using UnityEditor.PackageManager; +using UnityEditor.SceneManagement; +using UnityEngine; +using UnityEngine.SceneManagement; +using UnityEngine.TestTools; + +namespace MLAPI.RuntimeTests +{ + public class NetworkObjectParentingTests + { + private const int k_ClientInstanceCount = 1; + + private NetworkManager m_ServerNetworkManager; + private NetworkManager[] m_ClientNetworkManagers; + + private Transform[] m_Dude_NetObjs; + private Transform[] m_Dude_LeftArm_NetObjs; + private Transform[] m_Dude_RightArm_NetObjs; + private Transform[] m_Dude_LeftLeg_NetObjs; + private Transform[] m_Dude_RightLeg_NetObjs; + private Transform[] m_Cube_NetObjs; + private Transform[] m_Pickup_NetObjs; + private Transform[] m_Pickup_Back_NetObjs; + + private Scene m_InitScene; + private Scene m_TestScene; + + private void OnSceneLoaded(Scene scene, LoadSceneMode mode) + { + if (scene.name == nameof(NetworkObjectParentingTests)) + { + m_TestScene = scene; + } + } + + [UnitySetUp] + public IEnumerator Setup() + { + SceneManager.sceneLoaded += OnSceneLoaded; + + var execAssembly = Assembly.GetExecutingAssembly(); + var packagePath = PackageInfo.FindForAssembly(execAssembly).assetPath; + var scenePath = Path.Combine(packagePath, $"Tests/Runtime/ObjectParenting/{nameof(NetworkObjectParentingTests)}.unity"); + + m_InitScene = SceneManager.GetActiveScene(); + yield return EditorSceneManager.LoadSceneAsyncInPlayMode(scenePath, new LoadSceneParameters(LoadSceneMode.Additive)); + Assert.That(m_TestScene.isLoaded, Is.True); + SceneManager.SetActiveScene(m_TestScene); + + const int setCount = k_ClientInstanceCount + 1; + + Assert.That(MultiInstanceHelpers.Create(k_ClientInstanceCount, out m_ServerNetworkManager, out m_ClientNetworkManagers)); + Assert.That(m_ServerNetworkManager, Is.Not.Null); + Assert.That(m_ClientNetworkManagers, Is.Not.Null); + Assert.That(m_ClientNetworkManagers.Length, Is.EqualTo(k_ClientInstanceCount)); + + m_Dude_NetObjs = new Transform[setCount]; + m_Dude_LeftArm_NetObjs = new Transform[setCount]; + m_Dude_RightArm_NetObjs = new Transform[setCount]; + m_Dude_LeftLeg_NetObjs = new Transform[setCount]; + m_Dude_RightLeg_NetObjs = new Transform[setCount]; + m_Cube_NetObjs = new Transform[setCount]; + m_Pickup_NetObjs = new Transform[setCount]; + m_Pickup_Back_NetObjs = new Transform[setCount]; + + var serverSet = m_TestScene.GetRootGameObjects().FirstOrDefault(g => g.name == "Set"); + Assert.That(serverSet, Is.Not.Null); + + SetupSet(serverSet.transform, 0, m_ServerNetworkManager); + serverSet.name = "Set0 (Server)"; + + for (int setIndex = 0; setIndex < k_ClientInstanceCount; setIndex++) + { + var clientSet = Object.Instantiate(serverSet); + SetupSet(clientSet.transform, setIndex + 1, m_ClientNetworkManagers[setIndex]); + clientSet.name = $"Set{setIndex + 1} (Client)"; + } + + // Start server and client NetworkManager instances + Assert.That(MultiInstanceHelpers.Start(false, m_ServerNetworkManager, m_ClientNetworkManagers)); + + // Wait for connection on client side + yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.WaitForClientsConnected(m_ClientNetworkManagers)); + + // Wait for connection on server side + yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.WaitForClientConnectedToServer(m_ServerNetworkManager)); + } + + public void SetupSet(Transform rootTransform, int setIndex, NetworkManager networkManager) + { + foreach (Transform childTransform0 in rootTransform) + { + if (childTransform0.name == "Dude (NetObj)") + { + m_Dude_NetObjs[setIndex] = childTransform0; + m_Dude_NetObjs[setIndex].GetComponent().NetworkManagerOwner = networkManager; + foreach (Transform childTransform1 in childTransform0) + { + if (childTransform1.name == "Arms") + { + foreach (Transform childTransform2 in childTransform1) + { + if (childTransform2.name == "LeftArm (NetObj)") + { + m_Dude_LeftArm_NetObjs[setIndex] = childTransform2; + m_Dude_LeftArm_NetObjs[setIndex].GetComponent().NetworkManagerOwner = networkManager; + } + else if (childTransform2.name == "RightArm (NetObj)") + { + m_Dude_RightArm_NetObjs[setIndex] = childTransform2; + m_Dude_RightArm_NetObjs[setIndex].GetComponent().NetworkManagerOwner = networkManager; + } + } + } + else if (childTransform1.name == "Legs") + { + foreach (Transform childTransform2 in childTransform1) + { + if (childTransform2.name == "LeftLeg (NetObj)") + { + m_Dude_LeftLeg_NetObjs[setIndex] = childTransform2; + m_Dude_LeftLeg_NetObjs[setIndex].GetComponent().NetworkManagerOwner = networkManager; + } + else if (childTransform2.name == "RightLeg (NetObj)") + { + m_Dude_RightLeg_NetObjs[setIndex] = childTransform2; + m_Dude_RightLeg_NetObjs[setIndex].GetComponent().NetworkManagerOwner = networkManager; + } + } + } + } + } + else if (childTransform0.name == "Cube (NetObj)") + { + m_Cube_NetObjs[setIndex] = childTransform0; + m_Cube_NetObjs[setIndex].GetComponent().NetworkManagerOwner = networkManager; + } + else if (childTransform0.name == "Pickup (NetObj)") + { + m_Pickup_NetObjs[setIndex] = childTransform0; + m_Pickup_NetObjs[setIndex].GetComponent().NetworkManagerOwner = networkManager; + foreach (Transform childTransform1 in childTransform0) + { + if (childTransform1.name == "Body") + { + foreach (Transform childTransform2 in childTransform1) + { + if (childTransform2.name == "Back (NetObj)") + { + m_Pickup_Back_NetObjs[setIndex] = childTransform2; + m_Pickup_Back_NetObjs[setIndex].GetComponent().NetworkManagerOwner = networkManager; + } + } + } + } + } + } + + Assert.That(m_Dude_NetObjs[setIndex], Is.Not.Null); + Assert.That(m_Dude_LeftArm_NetObjs[setIndex], Is.Not.Null); + Assert.That(m_Dude_RightArm_NetObjs[setIndex], Is.Not.Null); + Assert.That(m_Dude_LeftLeg_NetObjs[setIndex], Is.Not.Null); + Assert.That(m_Dude_RightLeg_NetObjs[setIndex], Is.Not.Null); + Assert.That(m_Cube_NetObjs[setIndex], Is.Not.Null); + Assert.That(m_Pickup_NetObjs[setIndex], Is.Not.Null); + Assert.That(m_Pickup_Back_NetObjs[setIndex], Is.Not.Null); + + LogAssert.Expect(LogType.Exception, new Regex("start a server or host", RegexOptions.IgnoreCase)); + var cachedParent = m_Cube_NetObjs[setIndex].parent; + m_Cube_NetObjs[setIndex].parent = m_Pickup_NetObjs[setIndex]; + Assert.That(m_Cube_NetObjs[setIndex].parent, Is.EqualTo(cachedParent)); + } + + [UnityTearDown] + public IEnumerator Teardown() + { + SceneManager.sceneLoaded -= OnSceneLoaded; + + MultiInstanceHelpers.Destroy(); + + if (m_TestScene.isLoaded) + { + yield return SceneManager.UnloadSceneAsync(m_TestScene); + SceneManager.SetActiveScene(m_InitScene); + } + } + + [UnityTest] + public IEnumerator SetParentDirect() + { + // Server: Set/Cube -> Set/Pickup/Back/Cube + m_Cube_NetObjs[0].parent = m_Pickup_Back_NetObjs[0]; + + int nextFrameNumber = Time.frameCount + 2; + yield return new WaitUntil(() => Time.frameCount >= nextFrameNumber); + + // Client[n]: Set/Cube -> Set/Pickup/Back/Cube + for (int setIndex = 0; setIndex < k_ClientInstanceCount; setIndex++) + { + Assert.That(m_Cube_NetObjs[setIndex + 1].parent, Is.EqualTo(m_Pickup_Back_NetObjs[setIndex + 1])); + } + + + // Server: Set/Pickup/Back -> Root/Cube + m_Cube_NetObjs[0].parent = null; + + nextFrameNumber = Time.frameCount + 2; + yield return new WaitUntil(() => Time.frameCount >= nextFrameNumber); + + // Client[n]: Set/Pickup/Back -> Root/Cube + for (int setIndex = 0; setIndex < k_ClientInstanceCount; setIndex++) + { + Assert.That(m_Cube_NetObjs[setIndex + 1].parent, Is.EqualTo(null)); + } + + + // Server: Root/Cube -> Set/Dude/Arms/RightArm/Cube + m_Cube_NetObjs[0].parent = m_Dude_RightArm_NetObjs[0]; + + nextFrameNumber = Time.frameCount + 2; + yield return new WaitUntil(() => Time.frameCount >= nextFrameNumber); + + // Client[n]: Root/Cube -> Set/Dude/Arms/RightArm/Cube + for (int setIndex = 0; setIndex < k_ClientInstanceCount; setIndex++) + { + Assert.That(m_Cube_NetObjs[setIndex + 1].parent, Is.EqualTo(m_Dude_RightArm_NetObjs[setIndex + 1])); + } + } + + [UnityTest] + public IEnumerator SetParentTryAPI() + { + // Try(Cube -> MainCamera/Cube): false + var serverCachedParent = m_Cube_NetObjs[0].parent; + var clientCachedParents = new Transform[k_ClientInstanceCount]; + for (int setIndex = 0; setIndex < k_ClientInstanceCount; setIndex++) + { + clientCachedParents[setIndex] = m_Cube_NetObjs[setIndex + 1].parent; + } + + Assert.That(!m_Cube_NetObjs[0].GetComponent().TrySetParent(Camera.main.transform)); + + int nextFrameNumber = Time.frameCount + 2; + yield return new WaitUntil(() => Time.frameCount >= nextFrameNumber); + + Assert.That(m_Cube_NetObjs[0].parent, Is.EqualTo(serverCachedParent)); + for (int setIndex = 0; setIndex < k_ClientInstanceCount; setIndex++) + { + Assert.That(m_Cube_NetObjs[setIndex + 1].parent, Is.EqualTo(clientCachedParents[setIndex])); + } + + + // Try(Cube -> Set/Dude/Arms/LeftArm/Cube): true + Assert.That(m_Cube_NetObjs[0].GetComponent().TrySetParent(m_Dude_LeftArm_NetObjs[0])); + + nextFrameNumber = Time.frameCount + 2; + yield return new WaitUntil(() => Time.frameCount >= nextFrameNumber); + + for (int setIndex = 0; setIndex < k_ClientInstanceCount; setIndex++) + { + Assert.That(m_Cube_NetObjs[setIndex + 1].parent, Is.EqualTo(m_Dude_LeftArm_NetObjs[setIndex + 1])); + } + } + } +} diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs.meta b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs.meta new file mode 100644 index 0000000000..bcd376301e --- /dev/null +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ee0fd7f2f6c544c59849f815c90128b5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.unity b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.unity new file mode 100644 index 0000000000..ecda48b32e --- /dev/null +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.unity @@ -0,0 +1,2214 @@ +%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.44657874, g: 0.49641275, b: 0.5748172, 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: 0} +--- !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 &126426935 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 126426939} + - component: {fileID: 126426938} + - component: {fileID: 126426937} + - component: {fileID: 126426936} + m_Layer: 0 + m_Name: Ground + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!64 &126426936 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 126426935} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 4 + m_Convex: 0 + m_CookingOptions: 30 + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &126426937 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 126426935} + 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: 03e094ab168544996a7d1d6dcdc60058, 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 &126426938 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 126426935} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &126426939 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 126426935} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 10, y: 1, z: 10} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &136229882 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 136229883} + - component: {fileID: 136229886} + - component: {fileID: 136229885} + - component: {fileID: 136229884} + - component: {fileID: 136229887} + m_Layer: 0 + m_Name: LeftArm (NetObj) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &136229883 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 136229882} + m_LocalRotation: {x: 0, y: 0, z: 0.13052616, w: 0.9914449} + m_LocalPosition: {x: 0.6, y: 0.2, z: 0} + m_LocalScale: {x: 0.3, y: 0.8, z: 0.3} + m_Children: [] + m_Father: {fileID: 1233633000} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 15} +--- !u!136 &136229884 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 136229882} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + m_Radius: 0.5 + m_Height: 2 + m_Direction: 1 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &136229885 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 136229882} + 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: 10303, guid: 0000000000000000f000000000000000, 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!33 &136229886 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 136229882} + m_Mesh: {fileID: 10208, guid: 0000000000000000e000000000000000, type: 0} +--- !u!114 &136229887 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 136229882} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} + m_Name: + m_EditorClassIdentifier: + GlobalObjectIdHash: 1291518364 + AlwaysReplicateAsRoot: 0 + DontDestroyWithOwner: 0 + AutoObjectParentSync: 1 +--- !u!1 &223562595 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 223562596} + m_Layer: 0 + m_Name: Legs + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &223562596 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 223562595} + 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: 877191011} + - {fileID: 1646178338} + m_Father: {fileID: 753527895} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &249733529 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 249733530} + - component: {fileID: 249733533} + - component: {fileID: 249733532} + - component: {fileID: 249733531} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &249733530 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 249733529} + m_LocalRotation: {x: -0.42261827, y: 0, z: 0, w: 0.9063079} + m_LocalPosition: {x: 0, y: 1.25, z: 2.5} + m_LocalScale: {x: 4, y: 2.3, z: 1} + m_Children: [] + m_Father: {fileID: 1904043517} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: -50, y: 0, z: 0} +--- !u!65 &249733531 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 249733529} + 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 &249733532 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 249733529} + 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: 52c34e1beacd44c9bb0f6375c891b4cf, 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 &249733533 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 249733529} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &305396494 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 305396495} + - component: {fileID: 305396498} + - component: {fileID: 305396497} + - component: {fileID: 305396496} + m_Layer: 0 + m_Name: Sphere + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &305396495 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 305396494} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.1, y: 0.1, z: 0.1} + m_Children: [] + m_Father: {fileID: 2027339602} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!135 &305396496 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 305396494} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &305396497 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 305396494} + 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: 10303, guid: 0000000000000000f000000000000000, 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!33 &305396498 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 305396494} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &453914372 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 453914373} + - component: {fileID: 453914376} + - component: {fileID: 453914375} + - component: {fileID: 453914374} + - component: {fileID: 453914377} + m_Layer: 0 + m_Name: RightArm (NetObj) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &453914373 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 453914372} + m_LocalRotation: {x: 0, y: 0, z: -0.13052624, w: 0.9914449} + m_LocalPosition: {x: -0.6, y: 0.2, z: 0} + m_LocalScale: {x: 0.3, y: 0.8, z: 0.3} + m_Children: [] + m_Father: {fileID: 1233633000} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: -15} +--- !u!136 &453914374 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 453914372} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + m_Radius: 0.5 + m_Height: 2 + m_Direction: 1 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &453914375 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 453914372} + 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: 10303, guid: 0000000000000000f000000000000000, 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!33 &453914376 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 453914372} + m_Mesh: {fileID: 10208, guid: 0000000000000000e000000000000000, type: 0} +--- !u!114 &453914377 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 453914372} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} + m_Name: + m_EditorClassIdentifier: + GlobalObjectIdHash: 2501551336 + AlwaysReplicateAsRoot: 0 + DontDestroyWithOwner: 0 + AutoObjectParentSync: 1 +--- !u!1 &534941258 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 534941259} + - component: {fileID: 534941262} + - component: {fileID: 534941261} + - component: {fileID: 534941260} + m_Layer: 0 + m_Name: FrontRightWheel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &534941259 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 534941258} + m_LocalRotation: {x: 0, y: 0, z: 0.7071068, w: 0.7071068} + m_LocalPosition: {x: 2.5, y: -1, z: 3.5} + m_LocalScale: {x: 2, y: 0.5, z: 2} + m_Children: [] + m_Father: {fileID: 1095337960} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 90} +--- !u!136 &534941260 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 534941258} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + m_Radius: 0.5000001 + m_Height: 2 + m_Direction: 1 + m_Center: {x: 0.000000059604645, y: 0, z: -0.00000008940697} +--- !u!23 &534941261 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 534941258} + 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: 10303, guid: 0000000000000000f000000000000000, 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!33 &534941262 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 534941258} + m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &590215650 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 590215651} + - component: {fileID: 590215654} + - component: {fileID: 590215653} + - component: {fileID: 590215652} + m_Layer: 0 + m_Name: BackRightWheel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &590215651 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 590215650} + m_LocalRotation: {x: 0, y: 0, z: 0.7071068, w: 0.7071068} + m_LocalPosition: {x: 2.5, y: -1, z: -3.5} + m_LocalScale: {x: 2, y: 0.5, z: 2} + m_Children: [] + m_Father: {fileID: 1095337960} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 90} +--- !u!136 &590215652 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 590215650} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + m_Radius: 0.5000001 + m_Height: 2 + m_Direction: 1 + m_Center: {x: 0.000000059604645, y: 0, z: -0.00000008940697} +--- !u!23 &590215653 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 590215650} + 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: 10303, guid: 0000000000000000f000000000000000, 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!33 &590215654 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 590215650} + m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &598123439 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 598123441} + - component: {fileID: 598123440} + m_Layer: 0 + m_Name: DirectionalLight + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &598123440 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 598123439} + 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 &598123441 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 598123439} + 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!1 &753527891 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 753527895} + - component: {fileID: 753527894} + - component: {fileID: 753527893} + - component: {fileID: 753527892} + - component: {fileID: 753527896} + m_Layer: 0 + m_Name: Dude (NetObj) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!136 &753527892 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 753527891} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + m_Radius: 0.5 + m_Height: 2 + m_Direction: 1 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &753527893 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 753527891} + 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: 10303, guid: 0000000000000000f000000000000000, 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!33 &753527894 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 753527891} + m_Mesh: {fileID: 10208, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &753527895 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 753527891} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 779041968} + - {fileID: 1233633000} + - {fileID: 223562596} + m_Father: {fileID: 1618484849} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &753527896 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 753527891} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} + m_Name: + m_EditorClassIdentifier: + GlobalObjectIdHash: 3039817976 + AlwaysReplicateAsRoot: 0 + DontDestroyWithOwner: 0 + AutoObjectParentSync: 1 +--- !u!1 &779041967 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 779041968} + - component: {fileID: 779041971} + - component: {fileID: 779041970} + - component: {fileID: 779041969} + m_Layer: 0 + m_Name: Head + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &779041968 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 779041967} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1.4, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 753527895} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!135 &779041969 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 779041967} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &779041970 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 779041967} + 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: 10303, guid: 0000000000000000f000000000000000, 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!33 &779041971 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 779041967} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &877191010 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 877191011} + - component: {fileID: 877191015} + - component: {fileID: 877191014} + - component: {fileID: 877191013} + - component: {fileID: 877191012} + m_Layer: 0 + m_Name: LeftLeg (NetObj) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &877191011 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 877191010} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.3, y: -1.4, z: 0} + m_LocalScale: {x: 0.30000004, y: 0.8, z: 0.3} + m_Children: [] + m_Father: {fileID: 223562596} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &877191012 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 877191010} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} + m_Name: + m_EditorClassIdentifier: + GlobalObjectIdHash: 4012496145 + AlwaysReplicateAsRoot: 0 + DontDestroyWithOwner: 0 + AutoObjectParentSync: 1 +--- !u!136 &877191013 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 877191010} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + m_Radius: 0.5 + m_Height: 2 + m_Direction: 1 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &877191014 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 877191010} + 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: 10303, guid: 0000000000000000f000000000000000, 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!33 &877191015 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 877191010} + m_Mesh: {fileID: 10208, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1042922634 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1042922635} + - component: {fileID: 1042922638} + - component: {fileID: 1042922637} + - component: {fileID: 1042922636} + m_Layer: 0 + m_Name: BackLeftWheel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1042922635 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1042922634} + m_LocalRotation: {x: 0, y: 0, z: 0.7071068, w: 0.7071068} + m_LocalPosition: {x: -2.5, y: -1, z: -3.5} + m_LocalScale: {x: 2, y: 0.5, z: 2} + m_Children: [] + m_Father: {fileID: 1095337960} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 90} +--- !u!136 &1042922636 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1042922634} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + m_Radius: 0.5000001 + m_Height: 2 + m_Direction: 1 + m_Center: {x: 0.000000059604645, y: 0, z: -0.00000008940697} +--- !u!23 &1042922637 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1042922634} + 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: 10303, guid: 0000000000000000f000000000000000, 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!33 &1042922638 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1042922634} + m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1095337959 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1095337960} + m_Layer: 0 + m_Name: Wheels + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1095337960 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1095337959} + 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: 2102441317} + - {fileID: 534941259} + - {fileID: 1042922635} + - {fileID: 590215651} + m_Father: {fileID: 1907713851} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1139821555 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1139821556} + - component: {fileID: 1139821559} + - component: {fileID: 1139821558} + - component: {fileID: 1139821557} + m_Layer: 0 + m_Name: Main + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1139821556 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1139821555} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 5, y: 2, z: 10} + m_Children: [] + m_Father: {fileID: 1904043517} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &1139821557 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1139821555} + 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 &1139821558 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1139821555} + 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: 52c34e1beacd44c9bb0f6375c891b4cf, 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 &1139821559 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1139821555} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1233632999 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1233633000} + m_Layer: 0 + m_Name: Arms + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1233633000 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1233632999} + 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: 136229883} + - {fileID: 453914373} + m_Father: {fileID: 753527895} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1346726830 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1346726835} + - component: {fileID: 1346726834} + - component: {fileID: 1346726833} + - component: {fileID: 1346726832} + - component: {fileID: 1346726831} + m_Layer: 0 + m_Name: Cube (NetObj) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1346726831 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1346726830} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} + m_Name: + m_EditorClassIdentifier: + GlobalObjectIdHash: 4270594269 + AlwaysReplicateAsRoot: 0 + DontDestroyWithOwner: 0 + AutoObjectParentSync: 1 +--- !u!65 &1346726832 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1346726830} + 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 &1346726833 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1346726830} + 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: d8e0487da5b3d4659909d18d138cff5a, 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 &1346726834 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1346726830} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &1346726835 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1346726830} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 3, y: 0.5, z: 3} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1618484849} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1463134322 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1463134325} + - component: {fileID: 1463134324} + - component: {fileID: 1463134323} + m_Layer: 0 + m_Name: MainCamera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &1463134323 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1463134322} + m_Enabled: 1 +--- !u!20 &1463134324 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1463134322} + 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 &1463134325 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1463134322} + m_LocalRotation: {x: 0.2588191, y: 0, z: 0, w: 0.9659258} + m_LocalPosition: {x: 0, y: 10, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 30, y: 0, z: 0} +--- !u!1 &1522146278 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1522146279} + - component: {fileID: 1522146282} + - component: {fileID: 1522146281} + - component: {fileID: 1522146280} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1522146279 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1522146278} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1.75, z: 1} + m_LocalScale: {x: 4.5, y: 1.5, z: 2} + m_Children: [] + m_Father: {fileID: 1904043517} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &1522146280 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1522146278} + 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 &1522146281 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1522146278} + 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: 52c34e1beacd44c9bb0f6375c891b4cf, 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 &1522146282 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1522146278} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1618484848 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1618484849} + m_Layer: 0 + m_Name: Set + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1618484849 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1618484848} + 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: 753527895} + - {fileID: 1346726835} + - {fileID: 1907713851} + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1646178337 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1646178338} + - component: {fileID: 1646178342} + - component: {fileID: 1646178341} + - component: {fileID: 1646178340} + - component: {fileID: 1646178339} + m_Layer: 0 + m_Name: RightLeg (NetObj) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1646178338 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1646178337} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -0.3, y: -1.4, z: 0} + m_LocalScale: {x: 0.30000004, y: 0.8, z: 0.3} + m_Children: [] + m_Father: {fileID: 223562596} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1646178339 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1646178337} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} + m_Name: + m_EditorClassIdentifier: + GlobalObjectIdHash: 1239503228 + AlwaysReplicateAsRoot: 0 + DontDestroyWithOwner: 0 + AutoObjectParentSync: 1 +--- !u!136 &1646178340 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1646178337} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + m_Radius: 0.5 + m_Height: 2 + m_Direction: 1 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &1646178341 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1646178337} + 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: 10303, guid: 0000000000000000f000000000000000, 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!33 &1646178342 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1646178337} + m_Mesh: {fileID: 10208, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1904043516 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1904043517} + m_Layer: 0 + m_Name: Body + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1904043517 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1904043516} + 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: 1139821556} + - {fileID: 1522146279} + - {fileID: 249733530} + - {fileID: 2027339602} + m_Father: {fileID: 1907713851} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1907713849 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1907713851} + - component: {fileID: 1907713850} + m_Layer: 0 + m_Name: Pickup (NetObj) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1907713850 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1907713849} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} + m_Name: + m_EditorClassIdentifier: + GlobalObjectIdHash: 2387167595 + AlwaysReplicateAsRoot: 0 + DontDestroyWithOwner: 0 + AutoObjectParentSync: 1 +--- !u!4 &1907713851 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1907713849} + m_LocalRotation: {x: -0, y: 0.5, z: -0, w: 0.8660254} + m_LocalPosition: {x: 0, y: 2, z: 10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1904043517} + - {fileID: 1095337960} + m_Father: {fileID: 1618484849} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 60, z: 0} +--- !u!1 &2027339601 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2027339602} + - component: {fileID: 2027339603} + m_Layer: 0 + m_Name: Back (NetObj) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2027339602 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2027339601} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: -2} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 305396495} + m_Father: {fileID: 1904043517} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &2027339603 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2027339601} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} + m_Name: + m_EditorClassIdentifier: + GlobalObjectIdHash: 805918072 + AlwaysReplicateAsRoot: 0 + DontDestroyWithOwner: 0 + AutoObjectParentSync: 1 +--- !u!1 &2102441316 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2102441317} + - component: {fileID: 2102441320} + - component: {fileID: 2102441319} + - component: {fileID: 2102441318} + m_Layer: 0 + m_Name: FrontLeftWheel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2102441317 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2102441316} + m_LocalRotation: {x: 0, y: 0, z: 0.7071068, w: 0.7071068} + m_LocalPosition: {x: -2.5, y: -1, z: 3.5} + m_LocalScale: {x: 2, y: 0.5, z: 2} + m_Children: [] + m_Father: {fileID: 1095337960} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 90} +--- !u!136 &2102441318 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2102441316} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + m_Radius: 0.5000001 + m_Height: 2 + m_Direction: 1 + m_Center: {x: 0.000000059604645, y: 0, z: -0.00000008940697} +--- !u!23 &2102441319 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2102441316} + 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: 10303, guid: 0000000000000000f000000000000000, 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!33 &2102441320 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2102441316} + m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.unity.meta b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.unity.meta new file mode 100644 index 0000000000..73144b7868 --- /dev/null +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 7522f8723c5674939a3c24acfd83a688 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/PlayerPrefab.prefab b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/PlayerPrefab.prefab new file mode 100644 index 0000000000..d326e03f6f --- /dev/null +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/PlayerPrefab.prefab @@ -0,0 +1,49 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &8133991607019124060 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8133991607019124062} + - component: {fileID: 8133991607019124063} + m_Layer: 0 + m_Name: GhostPlayer + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &8133991607019124062 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8133991607019124060} + 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: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &8133991607019124063 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8133991607019124060} + 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: 1 diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/PlayerPrefab.prefab.meta b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/PlayerPrefab.prefab.meta new file mode 100644 index 0000000000..c0781023b2 --- /dev/null +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/PlayerPrefab.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 421bcf732fe69486d8abecfa5eee63bb +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: From e3f43cb7d750b5c49a2c927ecbe37f5b79675d85 Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Sat, 5 Jun 2021 04:38:23 +0100 Subject: [PATCH 20/44] ./standards.py --fix --- .../Runtime/NetworkVariable/NetworkVariable.cs | 2 +- .../Profiling/InternalMessageHandlerProfilingDecorator.cs | 8 ++++---- .../Tests/Editor/DummyMessageHandler.cs | 4 ++-- .../InternalMessageHandlerProfilingDecoratorTests.cs | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/com.unity.multiplayer.mlapi/Runtime/NetworkVariable/NetworkVariable.cs b/com.unity.multiplayer.mlapi/Runtime/NetworkVariable/NetworkVariable.cs index 42016b0e77..d8fcd4b3fc 100644 --- a/com.unity.multiplayer.mlapi/Runtime/NetworkVariable/NetworkVariable.cs +++ b/com.unity.multiplayer.mlapi/Runtime/NetworkVariable/NetworkVariable.cs @@ -204,7 +204,7 @@ public void ReadField(Stream stream) /// public void WriteField(Stream stream) { - using (var writer = PooledNetworkWriter.Get(stream)) + using (var writer = PooledNetworkWriter.Get(stream)) { writer.WriteObjectPacked(m_InternalValue); //BOX } diff --git a/com.unity.multiplayer.mlapi/Runtime/Profiling/InternalMessageHandlerProfilingDecorator.cs b/com.unity.multiplayer.mlapi/Runtime/Profiling/InternalMessageHandlerProfilingDecorator.cs index 2613a2d70e..b3c76d30b1 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Profiling/InternalMessageHandlerProfilingDecorator.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Profiling/InternalMessageHandlerProfilingDecorator.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using MLAPI.Messaging; using MLAPI.Messaging.Buffering; @@ -25,9 +25,9 @@ internal class InternalMessageHandlerProfilingDecorator : IInternalMessageHandle private readonly ProfilerMarker m_RpcReceiveQueueItemServerRpc = new ProfilerMarker($"{nameof(InternalMessageHandler)}.{nameof(RpcReceiveQueueItem)}.{nameof(RpcQueueContainer.QueueItemType.ServerRpc)}"); private readonly ProfilerMarker m_RpcReceiveQueueItemClientRpc = new ProfilerMarker($"{nameof(InternalMessageHandler)}.{nameof(RpcReceiveQueueItem)}.{nameof(RpcQueueContainer.QueueItemType.ClientRpc)}"); private readonly ProfilerMarker m_HandleAllClientsSwitchSceneCompleted = new ProfilerMarker($"{nameof(InternalMessageHandler)}.{nameof(HandleAllClientsSwitchSceneCompleted)}"); - + private readonly IInternalMessageHandler m_MessageHandler; - + internal InternalMessageHandlerProfilingDecorator(IInternalMessageHandler messageHandler) { m_MessageHandler = messageHandler; @@ -195,4 +195,4 @@ public void HandleAllClientsSwitchSceneCompleted(ulong clientId, Stream stream) m_HandleAllClientsSwitchSceneCompleted.End(); } } -} \ No newline at end of file +} diff --git a/com.unity.multiplayer.mlapi/Tests/Editor/DummyMessageHandler.cs b/com.unity.multiplayer.mlapi/Tests/Editor/DummyMessageHandler.cs index 54f9d94f22..f6a28be50f 100644 --- a/com.unity.multiplayer.mlapi/Tests/Editor/DummyMessageHandler.cs +++ b/com.unity.multiplayer.mlapi/Tests/Editor/DummyMessageHandler.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using MLAPI.Messaging; using MLAPI.Messaging.Buffering; @@ -49,4 +49,4 @@ private void VerifyCalled(string method) Debug.Log(method); } } -} \ No newline at end of file +} diff --git a/com.unity.multiplayer.mlapi/Tests/Editor/Profiling/InternalMessageHandlerProfilingDecoratorTests.cs b/com.unity.multiplayer.mlapi/Tests/Editor/Profiling/InternalMessageHandlerProfilingDecoratorTests.cs index 2d60f99b09..bbe369642c 100644 --- a/com.unity.multiplayer.mlapi/Tests/Editor/Profiling/InternalMessageHandlerProfilingDecoratorTests.cs +++ b/com.unity.multiplayer.mlapi/Tests/Editor/Profiling/InternalMessageHandlerProfilingDecoratorTests.cs @@ -1,4 +1,4 @@ -using MLAPI.Messaging; +using MLAPI.Messaging; using MLAPI.Profiling; using NUnit.Framework; using UnityEngine; @@ -144,4 +144,4 @@ public void HandleAllClientsSwitchSceneCompleted() LogAssert.Expect(LogType.Log, nameof(m_Decorator.HandleAllClientsSwitchSceneCompleted)); } } -} \ No newline at end of file +} From ca90125f0e06c826db16fbcb89b8ef67a1b4c36a Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Sat, 5 Jun 2021 04:42:53 +0100 Subject: [PATCH 21/44] revert SampleScene changes --- testproject/Assets/Scenes/SampleScene.unity | 1063 ++----------------- 1 file changed, 85 insertions(+), 978 deletions(-) diff --git a/testproject/Assets/Scenes/SampleScene.unity b/testproject/Assets/Scenes/SampleScene.unity index 56b44530b5..ffab3054a2 100644 --- a/testproject/Assets/Scenes/SampleScene.unity +++ b/testproject/Assets/Scenes/SampleScene.unity @@ -377,199 +377,6 @@ Transform: m_Father: {fileID: 1815329520} m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &384254998 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 384254999} - - component: {fileID: 384255000} - - component: {fileID: 384255001} - - component: {fileID: 384255002} - - component: {fileID: 384255003} - m_Layer: 0 - m_Name: NetworkDevDebug (NetObj) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &384254999 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 384254998} - 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: 0} - m_RootOrder: 15 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &384255000 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 384254998} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 0df54db83472e4dca9a001e0695d645e, type: 3} - m_Name: - m_EditorClassIdentifier: - SourceToMove: {fileID: 920644580} ---- !u!114 &384255001 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 384254998} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} - m_Name: - m_EditorClassIdentifier: - GlobalObjectIdHash: 348433834 - AlwaysReplicateAsRoot: 0 - DontDestroyWithOwner: 0 ---- !u!114 &384255002 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 384254998} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3} - m_Name: - m_EditorClassIdentifier: - TransformAuthority: 0 - FixedSendsPerSecond: 30 - InterpolatePosition: 1 - SnapDistance: 10 - InterpolateServer: 1 - MinMeters: 0.15 - MinDegrees: 1.5 - MinSize: 0.15 - Channel: 10 - m_UseLocal: - m_InternalValue: 0 ---- !u!96 &384255003 -TrailRenderer: - serializedVersion: 2 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 384254998} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 0 - m_LightProbeUsage: 0 - m_ReflectionProbeUsage: 0 - m_RayTracingMode: 0 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 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_Time: 5 - m_Parameters: - serializedVersion: 3 - widthMultiplier: 0.1 - widthCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - colorGradient: - serializedVersion: 2 - key0: {r: 1, g: 1, b: 1, a: 1} - key1: {r: 1, g: 1, b: 1, a: 1} - key2: {r: 0, g: 0, b: 0, a: 0} - key3: {r: 0, g: 0, b: 0, a: 0} - key4: {r: 0, g: 0, b: 0, a: 0} - key5: {r: 0, g: 0, b: 0, a: 0} - key6: {r: 0, g: 0, b: 0, a: 0} - key7: {r: 0, g: 0, b: 0, a: 0} - ctime0: 0 - ctime1: 65535 - ctime2: 0 - ctime3: 0 - ctime4: 0 - ctime5: 0 - ctime6: 0 - ctime7: 0 - atime0: 0 - atime1: 65535 - atime2: 0 - atime3: 0 - atime4: 0 - atime5: 0 - atime6: 0 - atime7: 0 - m_Mode: 0 - m_NumColorKeys: 2 - m_NumAlphaKeys: 2 - numCornerVertices: 0 - numCapVertices: 0 - alignment: 0 - textureMode: 0 - shadowBias: 0.5 - generateLightingData: 0 - m_MinVertexDistance: 0.1 - m_Autodestruct: 0 - m_Emitting: 1 --- !u!1 &402668297 GameObject: m_ObjectHideFlags: 0 @@ -782,36 +589,6 @@ BoxCollider: serializedVersion: 2 m_Size: {x: 1, y: 1, z: 1} m_Center: {x: 0, y: 0, z: 0} ---- !u!1 &445473726 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 445473727} - m_Layer: 0 - m_Name: Pivot - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &445473727 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 445473726} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 2, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 533513584} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &457860556 GameObject: m_ObjectHideFlags: 0 @@ -909,119 +686,6 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 457860556} m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &533513580 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 533513584} - - component: {fileID: 533513583} - - component: {fileID: 533513582} - - component: {fileID: 533513581} - - component: {fileID: 533513585} - m_Layer: 0 - m_Name: Sphere (NetObj) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!135 &533513581 -SphereCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 533513580} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - serializedVersion: 2 - m_Radius: 0.5 - m_Center: {x: 0, y: 0, z: 0} ---- !u!23 &533513582 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 533513580} - 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: 10303, guid: 0000000000000000f000000000000000, 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!33 &533513583 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 533513580} - m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} ---- !u!4 &533513584 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 533513580} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 3, y: 5, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 445473727} - m_Father: {fileID: 0} - m_RootOrder: 13 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &533513585 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 533513580} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} - m_Name: - m_EditorClassIdentifier: - GlobalObjectIdHash: 479816849 - AlwaysReplicateAsRoot: 0 - DontDestroyWithOwner: 0 --- !u!1 &535968794 GameObject: m_ObjectHideFlags: 0 @@ -1132,134 +796,37 @@ GameObject: m_Layer: 2 m_Name: Collider (0) m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &573144465 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 573144464} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -10, y: 3, z: 0} - m_LocalScale: {x: 10, y: 12, z: 10} - m_Children: [] - m_Father: {fileID: 367170261} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!65 &573144466 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 573144464} - 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!1 &589597413 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 589597414} - - component: {fileID: 589597417} - - component: {fileID: 589597416} - - component: {fileID: 589597415} - m_Layer: 0 - m_Name: Cube - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &589597414 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 589597413} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 2, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 2034182552} - m_Father: {fileID: 1840701983} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!65 &589597415 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 589597413} - 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 &589597416 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 589597413} - 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: 10303, guid: 0000000000000000f000000000000000, 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!33 &589597417 -MeshFilter: + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &573144465 +Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 589597413} - m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} + m_GameObject: {fileID: 573144464} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -10, y: 3, z: 0} + m_LocalScale: {x: 10, y: 12, z: 10} + m_Children: [] + m_Father: {fileID: 367170261} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &573144466 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 573144464} + 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!1 &620561609 GameObject: m_ObjectHideFlags: 0 @@ -2180,144 +1747,6 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 878759701} m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &920644580 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 920644585} - - component: {fileID: 920644584} - - component: {fileID: 920644583} - - component: {fileID: 920644582} - - component: {fileID: 920644581} - - component: {fileID: 920644586} - m_Layer: 0 - m_Name: Capsule (NetObj) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &920644581 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 920644580} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} - m_Name: - m_EditorClassIdentifier: - GlobalObjectIdHash: 3030285231 - AlwaysReplicateAsRoot: 0 - DontDestroyWithOwner: 0 ---- !u!136 &920644582 -CapsuleCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 920644580} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - m_Radius: 0.5 - m_Height: 2 - m_Direction: 1 - m_Center: {x: 0, y: 0, z: 0} ---- !u!23 &920644583 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 920644580} - 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: 10303, guid: 0000000000000000f000000000000000, 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!33 &920644584 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 920644580} - m_Mesh: {fileID: 10208, guid: 0000000000000000e000000000000000, type: 0} ---- !u!4 &920644585 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 920644580} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -3, y: 5, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 1134235528} - m_Father: {fileID: 0} - m_RootOrder: 14 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &920644586 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 920644580} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3} - m_Name: - m_EditorClassIdentifier: - TransformAuthority: 0 - FixedSendsPerSecond: 30 - InterpolatePosition: 1 - SnapDistance: 10 - InterpolateServer: 1 - MinMeters: 0.15 - MinDegrees: 1.5 - MinSize: 0.15 - Channel: 10 - m_UseLocal: - m_InternalValue: 0 --- !u!1 &963826002 GameObject: m_ObjectHideFlags: 0 @@ -2343,183 +1772,87 @@ GameObject: --- !u!4 &963826003 Transform: m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 963826002} - m_LocalRotation: {x: 0, y: 0.7071068, z: 0, w: 0.7071068} - m_LocalPosition: {x: 12.06, y: 0.68515396, z: -8.870045} - m_LocalScale: {x: 0.42366, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 11 - m_LocalEulerAnglesHint: {x: 0, y: 90, z: 0} ---- !u!114 &963826004 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 963826002} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 53eaad6aa77ed43acb8e4293f21f95b9, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!114 &963826005 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 963826002} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3} - m_Name: - m_EditorClassIdentifier: - TransformAuthority: 0 - FixedSendsPerSecond: 30 - InterpolatePosition: 1 - SnapDistance: 10 - InterpolateServer: 1 - MinMeters: 0.15 - MinDegrees: 1.5 - MinSize: 0.15 - Channel: 10 - m_UseLocal: - m_InternalValue: 0 ---- !u!114 &963826006 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 963826002} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} - m_Name: - m_EditorClassIdentifier: - GlobalObjectIdHash: 3972363333 - AlwaysReplicateAsRoot: 0 - DontDestroyWithOwner: 0 ---- !u!65 &963826007 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 963826002} - 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 &963826008 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 963826002} - 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: 10303, guid: 0000000000000000f000000000000000, 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!33 &963826009 -MeshFilter: + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 963826002} + m_LocalRotation: {x: 0, y: 0.7071068, z: 0, w: 0.7071068} + m_LocalPosition: {x: 12.06, y: 0.68515396, z: -8.870045} + m_LocalScale: {x: 0.42366, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 11 + m_LocalEulerAnglesHint: {x: 0, y: 90, z: 0} +--- !u!114 &963826004 +MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 963826002} - m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &1134235527 -GameObject: + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 53eaad6aa77ed43acb8e4293f21f95b9, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &963826005 +MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1134235528} - - component: {fileID: 1134235531} - - component: {fileID: 1134235530} - - component: {fileID: 1134235529} - m_Layer: 0 - m_Name: Sphere - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1134235528 -Transform: + m_GameObject: {fileID: 963826002} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3} + m_Name: + m_EditorClassIdentifier: + TransformAuthority: 0 + FixedSendsPerSecond: 30 + InterpolatePosition: 1 + SnapDistance: 10 + InterpolateServer: 1 + MinMeters: 0.15 + MinDegrees: 1.5 + MinSize: 0.15 + Channel: 10 + m_UseLocal: + m_InternalValue: 0 +--- !u!114 &963826006 +MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1134235527} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 2, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 920644585} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!135 &1134235529 -SphereCollider: + m_GameObject: {fileID: 963826002} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} + m_Name: + m_EditorClassIdentifier: + GlobalObjectIdHash: 3972363333 + AlwaysReplicateAsRoot: 0 + DontDestroyWithOwner: 0 +--- !u!65 &963826007 +BoxCollider: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1134235527} + m_GameObject: {fileID: 963826002} m_Material: {fileID: 0} m_IsTrigger: 0 m_Enabled: 1 serializedVersion: 2 - m_Radius: 0.5 + m_Size: {x: 1, y: 1, z: 1} m_Center: {x: 0, y: 0, z: 0} ---- !u!23 &1134235530 +--- !u!23 &963826008 MeshRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1134235527} + m_GameObject: {fileID: 963826002} m_Enabled: 1 m_CastShadows: 1 m_ReceiveShadows: 1 @@ -2555,14 +1888,14 @@ MeshRenderer: m_SortingLayer: 0 m_SortingOrder: 0 m_AdditionalVertexStreams: {fileID: 0} ---- !u!33 &1134235531 +--- !u!33 &963826009 MeshFilter: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1134235527} - m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} + m_GameObject: {fileID: 963826002} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} --- !u!1 &1202924672 GameObject: m_ObjectHideFlags: 0 @@ -3925,119 +3258,6 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1840701978 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1840701983} - - component: {fileID: 1840701982} - - component: {fileID: 1840701981} - - component: {fileID: 1840701980} - - component: {fileID: 1840701979} - m_Layer: 0 - m_Name: Cube (NetObj) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1840701979 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1840701978} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} - m_Name: - m_EditorClassIdentifier: - GlobalObjectIdHash: 4252323905 - AlwaysReplicateAsRoot: 0 - DontDestroyWithOwner: 0 ---- !u!65 &1840701980 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1840701978} - 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 &1840701981 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1840701978} - 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: 10303, guid: 0000000000000000f000000000000000, 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!33 &1840701982 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1840701978} - m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!4 &1840701983 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1840701978} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 5, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 589597414} - m_Father: {fileID: 0} - m_RootOrder: 12 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1001 &1928839749 PrefabInstance: m_ObjectHideFlags: 0 @@ -4157,119 +3377,6 @@ PrefabInstance: objectReference: {fileID: 0} m_RemovedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: d725b5588e1b956458798319e6541d84, type: 3} ---- !u!1 &2034182551 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2034182552} - - component: {fileID: 2034182556} - - component: {fileID: 2034182555} - - component: {fileID: 2034182554} - - component: {fileID: 2034182553} - m_Layer: 0 - m_Name: Cylinder (NetObj) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &2034182552 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2034182551} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 2, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 589597414} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &2034182553 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2034182551} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} - m_Name: - m_EditorClassIdentifier: - GlobalObjectIdHash: 1762784599 - AlwaysReplicateAsRoot: 0 - DontDestroyWithOwner: 0 ---- !u!136 &2034182554 -CapsuleCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2034182551} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - m_Radius: 0.5000001 - m_Height: 2 - m_Direction: 1 - m_Center: {x: 0.000000059604645, y: 0, z: -0.00000008940697} ---- !u!23 &2034182555 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2034182551} - 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: 10303, guid: 0000000000000000f000000000000000, 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!33 &2034182556 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2034182551} - m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} --- !u!1 &2036456027 GameObject: m_ObjectHideFlags: 0 @@ -4366,4 +3473,4 @@ MeshFilter: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2036456027} - m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} \ No newline at end of file From 43b6e0847ea81b06c2a560db64bb6e43d09fd05a Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Sat, 5 Jun 2021 04:44:35 +0100 Subject: [PATCH 22/44] revert SampleScene.unity changes --- testproject/Assets/Scenes/SampleScene.unity | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/testproject/Assets/Scenes/SampleScene.unity b/testproject/Assets/Scenes/SampleScene.unity index ffab3054a2..fa5231a972 100644 --- a/testproject/Assets/Scenes/SampleScene.unity +++ b/testproject/Assets/Scenes/SampleScene.unity @@ -3473,4 +3473,5 @@ MeshFilter: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2036456027} - m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} \ No newline at end of file + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} + \ No newline at end of file From 964a1cf6e2a6376d44ec5f5ce78ac46744a2d52f Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Sat, 5 Jun 2021 04:46:33 +0100 Subject: [PATCH 23/44] delete NetworkDevDebug script --- testproject/Assets/Scripts/NetworkDevDebug.cs | 43 ------------------- .../Assets/Scripts/NetworkDevDebug.cs.meta | 11 ----- 2 files changed, 54 deletions(-) delete mode 100644 testproject/Assets/Scripts/NetworkDevDebug.cs delete mode 100644 testproject/Assets/Scripts/NetworkDevDebug.cs.meta diff --git a/testproject/Assets/Scripts/NetworkDevDebug.cs b/testproject/Assets/Scripts/NetworkDevDebug.cs deleted file mode 100644 index 9eef73615d..0000000000 --- a/testproject/Assets/Scripts/NetworkDevDebug.cs +++ /dev/null @@ -1,43 +0,0 @@ -using MLAPI.Prototyping; -using UnityEngine; - -namespace MLAPI -{ - public class NetworkDevDebug : MonoBehaviour - { - public GameObject SourceToMove; - // public GameObject TargetToParent; - - private NetworkTransform m_NetworkTransform; - private Vector3 m_CachedPosition = Vector3.zero; - - private void Awake() - { - m_NetworkTransform = GetComponent(); - } - - private void Update() - { - if (Input.GetKeyDown(KeyCode.T)) - { - if (SourceToMove.transform.parent == transform) - { - SourceToMove.transform.parent = null; - SourceToMove.transform.position = m_CachedPosition; - } - else - { - m_CachedPosition = SourceToMove.transform.position; - SourceToMove.transform.parent = transform; - SourceToMove.transform.localPosition = Vector3.zero; - } - } - - if (m_NetworkTransform != null && m_NetworkTransform.CanUpdateTransform()) - { - transform.Translate(0, 0, Time.deltaTime * 4); // move forward - transform.Rotate(0, Time.deltaTime * 48, 0); // turn a little - } - } - } -} diff --git a/testproject/Assets/Scripts/NetworkDevDebug.cs.meta b/testproject/Assets/Scripts/NetworkDevDebug.cs.meta deleted file mode 100644 index 25c3130df1..0000000000 --- a/testproject/Assets/Scripts/NetworkDevDebug.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 0df54db83472e4dca9a001e0695d645e -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: From 8e2863ff383dc7e6cbcd8848ad0ca98b3b1b08dc Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Sat, 5 Jun 2021 05:17:40 +0100 Subject: [PATCH 24/44] implement ReparentingCubeNetBhv to track new NetworkObject parent in tests --- .../NetworkObjectParentingTests.cs | 19 ++++++++++++++++++- .../NetworkObjectParentingTests.unity | 13 +++++++++++++ .../ObjectParenting/ReparentingCubeNetBhv.cs | 12 ++++++++++++ .../ReparentingCubeNetBhv.cs.meta | 11 +++++++++++ 4 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/ReparentingCubeNetBhv.cs create mode 100644 com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/ReparentingCubeNetBhv.cs.meta diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs index 645eed9d9a..303e2b688c 100644 --- a/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs @@ -25,6 +25,7 @@ public class NetworkObjectParentingTests private Transform[] m_Dude_LeftLeg_NetObjs; private Transform[] m_Dude_RightLeg_NetObjs; private Transform[] m_Cube_NetObjs; + private ReparentingCubeNetBhv[] m_Cube_NetBhvs; private Transform[] m_Pickup_NetObjs; private Transform[] m_Pickup_Back_NetObjs; @@ -66,6 +67,7 @@ public IEnumerator Setup() m_Dude_LeftLeg_NetObjs = new Transform[setCount]; m_Dude_RightLeg_NetObjs = new Transform[setCount]; m_Cube_NetObjs = new Transform[setCount]; + m_Cube_NetBhvs = new ReparentingCubeNetBhv[setCount]; m_Pickup_NetObjs = new Transform[setCount]; m_Pickup_Back_NetObjs = new Transform[setCount]; @@ -139,7 +141,12 @@ public void SetupSet(Transform rootTransform, int setIndex, NetworkManager netwo else if (childTransform0.name == "Cube (NetObj)") { m_Cube_NetObjs[setIndex] = childTransform0; - m_Cube_NetObjs[setIndex].GetComponent().NetworkManagerOwner = networkManager; + + var networkObject = childTransform0.GetComponent(); + var networkBehaviour = childTransform0.GetComponent(); + + networkObject.NetworkManagerOwner = networkManager; + m_Cube_NetBhvs[setIndex] = networkBehaviour; } else if (childTransform0.name == "Pickup (NetObj)") { @@ -168,6 +175,8 @@ public void SetupSet(Transform rootTransform, int setIndex, NetworkManager netwo Assert.That(m_Dude_LeftLeg_NetObjs[setIndex], Is.Not.Null); Assert.That(m_Dude_RightLeg_NetObjs[setIndex], Is.Not.Null); Assert.That(m_Cube_NetObjs[setIndex], Is.Not.Null); + Assert.That(m_Cube_NetBhvs[setIndex], Is.Not.Null); + Assert.That(m_Cube_NetBhvs[setIndex].ParentNetworkObject, Is.Null); Assert.That(m_Pickup_NetObjs[setIndex], Is.Not.Null); Assert.That(m_Pickup_Back_NetObjs[setIndex], Is.Not.Null); @@ -196,6 +205,7 @@ public IEnumerator SetParentDirect() { // Server: Set/Cube -> Set/Pickup/Back/Cube m_Cube_NetObjs[0].parent = m_Pickup_Back_NetObjs[0]; + Assert.That(m_Cube_NetBhvs[0].ParentNetworkObject, Is.EqualTo(m_Pickup_Back_NetObjs[0].GetComponent())); int nextFrameNumber = Time.frameCount + 2; yield return new WaitUntil(() => Time.frameCount >= nextFrameNumber); @@ -204,11 +214,13 @@ public IEnumerator SetParentDirect() for (int setIndex = 0; setIndex < k_ClientInstanceCount; setIndex++) { Assert.That(m_Cube_NetObjs[setIndex + 1].parent, Is.EqualTo(m_Pickup_Back_NetObjs[setIndex + 1])); + Assert.That(m_Cube_NetBhvs[setIndex + 1].ParentNetworkObject, Is.EqualTo(m_Pickup_Back_NetObjs[setIndex + 1].GetComponent())); } // Server: Set/Pickup/Back -> Root/Cube m_Cube_NetObjs[0].parent = null; + Assert.That(m_Cube_NetBhvs[0].ParentNetworkObject, Is.EqualTo(null)); nextFrameNumber = Time.frameCount + 2; yield return new WaitUntil(() => Time.frameCount >= nextFrameNumber); @@ -217,11 +229,13 @@ public IEnumerator SetParentDirect() for (int setIndex = 0; setIndex < k_ClientInstanceCount; setIndex++) { Assert.That(m_Cube_NetObjs[setIndex + 1].parent, Is.EqualTo(null)); + Assert.That(m_Cube_NetBhvs[setIndex + 1].ParentNetworkObject, Is.EqualTo(null)); } // Server: Root/Cube -> Set/Dude/Arms/RightArm/Cube m_Cube_NetObjs[0].parent = m_Dude_RightArm_NetObjs[0]; + Assert.That(m_Cube_NetBhvs[0].ParentNetworkObject, Is.EqualTo(m_Dude_RightArm_NetObjs[0].GetComponent())); nextFrameNumber = Time.frameCount + 2; yield return new WaitUntil(() => Time.frameCount >= nextFrameNumber); @@ -230,6 +244,7 @@ public IEnumerator SetParentDirect() for (int setIndex = 0; setIndex < k_ClientInstanceCount; setIndex++) { Assert.That(m_Cube_NetObjs[setIndex + 1].parent, Is.EqualTo(m_Dude_RightArm_NetObjs[setIndex + 1])); + Assert.That(m_Cube_NetBhvs[setIndex + 1].ParentNetworkObject, Is.EqualTo(m_Dude_RightArm_NetObjs[setIndex + 1].GetComponent())); } } @@ -258,6 +273,7 @@ public IEnumerator SetParentTryAPI() // Try(Cube -> Set/Dude/Arms/LeftArm/Cube): true Assert.That(m_Cube_NetObjs[0].GetComponent().TrySetParent(m_Dude_LeftArm_NetObjs[0])); + Assert.That(m_Cube_NetBhvs[0].ParentNetworkObject, Is.EqualTo(m_Dude_LeftArm_NetObjs[0].GetComponent())); nextFrameNumber = Time.frameCount + 2; yield return new WaitUntil(() => Time.frameCount >= nextFrameNumber); @@ -265,6 +281,7 @@ public IEnumerator SetParentTryAPI() for (int setIndex = 0; setIndex < k_ClientInstanceCount; setIndex++) { Assert.That(m_Cube_NetObjs[setIndex + 1].parent, Is.EqualTo(m_Dude_LeftArm_NetObjs[setIndex + 1])); + Assert.That(m_Cube_NetBhvs[setIndex + 1].ParentNetworkObject, Is.EqualTo(m_Dude_LeftArm_NetObjs[setIndex + 1].GetComponent())); } } } diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.unity b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.unity index ecda48b32e..7640744d8d 100644 --- a/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.unity +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.unity @@ -1558,6 +1558,7 @@ GameObject: - component: {fileID: 1346726833} - component: {fileID: 1346726832} - component: {fileID: 1346726831} + - component: {fileID: 1346726836} m_Layer: 0 m_Name: Cube (NetObj) m_TagString: Untagged @@ -1658,6 +1659,18 @@ Transform: m_Father: {fileID: 1618484849} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1346726836 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1346726830} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9b9fb5b91091c4036bb4b0321b79f6c8, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1 &1463134322 GameObject: m_ObjectHideFlags: 0 diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/ReparentingCubeNetBhv.cs b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/ReparentingCubeNetBhv.cs new file mode 100644 index 0000000000..2f0061a566 --- /dev/null +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/ReparentingCubeNetBhv.cs @@ -0,0 +1,12 @@ +namespace MLAPI.RuntimeTests +{ + public class ReparentingCubeNetBhv : NetworkBehaviour + { + public NetworkObject ParentNetworkObject { get; private set; } + + public override void OnNetworkObjectParentChanged(NetworkObject parentNetworkObject) + { + ParentNetworkObject = parentNetworkObject; + } + } +} diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/ReparentingCubeNetBhv.cs.meta b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/ReparentingCubeNetBhv.cs.meta new file mode 100644 index 0000000000..3d405245c3 --- /dev/null +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/ReparentingCubeNetBhv.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9b9fb5b91091c4036bb4b0321b79f6c8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From 26bc467c723edb6cc7c374ff82c56d367038d757 Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Sat, 5 Jun 2021 05:50:18 +0100 Subject: [PATCH 25/44] clarify namings --- .../Runtime/Core/NetworkObject.cs | 8 +++---- .../Runtime/Spawning/NetworkSpawnManager.cs | 24 +++++++++---------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs index c432ca6d1c..5cdeed2137 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs @@ -1001,9 +1001,9 @@ internal static NetworkObject DeserializeSceneObject(NetworkBuffer objectStream, parentNetworkId = reader.ReadUInt32Packed(); } - var isSceneObject = reader.ReadBool(); + bool isSceneObject = reader.ReadBool(); - var prefabHash = reader.ReadUInt32Packed(); + uint globalObjectIdHash = reader.ReadUInt32Packed(); Vector3? position = null; Quaternion? rotation = null; @@ -1017,7 +1017,7 @@ internal static NetworkObject DeserializeSceneObject(NetworkBuffer objectStream, var (isReparented, latestParent) = ReadNetworkParenting(reader); //Attempt to create a local NetworkObject - var networkObject = networkManager.SpawnManager.CreateLocalNetworkObject(isSceneObject, prefabHash, ownerClientId, parentNetworkId, position, rotation, isReparented); + var networkObject = networkManager.SpawnManager.CreateLocalNetworkObject(isSceneObject, globalObjectIdHash, ownerClientId, parentNetworkId, position, rotation, isReparented); networkObject?.SetNetworkParenting(isReparented, latestParent); @@ -1035,7 +1035,7 @@ internal static NetworkObject DeserializeSceneObject(NetworkBuffer objectStream, if (networkObject == null) { // Log the error that the NetworkObject failed to construct - Debug.LogError($"Failed to spawn {nameof(NetworkObject)} for Hash {prefabHash}."); + Debug.LogError($"Failed to spawn {nameof(NetworkObject)} for Hash {globalObjectIdHash}."); // If we failed to load this NetworkObject, then skip past the network variable data objectStream.Position += networkVariableDataSize; diff --git a/com.unity.multiplayer.mlapi/Runtime/Spawning/NetworkSpawnManager.cs b/com.unity.multiplayer.mlapi/Runtime/Spawning/NetworkSpawnManager.cs index 07bceb3209..86a92ad43c 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Spawning/NetworkSpawnManager.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Spawning/NetworkSpawnManager.cs @@ -158,7 +158,7 @@ internal void ChangeOwnership(NetworkObject networkObject, ulong clientId) /// /// Should only run on the client /// - internal NetworkObject CreateLocalNetworkObject(bool softCreate, uint prefabHash, ulong ownerClientId, ulong? parentNetworkId, Vector3? position, Quaternion? rotation, bool isReparented = false) + internal NetworkObject CreateLocalNetworkObject(bool isSceneObject, uint globalObjectIdHash, ulong ownerClientId, ulong? parentNetworkId, Vector3? position, Quaternion? rotation, bool isReparented = false) { NetworkObject parentNetworkObject = null; @@ -177,13 +177,13 @@ internal NetworkObject CreateLocalNetworkObject(bool softCreate, uint prefabHash } } - if (!NetworkManager.NetworkConfig.EnableSceneManagement || !softCreate) + if (!NetworkManager.NetworkConfig.EnableSceneManagement || !isSceneObject) { // If the prefab hash has a registered INetworkPrefabInstanceHandler derived class - if (NetworkManager.PrefabHandler.ContainsHandler(prefabHash)) + if (NetworkManager.PrefabHandler.ContainsHandler(globalObjectIdHash)) { // Let the handler spawn the NetworkObject - var networkObject = NetworkManager.PrefabHandler.HandleNetworkPrefabSpawn(prefabHash, ownerClientId, position.GetValueOrDefault(Vector3.zero), rotation.GetValueOrDefault(Quaternion.identity)); + var networkObject = NetworkManager.PrefabHandler.HandleNetworkPrefabSpawn(globalObjectIdHash, ownerClientId, position.GetValueOrDefault(Vector3.zero), rotation.GetValueOrDefault(Quaternion.identity)); if (parentNetworkObject != null) { @@ -201,17 +201,17 @@ internal NetworkObject CreateLocalNetworkObject(bool softCreate, uint prefabHash { // See if there is a valid registered NetworkPrefabOverrideLink associated with the provided prefabHash GameObject networkPrefabReference = null; - if (NetworkManager.NetworkConfig.NetworkPrefabOverrideLinks.ContainsKey(prefabHash)) + if (NetworkManager.NetworkConfig.NetworkPrefabOverrideLinks.ContainsKey(globalObjectIdHash)) { - switch (NetworkManager.NetworkConfig.NetworkPrefabOverrideLinks[prefabHash].Override) + switch (NetworkManager.NetworkConfig.NetworkPrefabOverrideLinks[globalObjectIdHash].Override) { default: case NetworkPrefabOverride.None: - networkPrefabReference = NetworkManager.NetworkConfig.NetworkPrefabOverrideLinks[prefabHash].Prefab; + networkPrefabReference = NetworkManager.NetworkConfig.NetworkPrefabOverrideLinks[globalObjectIdHash].Prefab; break; case NetworkPrefabOverride.Hash: case NetworkPrefabOverride.Prefab: - networkPrefabReference = NetworkManager.NetworkConfig.NetworkPrefabOverrideLinks[prefabHash].OverridingTargetPrefab; + networkPrefabReference = NetworkManager.NetworkConfig.NetworkPrefabOverrideLinks[globalObjectIdHash].OverridingTargetPrefab; break; } } @@ -221,7 +221,7 @@ internal NetworkObject CreateLocalNetworkObject(bool softCreate, uint prefabHash { if (NetworkLog.CurrentLogLevel <= LogLevel.Error) { - NetworkLog.LogError($"Failed to create object locally. [{nameof(prefabHash)}={prefabHash}]. {nameof(NetworkPrefab)} could not be found. Is the prefab registered with {nameof(NetworkManager)}?"); + NetworkLog.LogError($"Failed to create object locally. [{nameof(globalObjectIdHash)}={globalObjectIdHash}]. {nameof(NetworkPrefab)} could not be found. Is the prefab registered with {nameof(NetworkManager)}?"); } return null; } @@ -247,16 +247,16 @@ internal NetworkObject CreateLocalNetworkObject(bool softCreate, uint prefabHash else { // SoftSync them by mapping - if (!PendingSoftSyncObjects.TryGetValue(prefabHash, out NetworkObject networkObject)) + if (!PendingSoftSyncObjects.TryGetValue(globalObjectIdHash, out NetworkObject networkObject)) { if (NetworkLog.CurrentLogLevel <= LogLevel.Error) { - NetworkLog.LogError($"{nameof(NetworkPrefab)} hash was not found! In-Scene placed {nameof(NetworkObject)} soft synchronization failure for Hash: {prefabHash}!"); + NetworkLog.LogError($"{nameof(NetworkPrefab)} hash was not found! In-Scene placed {nameof(NetworkObject)} soft synchronization failure for Hash: {globalObjectIdHash}!"); } return null; } - PendingSoftSyncObjects.Remove(prefabHash); + PendingSoftSyncObjects.Remove(globalObjectIdHash); if (parentNetworkObject != null) { From d524131346cd7e76c638557d8188a73223708e28 Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Sat, 5 Jun 2021 08:18:05 +0100 Subject: [PATCH 26/44] compare InstanceIDs instead of Transforms --- .../ObjectParenting/NetworkObjectParentingTests.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs index 303e2b688c..8e8e2cb70a 100644 --- a/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs @@ -213,7 +213,7 @@ public IEnumerator SetParentDirect() // Client[n]: Set/Cube -> Set/Pickup/Back/Cube for (int setIndex = 0; setIndex < k_ClientInstanceCount; setIndex++) { - Assert.That(m_Cube_NetObjs[setIndex + 1].parent, Is.EqualTo(m_Pickup_Back_NetObjs[setIndex + 1])); + Assert.That(m_Cube_NetObjs[setIndex + 1].parent.GetInstanceID(), Is.EqualTo(m_Pickup_Back_NetObjs[setIndex + 1].GetInstanceID())); Assert.That(m_Cube_NetBhvs[setIndex + 1].ParentNetworkObject, Is.EqualTo(m_Pickup_Back_NetObjs[setIndex + 1].GetComponent())); } @@ -243,7 +243,7 @@ public IEnumerator SetParentDirect() // Client[n]: Root/Cube -> Set/Dude/Arms/RightArm/Cube for (int setIndex = 0; setIndex < k_ClientInstanceCount; setIndex++) { - Assert.That(m_Cube_NetObjs[setIndex + 1].parent, Is.EqualTo(m_Dude_RightArm_NetObjs[setIndex + 1])); + Assert.That(m_Cube_NetObjs[setIndex + 1].parent.GetInstanceID(), Is.EqualTo(m_Dude_RightArm_NetObjs[setIndex + 1].GetInstanceID())); Assert.That(m_Cube_NetBhvs[setIndex + 1].ParentNetworkObject, Is.EqualTo(m_Dude_RightArm_NetObjs[setIndex + 1].GetComponent())); } } @@ -264,10 +264,10 @@ public IEnumerator SetParentTryAPI() int nextFrameNumber = Time.frameCount + 2; yield return new WaitUntil(() => Time.frameCount >= nextFrameNumber); - Assert.That(m_Cube_NetObjs[0].parent, Is.EqualTo(serverCachedParent)); + Assert.That(m_Cube_NetObjs[0].parent.GetInstanceID(), Is.EqualTo(serverCachedParent.GetInstanceID())); for (int setIndex = 0; setIndex < k_ClientInstanceCount; setIndex++) { - Assert.That(m_Cube_NetObjs[setIndex + 1].parent, Is.EqualTo(clientCachedParents[setIndex])); + Assert.That(m_Cube_NetObjs[setIndex + 1].parent.GetInstanceID(), Is.EqualTo(clientCachedParents[setIndex].GetInstanceID())); } @@ -280,7 +280,7 @@ public IEnumerator SetParentTryAPI() for (int setIndex = 0; setIndex < k_ClientInstanceCount; setIndex++) { - Assert.That(m_Cube_NetObjs[setIndex + 1].parent, Is.EqualTo(m_Dude_LeftArm_NetObjs[setIndex + 1])); + Assert.That(m_Cube_NetObjs[setIndex + 1].parent.GetInstanceID(), Is.EqualTo(m_Dude_LeftArm_NetObjs[setIndex + 1].GetInstanceID())); Assert.That(m_Cube_NetBhvs[setIndex + 1].ParentNetworkObject, Is.EqualTo(m_Dude_LeftArm_NetObjs[setIndex + 1].GetComponent())); } } From 617c1bb056fec15502e76b7944bd5db4a7f6362f Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Sat, 5 Jun 2021 15:00:52 +0100 Subject: [PATCH 27/44] debug PrintHierarchy --- .../NetworkObjectParentingTests.cs | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs index 8e8e2cb70a..328cac4b7c 100644 --- a/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs @@ -213,7 +213,7 @@ public IEnumerator SetParentDirect() // Client[n]: Set/Cube -> Set/Pickup/Back/Cube for (int setIndex = 0; setIndex < k_ClientInstanceCount; setIndex++) { - Assert.That(m_Cube_NetObjs[setIndex + 1].parent.GetInstanceID(), Is.EqualTo(m_Pickup_Back_NetObjs[setIndex + 1].GetInstanceID())); + Assert.That(m_Cube_NetObjs[setIndex + 1].parent, Is.EqualTo(m_Pickup_Back_NetObjs[setIndex + 1])); Assert.That(m_Cube_NetBhvs[setIndex + 1].ParentNetworkObject, Is.EqualTo(m_Pickup_Back_NetObjs[setIndex + 1].GetComponent())); } @@ -243,7 +243,7 @@ public IEnumerator SetParentDirect() // Client[n]: Root/Cube -> Set/Dude/Arms/RightArm/Cube for (int setIndex = 0; setIndex < k_ClientInstanceCount; setIndex++) { - Assert.That(m_Cube_NetObjs[setIndex + 1].parent.GetInstanceID(), Is.EqualTo(m_Dude_RightArm_NetObjs[setIndex + 1].GetInstanceID())); + Assert.That(m_Cube_NetObjs[setIndex + 1].parent, Is.EqualTo(m_Dude_RightArm_NetObjs[setIndex + 1])); Assert.That(m_Cube_NetBhvs[setIndex + 1].ParentNetworkObject, Is.EqualTo(m_Dude_RightArm_NetObjs[setIndex + 1].GetComponent())); } } @@ -251,6 +251,9 @@ public IEnumerator SetParentDirect() [UnityTest] public IEnumerator SetParentTryAPI() { + Debug.Log($">>> {nameof(PrintHierarchy)}"); + m_TestScene.GetRootGameObjects().Select(g => g.transform).ToList().ForEach(t => PrintHierarchy(t)); + // Try(Cube -> MainCamera/Cube): false var serverCachedParent = m_Cube_NetObjs[0].parent; var clientCachedParents = new Transform[k_ClientInstanceCount]; @@ -271,6 +274,9 @@ public IEnumerator SetParentTryAPI() } + Debug.Log($">>> {nameof(PrintHierarchy)}"); + m_TestScene.GetRootGameObjects().Select(g => g.transform).ToList().ForEach(t => PrintHierarchy(t)); + // Try(Cube -> Set/Dude/Arms/LeftArm/Cube): true Assert.That(m_Cube_NetObjs[0].GetComponent().TrySetParent(m_Dude_LeftArm_NetObjs[0])); Assert.That(m_Cube_NetBhvs[0].ParentNetworkObject, Is.EqualTo(m_Dude_LeftArm_NetObjs[0].GetComponent())); @@ -283,6 +289,19 @@ public IEnumerator SetParentTryAPI() Assert.That(m_Cube_NetObjs[setIndex + 1].parent.GetInstanceID(), Is.EqualTo(m_Dude_LeftArm_NetObjs[setIndex + 1].GetInstanceID())); Assert.That(m_Cube_NetBhvs[setIndex + 1].ParentNetworkObject, Is.EqualTo(m_Dude_LeftArm_NetObjs[setIndex + 1].GetComponent())); } + + + Debug.Log($">>> {nameof(PrintHierarchy)}"); + m_TestScene.GetRootGameObjects().Select(g => g.transform).ToList().ForEach(t => PrintHierarchy(t)); + } + + private void PrintHierarchy(Transform rootTransform, int indentLevel = 1) + { + foreach (Transform childTransform in rootTransform) + { + Debug.Log($"{new string('\t', indentLevel)}{childTransform.name} [{childTransform.GetInstanceID()}]"); + PrintHierarchy(childTransform, indentLevel + 1); + } } } } From acbe66d1e0c9be648b24383a9e29f467c2bd72ab Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Sat, 5 Jun 2021 15:53:29 +0100 Subject: [PATCH 28/44] better log printing --- .../NetworkObjectParentingTests.cs | 35 ++++++++++++++----- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs index 328cac4b7c..469b2ae8f5 100644 --- a/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs @@ -2,6 +2,7 @@ using System.IO; using System.Linq; using System.Reflection; +using System.Text; using System.Text.RegularExpressions; using NUnit.Framework; using UnityEditor.PackageManager; @@ -251,8 +252,13 @@ public IEnumerator SetParentDirect() [UnityTest] public IEnumerator SetParentTryAPI() { - Debug.Log($">>> {nameof(PrintHierarchy)}"); - m_TestScene.GetRootGameObjects().Select(g => g.transform).ToList().ForEach(t => PrintHierarchy(t)); + var logBuilder = new StringBuilder($">>> {nameof(PrintHierarchy)}\n"); + var rootGameObjects = m_TestScene.GetRootGameObjects(); + for (int objectIndex = 0; objectIndex < rootGameObjects.Length; objectIndex++) + { + PrintHierarchy(rootGameObjects[objectIndex].transform, logBuilder, 1); + } + Debug.Log(logBuilder.ToString()); // Try(Cube -> MainCamera/Cube): false var serverCachedParent = m_Cube_NetObjs[0].parent; @@ -274,8 +280,13 @@ public IEnumerator SetParentTryAPI() } - Debug.Log($">>> {nameof(PrintHierarchy)}"); - m_TestScene.GetRootGameObjects().Select(g => g.transform).ToList().ForEach(t => PrintHierarchy(t)); + logBuilder = new StringBuilder($">>> {nameof(PrintHierarchy)}\n"); + rootGameObjects = m_TestScene.GetRootGameObjects(); + for (int objectIndex = 0; objectIndex < rootGameObjects.Length; objectIndex++) + { + PrintHierarchy(rootGameObjects[objectIndex].transform, logBuilder, 1); + } + Debug.Log(logBuilder.ToString()); // Try(Cube -> Set/Dude/Arms/LeftArm/Cube): true Assert.That(m_Cube_NetObjs[0].GetComponent().TrySetParent(m_Dude_LeftArm_NetObjs[0])); @@ -291,16 +302,22 @@ public IEnumerator SetParentTryAPI() } - Debug.Log($">>> {nameof(PrintHierarchy)}"); - m_TestScene.GetRootGameObjects().Select(g => g.transform).ToList().ForEach(t => PrintHierarchy(t)); + logBuilder = new StringBuilder($">>> {nameof(PrintHierarchy)}\n"); + rootGameObjects = m_TestScene.GetRootGameObjects(); + for (int objectIndex = 0; objectIndex < rootGameObjects.Length; objectIndex++) + { + PrintHierarchy(rootGameObjects[objectIndex].transform, logBuilder, 1); + } + Debug.Log(logBuilder.ToString()); } - private void PrintHierarchy(Transform rootTransform, int indentLevel = 1) + private void PrintHierarchy(Transform rootTransform, StringBuilder logBuilder, int indentLevel) { + logBuilder.Append($"{new string('\t', indentLevel)}{rootTransform.name} [{rootTransform.GetInstanceID()}]\n"); + foreach (Transform childTransform in rootTransform) { - Debug.Log($"{new string('\t', indentLevel)}{childTransform.name} [{childTransform.GetInstanceID()}]"); - PrintHierarchy(childTransform, indentLevel + 1); + PrintHierarchy(childTransform, logBuilder, indentLevel + 1); } } } From e5882ee85e00184a347c902b499eec8d04e999c4 Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Sat, 5 Jun 2021 16:05:19 +0100 Subject: [PATCH 29/44] increase frame wait time --- .../ObjectParenting/NetworkObjectParentingTests.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs index 469b2ae8f5..0b975957f6 100644 --- a/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs @@ -208,7 +208,7 @@ public IEnumerator SetParentDirect() m_Cube_NetObjs[0].parent = m_Pickup_Back_NetObjs[0]; Assert.That(m_Cube_NetBhvs[0].ParentNetworkObject, Is.EqualTo(m_Pickup_Back_NetObjs[0].GetComponent())); - int nextFrameNumber = Time.frameCount + 2; + int nextFrameNumber = Time.frameCount + 8; yield return new WaitUntil(() => Time.frameCount >= nextFrameNumber); // Client[n]: Set/Cube -> Set/Pickup/Back/Cube @@ -223,7 +223,7 @@ public IEnumerator SetParentDirect() m_Cube_NetObjs[0].parent = null; Assert.That(m_Cube_NetBhvs[0].ParentNetworkObject, Is.EqualTo(null)); - nextFrameNumber = Time.frameCount + 2; + nextFrameNumber = Time.frameCount + 8; yield return new WaitUntil(() => Time.frameCount >= nextFrameNumber); // Client[n]: Set/Pickup/Back -> Root/Cube @@ -238,7 +238,7 @@ public IEnumerator SetParentDirect() m_Cube_NetObjs[0].parent = m_Dude_RightArm_NetObjs[0]; Assert.That(m_Cube_NetBhvs[0].ParentNetworkObject, Is.EqualTo(m_Dude_RightArm_NetObjs[0].GetComponent())); - nextFrameNumber = Time.frameCount + 2; + nextFrameNumber = Time.frameCount + 8; yield return new WaitUntil(() => Time.frameCount >= nextFrameNumber); // Client[n]: Root/Cube -> Set/Dude/Arms/RightArm/Cube @@ -270,7 +270,7 @@ public IEnumerator SetParentTryAPI() Assert.That(!m_Cube_NetObjs[0].GetComponent().TrySetParent(Camera.main.transform)); - int nextFrameNumber = Time.frameCount + 2; + int nextFrameNumber = Time.frameCount + 8; yield return new WaitUntil(() => Time.frameCount >= nextFrameNumber); Assert.That(m_Cube_NetObjs[0].parent.GetInstanceID(), Is.EqualTo(serverCachedParent.GetInstanceID())); @@ -292,7 +292,7 @@ public IEnumerator SetParentTryAPI() Assert.That(m_Cube_NetObjs[0].GetComponent().TrySetParent(m_Dude_LeftArm_NetObjs[0])); Assert.That(m_Cube_NetBhvs[0].ParentNetworkObject, Is.EqualTo(m_Dude_LeftArm_NetObjs[0].GetComponent())); - nextFrameNumber = Time.frameCount + 2; + nextFrameNumber = Time.frameCount + 8; yield return new WaitUntil(() => Time.frameCount >= nextFrameNumber); for (int setIndex = 0; setIndex < k_ClientInstanceCount; setIndex++) From a5941f6e8a6036f625bb75ff0cb492e980a77330 Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Sat, 5 Jun 2021 16:23:56 +0100 Subject: [PATCH 30/44] more granular logs --- .../NetworkObjectParentingTests.cs | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs index 0b975957f6..33d49791c9 100644 --- a/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs @@ -252,7 +252,7 @@ public IEnumerator SetParentDirect() [UnityTest] public IEnumerator SetParentTryAPI() { - var logBuilder = new StringBuilder($">>> {nameof(PrintHierarchy)}\n"); + var logBuilder = new StringBuilder($">>> A {nameof(PrintHierarchy)}\n"); var rootGameObjects = m_TestScene.GetRootGameObjects(); for (int objectIndex = 0; objectIndex < rootGameObjects.Length; objectIndex++) { @@ -280,7 +280,7 @@ public IEnumerator SetParentTryAPI() } - logBuilder = new StringBuilder($">>> {nameof(PrintHierarchy)}\n"); + logBuilder = new StringBuilder($">>> B {nameof(PrintHierarchy)}\n"); rootGameObjects = m_TestScene.GetRootGameObjects(); for (int objectIndex = 0; objectIndex < rootGameObjects.Length; objectIndex++) { @@ -292,17 +292,32 @@ public IEnumerator SetParentTryAPI() Assert.That(m_Cube_NetObjs[0].GetComponent().TrySetParent(m_Dude_LeftArm_NetObjs[0])); Assert.That(m_Cube_NetBhvs[0].ParentNetworkObject, Is.EqualTo(m_Dude_LeftArm_NetObjs[0].GetComponent())); + logBuilder = new StringBuilder($">>> C {nameof(PrintHierarchy)}\n"); + rootGameObjects = m_TestScene.GetRootGameObjects(); + for (int objectIndex = 0; objectIndex < rootGameObjects.Length; objectIndex++) + { + PrintHierarchy(rootGameObjects[objectIndex].transform, logBuilder, 1); + } + Debug.Log(logBuilder.ToString()); + nextFrameNumber = Time.frameCount + 8; yield return new WaitUntil(() => Time.frameCount >= nextFrameNumber); + logBuilder = new StringBuilder($">>> D {nameof(PrintHierarchy)}\n"); + rootGameObjects = m_TestScene.GetRootGameObjects(); + for (int objectIndex = 0; objectIndex < rootGameObjects.Length; objectIndex++) + { + PrintHierarchy(rootGameObjects[objectIndex].transform, logBuilder, 1); + } + Debug.Log(logBuilder.ToString()); + for (int setIndex = 0; setIndex < k_ClientInstanceCount; setIndex++) { Assert.That(m_Cube_NetObjs[setIndex + 1].parent.GetInstanceID(), Is.EqualTo(m_Dude_LeftArm_NetObjs[setIndex + 1].GetInstanceID())); Assert.That(m_Cube_NetBhvs[setIndex + 1].ParentNetworkObject, Is.EqualTo(m_Dude_LeftArm_NetObjs[setIndex + 1].GetComponent())); } - - logBuilder = new StringBuilder($">>> {nameof(PrintHierarchy)}\n"); + logBuilder = new StringBuilder($">>> E {nameof(PrintHierarchy)}\n"); rootGameObjects = m_TestScene.GetRootGameObjects(); for (int objectIndex = 0; objectIndex < rootGameObjects.Length; objectIndex++) { From 37eeee1a075f54a5a5325f324fd3e9a7738b90c3 Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Sat, 5 Jun 2021 16:56:37 +0100 Subject: [PATCH 31/44] add netobj id to logs --- .../Runtime/ObjectParenting/NetworkObjectParentingTests.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs index 33d49791c9..45ba274166 100644 --- a/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs @@ -328,7 +328,8 @@ public IEnumerator SetParentTryAPI() private void PrintHierarchy(Transform rootTransform, StringBuilder logBuilder, int indentLevel) { - logBuilder.Append($"{new string('\t', indentLevel)}{rootTransform.name} [{rootTransform.GetInstanceID()}]\n"); + var networkObject = rootTransform.GetComponent(); + logBuilder.Append($"{new string('\t', indentLevel)}{rootTransform.name} [{rootTransform.GetInstanceID()}]{(networkObject != null ? $" #{networkObject.NetworkObjectId}" : "")}\n"); foreach (Transform childTransform in rootTransform) { From 3b8e8021ac25c8c3ad3a9545a2512635d7e13d17 Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Sat, 5 Jun 2021 20:14:11 +0100 Subject: [PATCH 32/44] add more verbose logs --- .../Runtime/Core/NetworkManager.cs | 1 + .../Runtime/Core/NetworkObject.cs | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs index 2598160a3e..05a19f1f9f 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs @@ -1337,6 +1337,7 @@ internal void HandleIncomingData(ulong clientId, NetworkChannel networkChannel, { var networkObjectId = reader.ReadUInt64Packed(); var (isReparented, latestParent) = NetworkObject.ReadNetworkParenting(reader); + UnityEngine.Debug.Log($">>> ReadNetworkParenting -> IsReparented:{isReparented} LatestParent:{latestParent}"); if (SpawnManager.SpawnedObjects.ContainsKey(networkObjectId)) { var networkObject = SpawnManager.SpawnedObjects[networkObjectId]; diff --git a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs index 5cdeed2137..83d539f55c 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs @@ -682,6 +682,7 @@ private void OnTransformParentChanged() { writer.WriteUInt64Packed(NetworkObjectId); WriteNetworkParenting(writer, m_IsReparented, m_LatestParent); + Debug.Log($">>> WriteNetworkParenting -> IsReparented:{m_IsReparented} LatestParent:{m_LatestParent}"); } for (int i = 0; i < NetworkManager.ConnectedClientsList.Count; i++) @@ -701,21 +702,26 @@ internal bool ApplyNetworkParenting() { if (!AutoObjectParentSync) { + Debug.Log(">>> !AutoObjectParentSync"); return false; } if (!IsSpawned) { + Debug.Log(">>> !IsSpawned"); return false; } if (!m_IsReparented) { + Debug.Log(">>> !m_IsReparented"); return true; } if (m_LatestParent == null || !m_LatestParent.HasValue) { + Debug.Log(">>> m_LatestParent == null || !m_LatestParent.HasValue"); + m_CachedParent = null; transform.parent = null; @@ -725,6 +731,8 @@ internal bool ApplyNetworkParenting() if (!NetworkManager.SpawnManager.SpawnedObjects.ContainsKey(m_LatestParent.Value)) { + Debug.Log(">>> !NetworkManager.SpawnManager.SpawnedObjects.ContainsKey(m_LatestParent.Value)"); + if (OrphanChildren.Add(this)) { if (NetworkLog.CurrentLogLevel <= LogLevel.Normal) @@ -737,6 +745,8 @@ internal bool ApplyNetworkParenting() var parentObject = NetworkManager.SpawnManager.SpawnedObjects[m_LatestParent.Value]; + Debug.Log(">>> MOVED - REPARENTED"); + m_CachedParent = parentObject.transform; transform.parent = parentObject.transform; From c602862f49b5b48beb18150fd068837d88227808 Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Sat, 5 Jun 2021 22:02:09 +0100 Subject: [PATCH 33/44] try with host mode --- .../Runtime/ObjectParenting/NetworkObjectParentingTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs index 45ba274166..bde4289fb3 100644 --- a/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs @@ -86,7 +86,7 @@ public IEnumerator Setup() } // Start server and client NetworkManager instances - Assert.That(MultiInstanceHelpers.Start(false, m_ServerNetworkManager, m_ClientNetworkManagers)); + Assert.That(MultiInstanceHelpers.Start(true, m_ServerNetworkManager, m_ClientNetworkManagers)); // Wait for connection on client side yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.WaitForClientsConnected(m_ClientNetworkManagers)); From d699581c117cc2c7732359ecbc811d5336dba525 Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Sat, 5 Jun 2021 22:22:17 +0100 Subject: [PATCH 34/44] targetframerate & more logs craziness --- com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs | 1 + com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs | 2 ++ .../Runtime/ObjectParenting/NetworkObjectParentingTests.cs | 2 ++ 3 files changed, 5 insertions(+) diff --git a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs index 05a19f1f9f..6cb145e9d9 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs @@ -1331,6 +1331,7 @@ internal void HandleIncomingData(ulong clientId, NetworkChannel networkChannel, } case NetworkConstants.PARENT_SYNC: { + UnityEngine.Debug.Log(">>> Receive PARENT_SYNC"); if (IsClient) { using (var reader = PooledNetworkReader.Get(messageStream)) diff --git a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs index 83d539f55c..774094bf00 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs @@ -685,9 +685,11 @@ private void OnTransformParentChanged() Debug.Log($">>> WriteNetworkParenting -> IsReparented:{m_IsReparented} LatestParent:{m_LatestParent}"); } + Debug.Log($">>> SendTo {NetworkManager.ConnectedClientsList.Count} connections"); for (int i = 0; i < NetworkManager.ConnectedClientsList.Count; i++) { var targetClientId = NetworkManager.ConnectedClientsList[i].ClientId; + Debug.Log($">>> Send PARENT_SYNC -> targetClientId:{targetClientId}"); if (Observers.Contains(targetClientId)) { NetworkManager.MessageSender.Send(targetClientId, NetworkConstants.PARENT_SYNC, NetworkChannel.Internal, buffer); diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs index bde4289fb3..613d69fdcf 100644 --- a/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs @@ -44,6 +44,8 @@ private void OnSceneLoaded(Scene scene, LoadSceneMode mode) [UnitySetUp] public IEnumerator Setup() { + Application.targetFrameRate = 120; + SceneManager.sceneLoaded += OnSceneLoaded; var execAssembly = Assembly.GetExecutingAssembly(); From 326c7ab5f523180d4239f0d31b316c4a7e71ad1b Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Sat, 5 Jun 2021 22:39:51 +0100 Subject: [PATCH 35/44] let's see --- .../Runtime/ObjectParenting/NetworkObjectParentingTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs index 613d69fdcf..adf1e05eaf 100644 --- a/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs @@ -44,7 +44,7 @@ private void OnSceneLoaded(Scene scene, LoadSceneMode mode) [UnitySetUp] public IEnumerator Setup() { - Application.targetFrameRate = 120; + // Application.targetFrameRate = 120; SceneManager.sceneLoaded += OnSceneLoaded; From db40b3588b0897980b588eea87a62c8c69ef4535 Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Sat, 5 Jun 2021 22:53:24 +0100 Subject: [PATCH 36/44] TARGETFRAMERATE?!?!11!!1 --- .../Runtime/ObjectParenting/NetworkObjectParentingTests.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs index adf1e05eaf..0dcbb1b2c8 100644 --- a/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs @@ -30,6 +30,8 @@ public class NetworkObjectParentingTests private Transform[] m_Pickup_NetObjs; private Transform[] m_Pickup_Back_NetObjs; + private int m_InitTargetFrameRate; + private Scene m_InitScene; private Scene m_TestScene; @@ -44,7 +46,8 @@ private void OnSceneLoaded(Scene scene, LoadSceneMode mode) [UnitySetUp] public IEnumerator Setup() { - // Application.targetFrameRate = 120; + m_InitTargetFrameRate = Application.targetFrameRate; + Application.targetFrameRate = 120; SceneManager.sceneLoaded += OnSceneLoaded; @@ -192,6 +195,8 @@ public void SetupSet(Transform rootTransform, int setIndex, NetworkManager netwo [UnityTearDown] public IEnumerator Teardown() { + Application.targetFrameRate = m_InitTargetFrameRate; + SceneManager.sceneLoaded -= OnSceneLoaded; MultiInstanceHelpers.Destroy(); From 92d369c5f64f233cefb109889875c4436efe5225 Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Sat, 5 Jun 2021 23:04:25 +0100 Subject: [PATCH 37/44] cleanup --- .../Runtime/Core/NetworkManager.cs | 2 - .../Runtime/Core/NetworkObject.cs | 12 ---- .../NetworkObjectParentingTests.cs | 67 +++---------------- 3 files changed, 8 insertions(+), 73 deletions(-) diff --git a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs index 6cb145e9d9..2598160a3e 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs @@ -1331,14 +1331,12 @@ internal void HandleIncomingData(ulong clientId, NetworkChannel networkChannel, } case NetworkConstants.PARENT_SYNC: { - UnityEngine.Debug.Log(">>> Receive PARENT_SYNC"); if (IsClient) { using (var reader = PooledNetworkReader.Get(messageStream)) { var networkObjectId = reader.ReadUInt64Packed(); var (isReparented, latestParent) = NetworkObject.ReadNetworkParenting(reader); - UnityEngine.Debug.Log($">>> ReadNetworkParenting -> IsReparented:{isReparented} LatestParent:{latestParent}"); if (SpawnManager.SpawnedObjects.ContainsKey(networkObjectId)) { var networkObject = SpawnManager.SpawnedObjects[networkObjectId]; diff --git a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs index 774094bf00..5cdeed2137 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs @@ -682,14 +682,11 @@ private void OnTransformParentChanged() { writer.WriteUInt64Packed(NetworkObjectId); WriteNetworkParenting(writer, m_IsReparented, m_LatestParent); - Debug.Log($">>> WriteNetworkParenting -> IsReparented:{m_IsReparented} LatestParent:{m_LatestParent}"); } - Debug.Log($">>> SendTo {NetworkManager.ConnectedClientsList.Count} connections"); for (int i = 0; i < NetworkManager.ConnectedClientsList.Count; i++) { var targetClientId = NetworkManager.ConnectedClientsList[i].ClientId; - Debug.Log($">>> Send PARENT_SYNC -> targetClientId:{targetClientId}"); if (Observers.Contains(targetClientId)) { NetworkManager.MessageSender.Send(targetClientId, NetworkConstants.PARENT_SYNC, NetworkChannel.Internal, buffer); @@ -704,26 +701,21 @@ internal bool ApplyNetworkParenting() { if (!AutoObjectParentSync) { - Debug.Log(">>> !AutoObjectParentSync"); return false; } if (!IsSpawned) { - Debug.Log(">>> !IsSpawned"); return false; } if (!m_IsReparented) { - Debug.Log(">>> !m_IsReparented"); return true; } if (m_LatestParent == null || !m_LatestParent.HasValue) { - Debug.Log(">>> m_LatestParent == null || !m_LatestParent.HasValue"); - m_CachedParent = null; transform.parent = null; @@ -733,8 +725,6 @@ internal bool ApplyNetworkParenting() if (!NetworkManager.SpawnManager.SpawnedObjects.ContainsKey(m_LatestParent.Value)) { - Debug.Log(">>> !NetworkManager.SpawnManager.SpawnedObjects.ContainsKey(m_LatestParent.Value)"); - if (OrphanChildren.Add(this)) { if (NetworkLog.CurrentLogLevel <= LogLevel.Normal) @@ -747,8 +737,6 @@ internal bool ApplyNetworkParenting() var parentObject = NetworkManager.SpawnManager.SpawnedObjects[m_LatestParent.Value]; - Debug.Log(">>> MOVED - REPARENTED"); - m_CachedParent = parentObject.transform; transform.parent = parentObject.transform; diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs index 0dcbb1b2c8..c59725d4e4 100644 --- a/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs @@ -215,7 +215,7 @@ public IEnumerator SetParentDirect() m_Cube_NetObjs[0].parent = m_Pickup_Back_NetObjs[0]; Assert.That(m_Cube_NetBhvs[0].ParentNetworkObject, Is.EqualTo(m_Pickup_Back_NetObjs[0].GetComponent())); - int nextFrameNumber = Time.frameCount + 8; + int nextFrameNumber = Time.frameCount + 2; yield return new WaitUntil(() => Time.frameCount >= nextFrameNumber); // Client[n]: Set/Cube -> Set/Pickup/Back/Cube @@ -230,7 +230,7 @@ public IEnumerator SetParentDirect() m_Cube_NetObjs[0].parent = null; Assert.That(m_Cube_NetBhvs[0].ParentNetworkObject, Is.EqualTo(null)); - nextFrameNumber = Time.frameCount + 8; + nextFrameNumber = Time.frameCount + 2; yield return new WaitUntil(() => Time.frameCount >= nextFrameNumber); // Client[n]: Set/Pickup/Back -> Root/Cube @@ -245,7 +245,7 @@ public IEnumerator SetParentDirect() m_Cube_NetObjs[0].parent = m_Dude_RightArm_NetObjs[0]; Assert.That(m_Cube_NetBhvs[0].ParentNetworkObject, Is.EqualTo(m_Dude_RightArm_NetObjs[0].GetComponent())); - nextFrameNumber = Time.frameCount + 8; + nextFrameNumber = Time.frameCount + 2; yield return new WaitUntil(() => Time.frameCount >= nextFrameNumber); // Client[n]: Root/Cube -> Set/Dude/Arms/RightArm/Cube @@ -259,14 +259,6 @@ public IEnumerator SetParentDirect() [UnityTest] public IEnumerator SetParentTryAPI() { - var logBuilder = new StringBuilder($">>> A {nameof(PrintHierarchy)}\n"); - var rootGameObjects = m_TestScene.GetRootGameObjects(); - for (int objectIndex = 0; objectIndex < rootGameObjects.Length; objectIndex++) - { - PrintHierarchy(rootGameObjects[objectIndex].transform, logBuilder, 1); - } - Debug.Log(logBuilder.ToString()); - // Try(Cube -> MainCamera/Cube): false var serverCachedParent = m_Cube_NetObjs[0].parent; var clientCachedParents = new Transform[k_ClientInstanceCount]; @@ -277,71 +269,28 @@ public IEnumerator SetParentTryAPI() Assert.That(!m_Cube_NetObjs[0].GetComponent().TrySetParent(Camera.main.transform)); - int nextFrameNumber = Time.frameCount + 8; + int nextFrameNumber = Time.frameCount + 2; yield return new WaitUntil(() => Time.frameCount >= nextFrameNumber); - Assert.That(m_Cube_NetObjs[0].parent.GetInstanceID(), Is.EqualTo(serverCachedParent.GetInstanceID())); + Assert.That(m_Cube_NetObjs[0].parent, Is.EqualTo(serverCachedParent)); for (int setIndex = 0; setIndex < k_ClientInstanceCount; setIndex++) { - Assert.That(m_Cube_NetObjs[setIndex + 1].parent.GetInstanceID(), Is.EqualTo(clientCachedParents[setIndex].GetInstanceID())); + Assert.That(m_Cube_NetObjs[setIndex + 1].parent, Is.EqualTo(clientCachedParents[setIndex])); } - logBuilder = new StringBuilder($">>> B {nameof(PrintHierarchy)}\n"); - rootGameObjects = m_TestScene.GetRootGameObjects(); - for (int objectIndex = 0; objectIndex < rootGameObjects.Length; objectIndex++) - { - PrintHierarchy(rootGameObjects[objectIndex].transform, logBuilder, 1); - } - Debug.Log(logBuilder.ToString()); - // Try(Cube -> Set/Dude/Arms/LeftArm/Cube): true Assert.That(m_Cube_NetObjs[0].GetComponent().TrySetParent(m_Dude_LeftArm_NetObjs[0])); Assert.That(m_Cube_NetBhvs[0].ParentNetworkObject, Is.EqualTo(m_Dude_LeftArm_NetObjs[0].GetComponent())); - logBuilder = new StringBuilder($">>> C {nameof(PrintHierarchy)}\n"); - rootGameObjects = m_TestScene.GetRootGameObjects(); - for (int objectIndex = 0; objectIndex < rootGameObjects.Length; objectIndex++) - { - PrintHierarchy(rootGameObjects[objectIndex].transform, logBuilder, 1); - } - Debug.Log(logBuilder.ToString()); - - nextFrameNumber = Time.frameCount + 8; + nextFrameNumber = Time.frameCount + 2; yield return new WaitUntil(() => Time.frameCount >= nextFrameNumber); - logBuilder = new StringBuilder($">>> D {nameof(PrintHierarchy)}\n"); - rootGameObjects = m_TestScene.GetRootGameObjects(); - for (int objectIndex = 0; objectIndex < rootGameObjects.Length; objectIndex++) - { - PrintHierarchy(rootGameObjects[objectIndex].transform, logBuilder, 1); - } - Debug.Log(logBuilder.ToString()); - for (int setIndex = 0; setIndex < k_ClientInstanceCount; setIndex++) { - Assert.That(m_Cube_NetObjs[setIndex + 1].parent.GetInstanceID(), Is.EqualTo(m_Dude_LeftArm_NetObjs[setIndex + 1].GetInstanceID())); + Assert.That(m_Cube_NetObjs[setIndex + 1].parent, Is.EqualTo(m_Dude_LeftArm_NetObjs[setIndex + 1])); Assert.That(m_Cube_NetBhvs[setIndex + 1].ParentNetworkObject, Is.EqualTo(m_Dude_LeftArm_NetObjs[setIndex + 1].GetComponent())); } - - logBuilder = new StringBuilder($">>> E {nameof(PrintHierarchy)}\n"); - rootGameObjects = m_TestScene.GetRootGameObjects(); - for (int objectIndex = 0; objectIndex < rootGameObjects.Length; objectIndex++) - { - PrintHierarchy(rootGameObjects[objectIndex].transform, logBuilder, 1); - } - Debug.Log(logBuilder.ToString()); - } - - private void PrintHierarchy(Transform rootTransform, StringBuilder logBuilder, int indentLevel) - { - var networkObject = rootTransform.GetComponent(); - logBuilder.Append($"{new string('\t', indentLevel)}{rootTransform.name} [{rootTransform.GetInstanceID()}]{(networkObject != null ? $" #{networkObject.NetworkObjectId}" : "")}\n"); - - foreach (Transform childTransform in rootTransform) - { - PrintHierarchy(childTransform, logBuilder, indentLevel + 1); - } } } } From 40b45feb0c18d7ffbfb0cb1561f6c7e8ff023e78 Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Sun, 6 Jun 2021 03:40:33 +0100 Subject: [PATCH 38/44] 50fps --- .../Runtime/ObjectParenting/NetworkObjectParentingTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs index c59725d4e4..2573922e22 100644 --- a/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs @@ -47,7 +47,7 @@ private void OnSceneLoaded(Scene scene, LoadSceneMode mode) public IEnumerator Setup() { m_InitTargetFrameRate = Application.targetFrameRate; - Application.targetFrameRate = 120; + Application.targetFrameRate = 50; SceneManager.sceneLoaded += OnSceneLoaded; From 33bf226b197205d4dbae5f9093ea32a7b502374f Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Mon, 7 Jun 2021 23:56:11 +0100 Subject: [PATCH 39/44] add placeholder OnNetworkObjectParentChanged callback handler --- com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs | 5 +++++ .../Runtime/ObjectParenting/NetworkObjectParentingTests.cs | 1 - 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs b/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs index 2bf22018a3..a2fb09a6e4 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs @@ -213,6 +213,11 @@ void SetupVar(NetworkVariable v, T initialValue, ref T oldVal) } } + public override void OnNetworkObjectParentChanged(NetworkObject parentNetworkObject) + { + // TODO: handle parent NetworkObject change and potentially optimize pos/rot/scale replication? + } + private NetworkVariable.OnValueChangedDelegate GetOnValueChangedDelegate(Action assignCurrent) { return (old, current) => diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs index 2573922e22..e4bcc82398 100644 --- a/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs @@ -2,7 +2,6 @@ using System.IO; using System.Linq; using System.Reflection; -using System.Text; using System.Text.RegularExpressions; using NUnit.Framework; using UnityEditor.PackageManager; From 235aea60e8877da106c438c7a325c6e960fec9af Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Tue, 8 Jun 2021 00:06:38 +0100 Subject: [PATCH 40/44] more comments and warning log --- .../Runtime/Core/NetworkManager.cs | 4 ++++ .../Runtime/Core/NetworkObject.cs | 14 +++++++++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs index 2598160a3e..28ed0de3e1 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs @@ -1343,6 +1343,10 @@ internal void HandleIncomingData(ulong clientId, NetworkChannel networkChannel, networkObject.SetNetworkParenting(isReparented, latestParent); networkObject.ApplyNetworkParenting(); } + else if (NetworkLog.CurrentLogLevel <= LogLevel.Normal) + { + NetworkLog.LogWarning($"Read {nameof(NetworkConstants.PARENT_SYNC)} for {nameof(NetworkObject)} #{networkObjectId} but could not find it in the {nameof(SpawnManager.SpawnedObjects)}"); + } } } diff --git a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs index 5cdeed2137..fbee7abcbe 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs @@ -522,9 +522,9 @@ internal void InvokeBehaviourOnNetworkObjectParentChanged(NetworkObject parentNe } } - private bool m_IsReparented; - private ulong? m_LatestParent; - private Transform m_CachedParent; + private bool m_IsReparented; // Did initial parent (came from the scene hierarchy) change at runtime? + private ulong? m_LatestParent; // What is our last set parent NetworkObject's ID? + private Transform m_CachedParent; // What is our last set parent Transform reference? internal void SetCachedParent(Transform parentTransform) { @@ -695,6 +695,14 @@ private void OnTransformParentChanged() } } + // we're keeping this set called OrphanChildren which contains NetworkObjects + // because at the time we initialize/spawn NetworkObject locally, we might not have its parent replicated from the other side + // + // for instance, if we're spawning NetworkObject 5 and its parent is 10, what should happen if we do not have 10 yet? + // let's say 10 is on the way to be replicated in a few frames and we could fix that parent-child relationship later. + // + // if you couldn't find your parent, we put you into OrphanChildren set and everytime we spawn another NetworkObject locally due to replication, + // we call CheckOrphanChildren() method and quickly iterate over OrphanChildren set and see if we can reparent/adopt one. internal static HashSet OrphanChildren = new HashSet(); internal bool ApplyNetworkParenting() From 6df1324ea34211b158dc07c5d20844b25e610301 Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Tue, 8 Jun 2021 14:44:08 +0100 Subject: [PATCH 41/44] hey hey Yamato --- com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs index fbee7abcbe..e5767ecf97 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkObject.cs @@ -695,13 +695,13 @@ private void OnTransformParentChanged() } } - // we're keeping this set called OrphanChildren which contains NetworkObjects + // We're keeping this set called OrphanChildren which contains NetworkObjects // because at the time we initialize/spawn NetworkObject locally, we might not have its parent replicated from the other side // - // for instance, if we're spawning NetworkObject 5 and its parent is 10, what should happen if we do not have 10 yet? + // For instance, if we're spawning NetworkObject 5 and its parent is 10, what should happen if we do not have 10 yet? // let's say 10 is on the way to be replicated in a few frames and we could fix that parent-child relationship later. // - // if you couldn't find your parent, we put you into OrphanChildren set and everytime we spawn another NetworkObject locally due to replication, + // If you couldn't find your parent, we put you into OrphanChildren set and everytime we spawn another NetworkObject locally due to replication, // we call CheckOrphanChildren() method and quickly iterate over OrphanChildren set and see if we can reparent/adopt one. internal static HashSet OrphanChildren = new HashSet(); From 50d1cf3419229b0f7404f0d1d934de7f0cd9c53f Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Tue, 8 Jun 2021 20:45:50 +0100 Subject: [PATCH 42/44] move child NetworkObject to the root on parent NetworkObject destroy --- .../Runtime/Spawning/NetworkSpawnManager.cs | 33 ++++++++++++++----- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/com.unity.multiplayer.mlapi/Runtime/Spawning/NetworkSpawnManager.cs b/com.unity.multiplayer.mlapi/Runtime/Spawning/NetworkSpawnManager.cs index 86a92ad43c..7ff11c9c41 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Spawning/NetworkSpawnManager.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Spawning/NetworkSpawnManager.cs @@ -609,7 +609,7 @@ internal void ClientCollectSoftSyncSceneObjectSweep(NetworkObject[] networkObjec } } - internal void OnDestroyObject(ulong networkId, bool destroyGameObject) + internal void OnDestroyObject(ulong networkObjectId, bool destroyGameObject) { if (NetworkManager == null) { @@ -617,18 +617,33 @@ internal void OnDestroyObject(ulong networkId, bool destroyGameObject) } //Removal of spawned object - if (!SpawnedObjects.TryGetValue(networkId, out NetworkObject sobj)) + if (!SpawnedObjects.TryGetValue(networkObjectId, out NetworkObject sobj)) { - Debug.LogWarning($"Trying to destroy object {networkId} but it doesn't seem to exist anymore!"); + Debug.LogWarning($"Trying to destroy object {networkObjectId} but it doesn't seem to exist anymore!"); return; } + // Move child NetworkObjects to the root when parent NetworkObject is destroyed + foreach (var networkObject in SpawnedObjectsList) + { + var (isReparented, latestParent) = networkObject.GetNetworkParenting(); + if (isReparented && latestParent == networkObjectId) + { + networkObject.gameObject.transform.parent = null; + + if (NetworkLog.CurrentLogLevel <= LogLevel.Normal) + { + NetworkLog.LogWarning($"{nameof(NetworkObject)} #{networkObject.NetworkObjectId} moved to the root because its parent {nameof(NetworkObject)} #{networkObjectId} is destroyed"); + } + } + } + if (!sobj.IsOwnedByServer && !sobj.IsPlayerObject && NetworkManager.Singleton.ConnectedClients.TryGetValue(sobj.OwnerClientId, out NetworkClient networkClient)) { //Someone owns it. for (int i = networkClient.OwnedObjects.Count - 1; i > -1; i--) { - if (networkClient.OwnedObjects[i].NetworkObjectId == networkId) + if (networkClient.OwnedObjects[i].NetworkObjectId == networkObjectId) { networkClient.OwnedObjects.RemoveAt(i); } @@ -643,7 +658,7 @@ internal void OnDestroyObject(ulong networkId, bool destroyGameObject) { ReleasedNetworkObjectIds.Enqueue(new ReleasedNetworkId() { - NetworkId = networkId, + NetworkId = networkObjectId, ReleaseTime = Time.unscaledTime }); } @@ -659,13 +674,13 @@ internal void OnDestroyObject(ulong networkId, bool destroyGameObject) var buffer = PooledNetworkBuffer.Get(); using (var writer = PooledNetworkWriter.Get(buffer)) { - writer.WriteUInt64Packed(networkId); + writer.WriteUInt64Packed(networkObjectId); var queueItem = new RpcFrameQueueItem { UpdateStage = NetworkUpdateStage.PostLateUpdate, QueueItemType = RpcQueueContainer.QueueItemType.DestroyObject, - NetworkId = networkId, + NetworkId = networkObjectId, NetworkBuffer = buffer, NetworkChannel = NetworkChannel.Internal, ClientNetworkIds = NetworkManager.ConnectedClientsList.Select(c => c.ClientId).ToArray() @@ -685,7 +700,7 @@ internal void OnDestroyObject(ulong networkId, bool destroyGameObject) if (NetworkManager.PrefabHandler.ContainsHandler(sobj)) { NetworkManager.PrefabHandler.HandleNetworkPrefabDestroy(sobj); - OnDestroyObject(networkId, false); + OnDestroyObject(networkObjectId, false); } else { @@ -696,7 +711,7 @@ internal void OnDestroyObject(ulong networkId, bool destroyGameObject) // for some reason, we can get down here and SpawnedObjects for this // networkId will no longer be here, even as we check this at the start // of the function - if (SpawnedObjects.Remove(networkId)) + if (SpawnedObjects.Remove(networkObjectId)) { SpawnedObjectsList.Remove(sobj); } From 0ea6dec76d4d999b17d1a44ab1ff1311a387f1da Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Wed, 9 Jun 2021 01:13:39 +0100 Subject: [PATCH 43/44] downgrade PARENT_SYNC log to Developer from Warning as we expect it to be fixed by OrphanChildren mechanism --- com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs index bf1c51cb52..2f4c395b22 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs @@ -1354,7 +1354,7 @@ internal void HandleIncomingData(ulong clientId, NetworkChannel networkChannel, networkObject.SetNetworkParenting(isReparented, latestParent); networkObject.ApplyNetworkParenting(); } - else if (NetworkLog.CurrentLogLevel <= LogLevel.Normal) + else if (NetworkLog.CurrentLogLevel <= LogLevel.Developer) { NetworkLog.LogWarning($"Read {nameof(NetworkConstants.PARENT_SYNC)} for {nameof(NetworkObject)} #{networkObjectId} but could not find it in the {nameof(SpawnManager.SpawnedObjects)}"); } From 7217098b77730e4a11be2a0c9cd3dfb93a75e8c8 Mon Sep 17 00:00:00 2001 From: "M. Fatih MAR" Date: Wed, 9 Jun 2021 16:42:53 +0100 Subject: [PATCH 44/44] remove Application.targetFrameRate trick --- .../Runtime/ObjectParenting/NetworkObjectParentingTests.cs | 7 ------- 1 file changed, 7 deletions(-) diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs index e4bcc82398..3a4608b674 100644 --- a/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/ObjectParenting/NetworkObjectParentingTests.cs @@ -29,8 +29,6 @@ public class NetworkObjectParentingTests private Transform[] m_Pickup_NetObjs; private Transform[] m_Pickup_Back_NetObjs; - private int m_InitTargetFrameRate; - private Scene m_InitScene; private Scene m_TestScene; @@ -45,9 +43,6 @@ private void OnSceneLoaded(Scene scene, LoadSceneMode mode) [UnitySetUp] public IEnumerator Setup() { - m_InitTargetFrameRate = Application.targetFrameRate; - Application.targetFrameRate = 50; - SceneManager.sceneLoaded += OnSceneLoaded; var execAssembly = Assembly.GetExecutingAssembly(); @@ -194,8 +189,6 @@ public void SetupSet(Transform rootTransform, int setIndex, NetworkManager netwo [UnityTearDown] public IEnumerator Teardown() { - Application.targetFrameRate = m_InitTargetFrameRate; - SceneManager.sceneLoaded -= OnSceneLoaded; MultiInstanceHelpers.Destroy();