From 0ad1fb062fac188884289a5ed0440338aea43d02 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Mon, 5 Jul 2021 14:42:30 -0400 Subject: [PATCH 001/113] setting correct default --- com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs b/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs index f856da1db5..f797fbc2d7 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs @@ -84,7 +84,7 @@ public enum Authority /// The channel to send the data on /// [SerializeField, Tooltip("The channel to send the data on.")] - public NetworkChannel Channel = NetworkChannel.NetworkVariable; + public NetworkChannel Channel = NetworkChannel.PositionUpdate; /// /// Sets whether this transform should sync local or world properties. This is important to set since reparenting this transform From bc4d373b489f5c39d8584920e0a08d884fcd202f Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Tue, 20 Jul 2021 15:33:38 -0400 Subject: [PATCH 002/113] adding test benchmark for interpolation --- .gitignore | 1 + testproject/Assets/MoveInCircle.cs | 20 + testproject/Assets/MoveInCircle.cs.meta | 11 + testproject/Assets/Scenes/SampleScene.unity | 277 ++++++++++--- .../Assets/Scripts/NetworkTransformLegacy.cs | 375 ++++++++++++++++++ .../Scripts/NetworkTransformLegacy.cs.meta | 11 + testproject/Packages/manifest.json | 2 + testproject/Packages/packages-lock.json | 14 + 8 files changed, 645 insertions(+), 66 deletions(-) create mode 100644 testproject/Assets/MoveInCircle.cs create mode 100644 testproject/Assets/MoveInCircle.cs.meta create mode 100644 testproject/Assets/Scripts/NetworkTransformLegacy.cs create mode 100644 testproject/Assets/Scripts/NetworkTransformLegacy.cs.meta diff --git a/.gitignore b/.gitignore index 2f5d1d5be4..3ea975c7b4 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ .vs .vscode .idea +testproject_clone_0 diff --git a/testproject/Assets/MoveInCircle.cs b/testproject/Assets/MoveInCircle.cs new file mode 100644 index 0000000000..3586378e93 --- /dev/null +++ b/testproject/Assets/MoveInCircle.cs @@ -0,0 +1,20 @@ +using MLAPI; +using UnityEngine; + +public class MoveInCircle : MonoBehaviour +{ + [SerializeField] + private float m_MoveSpeed = 5; + + [SerializeField] + private float m_RotationSpeed = 30; + + void Update() + { + if (NetworkManager.Singleton.IsServer) + { + transform.position = transform.position + m_MoveSpeed * transform.forward * Time.deltaTime; + transform.Rotate(0, m_RotationSpeed * Time.deltaTime, 0); + } + } +} diff --git a/testproject/Assets/MoveInCircle.cs.meta b/testproject/Assets/MoveInCircle.cs.meta new file mode 100644 index 0000000000..6279dde433 --- /dev/null +++ b/testproject/Assets/MoveInCircle.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 307c40a41954948e7a36bb6b64b4b9cb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/testproject/Assets/Scenes/SampleScene.unity b/testproject/Assets/Scenes/SampleScene.unity index fa5231a972..7116bf74e9 100644 --- a/testproject/Assets/Scenes/SampleScene.unity +++ b/testproject/Assets/Scenes/SampleScene.unity @@ -181,7 +181,6 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 @@ -440,7 +439,6 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 @@ -492,7 +490,7 @@ Transform: m_Children: - {fileID: 789733233} m_Father: {fileID: 0} - m_RootOrder: 7 + m_RootOrder: 6 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &402668303 MonoBehaviour: @@ -509,6 +507,7 @@ MonoBehaviour: GlobalObjectIdHash: 3604669530 AlwaysReplicateAsRoot: 0 DontDestroyWithOwner: 0 + AutoObjectParentSync: 1 --- !u!114 &402668304 MonoBehaviour: m_ObjectHideFlags: 0 @@ -647,7 +646,6 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 @@ -744,7 +742,6 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 @@ -838,6 +835,7 @@ GameObject: - component: {fileID: 620561612} - component: {fileID: 620561611} - component: {fileID: 620561610} + - component: {fileID: 620561613} m_Layer: 0 m_Name: NetworkManager m_TagString: Untagged @@ -887,7 +885,7 @@ MonoBehaviour: LogLevel: 1 NetworkConfig: ProtocolVersion: 0 - NetworkTransport: {fileID: 620561610} + NetworkTransport: {fileID: 620561613} RegisteredScenes: - SampleScene AllowRuntimeSceneChanges: 0 @@ -934,6 +932,29 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &620561613 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 620561609} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: db28424c2ae12f64da25c9ecccded6b1, type: 3} + m_Name: + m_EditorClassIdentifier: + Port: 7777 + Address: 127.0.0.1 + PingInterval: 1 + DisconnectTimeout: 5 + ReconnectDelay: 0.5 + MaxConnectAttempts: 10 + channels: [] + MessageBufferSize: 5120 + SimulatePacketLossChance: 5 + SimulateMinLatency: 60 + SimulateMaxLatency: 100 --- !u!1001 &627808638 PrefabInstance: m_ObjectHideFlags: 0 @@ -1708,7 +1729,6 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 @@ -1781,7 +1801,7 @@ Transform: m_LocalScale: {x: 0.42366, y: 1, z: 1} m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 11 + m_RootOrder: 10 m_LocalEulerAnglesHint: {x: 0, y: 90, z: 0} --- !u!114 &963826004 MonoBehaviour: @@ -1833,6 +1853,7 @@ MonoBehaviour: GlobalObjectIdHash: 3972363333 AlwaysReplicateAsRoot: 0 DontDestroyWithOwner: 0 + AutoObjectParentSync: 1 --- !u!65 &963826007 BoxCollider: m_ObjectHideFlags: 0 @@ -1857,7 +1878,6 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 @@ -1896,51 +1916,6 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 963826002} m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &1202924672 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1202924674} - - component: {fileID: 1202924673} - m_Layer: 0 - m_Name: UnityChanSpawner - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1202924673 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1202924672} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 05037a80244af4174806bc7f242e4432, type: 3} - m_Name: - m_EditorClassIdentifier: - UnityChanPrefab: {fileID: 442217489085244684, guid: 5eca8a21314fe4278ba2571c289a9773, - type: 3} ---- !u!4 &1202924674 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1202924672} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -10, y: -0.1, z: 10} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 6 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1237561005 GameObject: m_ObjectHideFlags: 0 @@ -2265,7 +2240,7 @@ Transform: m_Children: - {fileID: 1475593094} m_Father: {fileID: 0} - m_RootOrder: 10 + m_RootOrder: 9 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1397037315 GameObject: @@ -2341,6 +2316,7 @@ MonoBehaviour: GlobalObjectIdHash: 1445980162 AlwaysReplicateAsRoot: 0 DontDestroyWithOwner: 0 + AutoObjectParentSync: 1 --- !u!54 &1397037320 Rigidbody: m_ObjectHideFlags: 0 @@ -2381,7 +2357,6 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 @@ -2433,7 +2408,7 @@ Transform: m_Children: - {fileID: 772203958} m_Father: {fileID: 0} - m_RootOrder: 8 + m_RootOrder: 7 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1398767341 GameObject: @@ -2493,7 +2468,6 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 @@ -2606,6 +2580,7 @@ MonoBehaviour: GlobalObjectIdHash: 1148320762 AlwaysReplicateAsRoot: 0 DontDestroyWithOwner: 0 + AutoObjectParentSync: 1 --- !u!54 &1402467447 Rigidbody: m_ObjectHideFlags: 0 @@ -2646,7 +2621,6 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 @@ -2698,7 +2672,7 @@ Transform: m_Children: - {fileID: 1237561006} m_Father: {fileID: 0} - m_RootOrder: 9 + m_RootOrder: 8 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1463459130 GameObject: @@ -2744,7 +2718,6 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 @@ -2855,7 +2828,6 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 @@ -2952,7 +2924,6 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 @@ -3020,6 +2991,7 @@ MonoBehaviour: GlobalObjectIdHash: 2710131580 AlwaysReplicateAsRoot: 0 DontDestroyWithOwner: 0 + AutoObjectParentSync: 1 --- !u!114 &1475593096 MonoBehaviour: m_ObjectHideFlags: 0 @@ -3186,7 +3158,6 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 @@ -3225,6 +3196,182 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1636734282} m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1643885206 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1643885211} + - component: {fileID: 1643885210} + - component: {fileID: 1643885209} + - component: {fileID: 1643885208} + - component: {fileID: 1643885207} + - component: {fileID: 1643885212} + - component: {fileID: 1643885213} + m_Layer: 0 + m_Name: NetworkTransformLegacy + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1643885207 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1643885206} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: df4fbe773fc544428171994e08b0483f, type: 3} + m_Name: + m_EditorClassIdentifier: + FixedSendsPerSecond: 20 + AssumeSyncedSends: 1 + InterpolatePosition: 1 + SnapDistance: 10 + InterpolateServer: 1 + MinMeters: 0.15 + MinDegrees: 1.5 + ExtrapolatePosition: 0 + MaxSendsToExtrapolate: 5 + Channel: + EnableRange: 0 + EnableNonProvokedResendChecks: 0 + DistanceSendrate: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 20 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 500 + value: 20 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 +--- !u!65 &1643885208 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1643885206} + 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 &1643885209 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1643885206} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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 &1643885210 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1643885206} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &1643885211 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1643885206} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -10.29, y: 1.55, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 11 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1643885212 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1643885206} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} + m_Name: + m_EditorClassIdentifier: + GlobalObjectIdHash: 1649186279 + AlwaysReplicateAsRoot: 0 + DontDestroyWithOwner: 0 + AutoObjectParentSync: 1 +--- !u!114 &1643885213 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1643885206} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 307c40a41954948e7a36bb6b64b4b9cb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_MoveSpeed: 5 + m_RotationSpeed: 30 --- !u!1 &1815329519 GameObject: m_ObjectHideFlags: 0 @@ -3435,7 +3582,6 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 @@ -3474,4 +3620,3 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2036456027} m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} - \ No newline at end of file diff --git a/testproject/Assets/Scripts/NetworkTransformLegacy.cs b/testproject/Assets/Scripts/NetworkTransformLegacy.cs new file mode 100644 index 0000000000..4ec7d6628a --- /dev/null +++ b/testproject/Assets/Scripts/NetworkTransformLegacy.cs @@ -0,0 +1,375 @@ +using System.Linq; +using System.Collections.Generic; +using MLAPI; +using UnityEngine; +using MLAPI.Messaging; + +namespace Sam +{ + /// + /// A prototype component for syncing transforms + /// + [AddComponentMenu("MLAPI/NetworkTransformLegacy")] + public class NetworkTransformLegacy : NetworkBehaviour + { + internal class ClientSendInfo + { + public float LastSent; + public Vector3? LastMissedPosition; + public Quaternion? LastMissedRotation; + } + + /// + /// The base amount of sends per seconds to use when range is disabled + /// + [Range(0, 120)] + public float FixedSendsPerSecond = 20f; + + /// + /// Is the sends per second assumed to be the same across all instances + /// + [Tooltip("This assumes that the SendsPerSecond is synced across clients")] + public bool AssumeSyncedSends = true; + + /// + /// Enable interpolation + /// + [Tooltip("This requires AssumeSyncedSends to be true")] + public bool InterpolatePosition = true; + + /// + /// The distance before snaping to the position + /// + [Tooltip("The transform will snap if the distance is greater than this distance")] + public float SnapDistance = 10f; + + /// + /// Should the server interpolate + /// + public bool InterpolateServer = true; + + /// + /// The min meters to move before a send is sent + /// + public float MinMeters = 0.15f; + + /// + /// The min degrees to rotate before a send it sent + /// + public float MinDegrees = 1.5f; + + /// + /// Enables extrapolation + /// + public bool ExtrapolatePosition = false; + + /// + /// The maximum amount of expected send rates to extrapolate over when awaiting new packets. + /// A higher value will result in continued extrapolation after an object has stopped moving + /// + public float MaxSendsToExtrapolate = 5; + + /// + /// The channel to send the data on + /// + [Tooltip("The channel to send the data on. Uses the default channel if left unspecified")] + public string Channel = null; + + private float m_LerpTime; + private Vector3 m_LerpStartPos; + private Quaternion m_LerpStartRot; + private Vector3 m_LerpEndPos; + private Quaternion m_LerpEndRot; + + private float m_LastSendTime; + private Vector3 m_LastSentPos; + private Quaternion m_LastSentRot; + + private float m_LastReceiveTime; + + /// + /// Enables range based send rate + /// + public bool EnableRange; + + /// + /// Checks for missed sends without provocation. Provocation being a client inside it's normal SendRate + /// + public bool EnableNonProvokedResendChecks; + + /// + /// The curve to use to calculate the send rate + /// + public AnimationCurve DistanceSendrate = AnimationCurve.Constant(0, 500, 20); + + private readonly Dictionary m_ClientSendInfo = new Dictionary(); + + /// + /// The delegate used to check if a move is valid + /// + /// The client id the move is being validated for + /// The previous position + /// The new requested position + /// Returns Whether or not the move is valid + public delegate bool MoveValidationDelegate(ulong clientId, Vector3 oldPos, Vector3 newPos); + + /// + /// If set, moves will only be accepted if the custom delegate returns true + /// + public MoveValidationDelegate IsMoveValidDelegate = null; + + private void OnValidate() + { + if (!AssumeSyncedSends && InterpolatePosition) + { + InterpolatePosition = false; + } + + if (InterpolateServer && !InterpolatePosition) + { + InterpolateServer = false; + } + + if (MinDegrees < 0) + { + MinDegrees = 0; + } + + if (MinMeters < 0) + { + MinMeters = 0; + } + + if (EnableNonProvokedResendChecks && !EnableRange) + { + EnableNonProvokedResendChecks = false; + } + } + + private float GetTimeForLerp(Vector3 pos1, Vector3 pos2) + { + return 1f / DistanceSendrate.Evaluate(Vector3.Distance(pos1, pos2)); + } + + /// + /// Registers message handlers + /// + public override void OnNetworkSpawn() + { + m_LastSentRot = transform.rotation; + m_LastSentPos = transform.position; + + m_LerpStartPos = transform.position; + m_LerpStartRot = transform.rotation; + + m_LerpEndPos = transform.position; + m_LerpEndRot = transform.rotation; + } + + private void Update() + { + if (IsOwner) + { + if (NetworkManager.NetworkTime - m_LastSendTime >= (1f / FixedSendsPerSecond) && (Vector3.Distance(transform.position, m_LastSentPos) > MinMeters || Quaternion.Angle(transform.rotation, m_LastSentRot) > MinDegrees)) + { + m_LastSendTime = NetworkManager.NetworkTime; + m_LastSentPos = transform.position; + m_LastSentRot = transform.rotation; + + if (IsServer) + { + ApplyTransformClientRpc(transform.position, transform.rotation.eulerAngles, + new ClientRpcParams { Send = new ClientRpcSendParams { TargetClientIds = NetworkManager.ConnectedClientsList.Where(c => c.ClientId != OwnerClientId).Select(c => c.ClientId).ToArray() } }); + } + else + { + SubmitTransformServerRpc(transform.position, transform.rotation.eulerAngles); + } + } + } + else + { + //If we are server and interpolation is turned on for server OR we are not server and interpolation is turned on + if ((IsServer && InterpolateServer && InterpolatePosition) || (!IsServer && InterpolatePosition)) + { + if (Vector3.Distance(transform.position, m_LerpEndPos) > SnapDistance) + { + //Snap, set T to 1 (100% of the lerp) + m_LerpTime = 1f; + } + + float sendDelay = (IsServer || !EnableRange || !AssumeSyncedSends || NetworkManager.ConnectedClients[NetworkManager.LocalClientId].PlayerObject == null) ? (1f / FixedSendsPerSecond) : GetTimeForLerp(transform.position, NetworkManager.ConnectedClients[NetworkManager.LocalClientId].PlayerObject.transform.position); + m_LerpTime += Time.unscaledDeltaTime / sendDelay; + + if (ExtrapolatePosition && Time.unscaledTime - m_LastReceiveTime < sendDelay * MaxSendsToExtrapolate) + { + transform.position = Vector3.LerpUnclamped(m_LerpStartPos, m_LerpEndPos, m_LerpTime); + } + else + { + transform.position = Vector3.Lerp(m_LerpStartPos, m_LerpEndPos, m_LerpTime); + } + + if (ExtrapolatePosition && Time.unscaledTime - m_LastReceiveTime < sendDelay * MaxSendsToExtrapolate) + { + transform.rotation = Quaternion.SlerpUnclamped(m_LerpStartRot, m_LerpEndRot, m_LerpTime); + } + else + { + transform.rotation = Quaternion.Slerp(m_LerpStartRot, m_LerpEndRot, m_LerpTime); + } + } + } + + if (IsServer && EnableRange && EnableNonProvokedResendChecks) + { + CheckForMissedSends(); + } + } + + [ClientRpc] + private void ApplyTransformClientRpc(Vector3 position, Vector3 eulerAngles, ClientRpcParams rpcParams = default) + { + if (enabled) + { + ApplyTransformInternal(position, Quaternion.Euler(eulerAngles)); + } + } + + private void ApplyTransformInternal(Vector3 position, Quaternion rotation) + { + if (!enabled) + { + return; + } + + if (InterpolatePosition && (!IsServer || InterpolateServer)) + { + m_LastReceiveTime = Time.unscaledTime; + m_LerpStartPos = transform.position; + m_LerpStartRot = transform.rotation; + m_LerpEndPos = position; + m_LerpEndRot = rotation; + m_LerpTime = 0; + } + else + { + transform.position = position; + transform.rotation = rotation; + } + } + + [ServerRpc] + private void SubmitTransformServerRpc(Vector3 position, Vector3 eulerAngles, ServerRpcParams rpcParams = default) + { + if (!enabled) + { + return; + } + + if (IsMoveValidDelegate != null && !IsMoveValidDelegate(rpcParams.Receive.SenderClientId, m_LerpEndPos, position)) + { + //Invalid move! + //TODO: Add rubber band (just a message telling them to go back) + return; + } + + if (!IsClient) + { + // Dedicated server + ApplyTransformInternal(position, Quaternion.Euler(eulerAngles)); + } + + if (EnableRange) + { + for (int i = 0; i < NetworkManager.ConnectedClientsList.Count; i++) + { + if (!m_ClientSendInfo.TryGetValue(NetworkManager.ConnectedClientsList[i].ClientId, out ClientSendInfo info)) + { + info = new ClientSendInfo() { LastMissedPosition = null, LastMissedRotation = null, LastSent = 0 }; + m_ClientSendInfo.Add(NetworkManager.Singleton.ConnectedClientsList[i].ClientId, info); + } + + Vector3? receiverPosition = NetworkManager.Singleton.ConnectedClientsList[i].PlayerObject == null ? null : new Vector3?(NetworkManager.Singleton.ConnectedClientsList[i].PlayerObject.transform.position); + Vector3? senderPosition = NetworkManager.Singleton.ConnectedClients[OwnerClientId].PlayerObject == null ? null : new Vector3?(NetworkManager.Singleton.ConnectedClients[OwnerClientId].PlayerObject.transform.position); + + if ((receiverPosition == null || senderPosition == null && NetworkManager.NetworkTime - info.LastSent >= (1f / FixedSendsPerSecond)) || NetworkManager.NetworkTime - info.LastSent >= GetTimeForLerp(receiverPosition.Value, senderPosition.Value)) + { + info.LastSent = NetworkManager.NetworkTime; + info.LastMissedPosition = null; + info.LastMissedRotation = null; + + ApplyTransformClientRpc(position, eulerAngles, + new ClientRpcParams { Send = new ClientRpcSendParams { TargetClientIds = new[] { NetworkManager.ConnectedClientsList[i].ClientId } } }); + } + else + { + info.LastMissedPosition = position; + info.LastMissedRotation = Quaternion.Euler(eulerAngles); + } + } + } + else + { + ApplyTransformClientRpc(position, eulerAngles, + new ClientRpcParams { Send = new ClientRpcSendParams { TargetClientIds = NetworkManager.ConnectedClientsList.Where(c => c.ClientId != OwnerClientId).Select(c => c.ClientId).ToArray() } }); + } + } + + private void CheckForMissedSends() + { + for (int i = 0; i < NetworkManager.ConnectedClientsList.Count; i++) + { + if (!m_ClientSendInfo.ContainsKey(NetworkManager.ConnectedClientsList[i].ClientId)) + { + m_ClientSendInfo.Add(NetworkManager.ConnectedClientsList[i].ClientId, new ClientSendInfo() + { + LastMissedPosition = null, + LastMissedRotation = null, + LastSent = 0 + }); + } + + ClientSendInfo info = m_ClientSendInfo[NetworkManager.ConnectedClientsList[i].ClientId]; + Vector3? receiverPosition = NetworkManager.ConnectedClientsList[i].PlayerObject == null ? null : new Vector3?(NetworkManager.ConnectedClientsList[i].PlayerObject.transform.position); + Vector3? senderPosition = NetworkManager.ConnectedClients[OwnerClientId].PlayerObject == null ? null : new Vector3?(NetworkManager.ConnectedClients[OwnerClientId].PlayerObject.transform.position); + + if ((receiverPosition == null || senderPosition == null && NetworkManager.NetworkTime - info.LastSent >= (1f / FixedSendsPerSecond)) || NetworkManager.NetworkTime - info.LastSent >= GetTimeForLerp(receiverPosition.Value, senderPosition.Value)) + { + /* why is this??? ->*/ + Vector3? pos = NetworkManager.ConnectedClients[OwnerClientId].PlayerObject == null ? null : new Vector3?(NetworkManager.ConnectedClients[OwnerClientId].PlayerObject.transform.position); + /* why is this??? ->*/ + Vector3? rot = NetworkManager.ConnectedClients[OwnerClientId].PlayerObject == null ? null : new Vector3?(NetworkManager.ConnectedClients[OwnerClientId].PlayerObject.transform.rotation.eulerAngles); + + if (info.LastMissedPosition != null && info.LastMissedRotation != null) + { + info.LastSent = NetworkManager.NetworkTime; + + ApplyTransformClientRpc(info.LastMissedPosition.Value, info.LastMissedRotation.Value.eulerAngles, + new ClientRpcParams { Send = new ClientRpcSendParams { TargetClientIds = new[] { NetworkManager.ConnectedClientsList[i].ClientId } } }); + + info.LastMissedPosition = null; + info.LastMissedRotation = null; + } + } + } + } + + /// + /// Teleports the transform to the given position and rotation + /// + /// The position to teleport to + /// The rotation to teleport to + public void Teleport(Vector3 position, Quaternion rotation) + { + if (InterpolateServer && IsServer || IsClient) + { + m_LerpStartPos = position; + m_LerpStartRot = rotation; + m_LerpEndPos = position; + m_LerpEndRot = rotation; + m_LerpTime = 0; + } + } + } +} \ No newline at end of file diff --git a/testproject/Assets/Scripts/NetworkTransformLegacy.cs.meta b/testproject/Assets/Scripts/NetworkTransformLegacy.cs.meta new file mode 100644 index 0000000000..d55a2a45cd --- /dev/null +++ b/testproject/Assets/Scripts/NetworkTransformLegacy.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: df4fbe773fc544428171994e08b0483f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/testproject/Packages/manifest.json b/testproject/Packages/manifest.json index 4bc3118fdb..92929ff725 100644 --- a/testproject/Packages/manifest.json +++ b/testproject/Packages/manifest.json @@ -6,6 +6,8 @@ "com.unity.ide.vscode": "1.2.3", "com.unity.multiplayer.mlapi": "file:../../com.unity.multiplayer.mlapi", "com.unity.multiplayer.transport.utp": "file:../../com.unity.multiplayer.transport.utp", + "com.veriorpies.parrelsync": "https://github.com/VeriorPies/ParrelSync.git?path=/ParrelSync", + "com.mlapi.contrib.transport.litenetlib": "https://github.com/Unity-Technologies/mlapi-community-contributions.git?path=/Transports/com.mlapi.contrib.transport.litenetlib#3f0350ae57befd5ea7deabb1db310eb77704f58e", "com.unity.package-validation-suite": "0.19.2-preview", "com.unity.test-framework": "1.1.27", "com.unity.test-framework.performance": "2.3.1-preview", diff --git a/testproject/Packages/packages-lock.json b/testproject/Packages/packages-lock.json index bc2860bfca..334802f36d 100644 --- a/testproject/Packages/packages-lock.json +++ b/testproject/Packages/packages-lock.json @@ -1,5 +1,12 @@ { "dependencies": { + "com.mlapi.contrib.transport.litenetlib": { + "version": "https://github.com/Unity-Technologies/mlapi-community-contributions.git?path=/Transports/com.mlapi.contrib.transport.litenetlib#3f0350ae57befd5ea7deabb1db310eb77704f58e", + "depth": 0, + "source": "git", + "dependencies": {}, + "hash": "3f0350ae57befd5ea7deabb1db310eb77704f58e" + }, "com.unity.burst": { "version": "1.3.2", "depth": 3, @@ -180,6 +187,13 @@ "com.unity.modules.imgui": "1.0.0" } }, + "com.veriorpies.parrelsync": { + "version": "https://github.com/VeriorPies/ParrelSync.git?path=/ParrelSync", + "depth": 0, + "source": "git", + "dependencies": {}, + "hash": "bb3d5067e49e403d8b8ba15c036d313b4dd2c696" + }, "com.unity.modules.ai": { "version": "1.0.0", "depth": 0, From 03262b3f9d7fbb6ae3ed9026f378a0cbcfa91362 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Fri, 23 Jul 2021 16:40:48 -0400 Subject: [PATCH 003/113] # --- .../Prototyping/Interpolator.meta | 8 + ...ufferedLinearInterpolatorVector3Factory.cs | 152 ++ ...edLinearInterpolatorVector3Factory.cs.meta | 11 + .../Prototyping/Interpolator/IInterpolator.cs | 20 + .../Interpolator/IInterpolator.cs.meta | 11 + .../Interpolator/NoInterpolationFactory.cs | 43 + .../NoInterpolationFactory.cs.meta | 11 + .../PositionLinearInterpolatorFactory.cs | 60 + .../PositionLinearInterpolatorFactory.cs.meta | 11 + .../Prototyping/NetworkTransform.cs | 85 +- .../Runtime/Core/NetworkManager.cs | 2 +- testproject/Assets/MoveInCircle.cs | 18 +- testproject/Assets/Prefabs/PlayerCube.prefab | 2 +- testproject/Assets/Scenes/SampleScene.unity | 154 +- testproject/Assets/Scenes/ZooSam.unity | 1338 +++++++++++++++++ testproject/Assets/Scenes/ZooSam.unity.meta | 7 + .../Assets/Scripts/NetworkTransformLegacy.cs | 12 +- .../ProjectSettings/EditorBuildSettings.asset | 3 + 18 files changed, 1921 insertions(+), 27 deletions(-) create mode 100644 com.unity.multiplayer.mlapi/Prototyping/Interpolator.meta create mode 100644 com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3Factory.cs create mode 100644 com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3Factory.cs.meta create mode 100644 com.unity.multiplayer.mlapi/Prototyping/Interpolator/IInterpolator.cs create mode 100644 com.unity.multiplayer.mlapi/Prototyping/Interpolator/IInterpolator.cs.meta create mode 100644 com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolationFactory.cs create mode 100644 com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolationFactory.cs.meta create mode 100644 com.unity.multiplayer.mlapi/Prototyping/Interpolator/PositionLinearInterpolatorFactory.cs create mode 100644 com.unity.multiplayer.mlapi/Prototyping/Interpolator/PositionLinearInterpolatorFactory.cs.meta create mode 100644 testproject/Assets/Scenes/ZooSam.unity create mode 100644 testproject/Assets/Scenes/ZooSam.unity.meta diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator.meta b/com.unity.multiplayer.mlapi/Prototyping/Interpolator.meta new file mode 100644 index 0000000000..0bfe5f770f --- /dev/null +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 32190d476d5de4dc8b7ee8208bde82a0 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3Factory.cs b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3Factory.cs new file mode 100644 index 0000000000..1270401549 --- /dev/null +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3Factory.cs @@ -0,0 +1,152 @@ +using System.Collections.Generic; +using MLAPI; +using MLAPI.Timing; +using UnityEngine; + +namespace DefaultNamespace +{ + public class BufferedLinearInterpolatorVector3Factory : InterpolatorVector3Factory + { + public override IInterpolator CreateInterpolator() + { + return new BufferedLinearInterpolatorVector3(); + } + } + + public abstract class BufferedLinearInterpolator : IInterpolator where T : struct + { + public int BufferAmountTick = 3; + public const float InterpolationConfigTimeSec = 0.100f; // todo remove const for config + + struct BufferedItem + { + public T item; + public int tickSent; + } + + // private double ServerTime => NetworkManager.Singleton.ServerTime.Time; + private double ServerTick => NetworkManager.Singleton.ServerTime.Tick; + private double ServerTickBeingHandledForBuffering => ServerTick;// - BufferAmountTick; + + T m_LerpStartValue; + T m_LerpEndValue; + + private T m_CurrentValue; + + private List> m_Buffer = new List>(); + + private int samPreviousToLast; + private void TryConsumeFromBuffer() + { + var count = m_Buffer.Count; + int nbConsumed = 0; + for (int i = m_Buffer.Count - 1; i >= 0; i--) + { + var bufferedValue = m_Buffer[i]; + if (bufferedValue.tickSent <= ServerTickBeingHandledForBuffering) + { + m_LerpStartValue = m_LerpEndValue; + m_LerpEndValue = bufferedValue.item; + samPreviousToLast = m_ValueLastTick; + m_ValueLastTick = bufferedValue.tickSent; + Debug.Log($"hellooooo {bufferedValue.tickSent}"); + m_Buffer.RemoveAt(i); + nbConsumed++; + + var pos = m_LerpEndValue is Vector3 value ? value : default; + Debug.DrawLine(pos, pos + Random.Range(0f, 1f) * Vector3.up + Random.Range(0f, 1f) * Vector3.left, Color.green, 10, false); + + + float maxTickAllowedInBuffer = NetworkManager.Singleton.NetworkTickSystem.TickRate; + + // we're not getting values regularly from the network. This means interpolation needs to adapt + m_InterpolationTimeSec = InterpolationConfigTimeSec; + + // if (ServerTickBeingHandledForBuffering - bufferedValue.tickSent < maxTickAllowedInBuffer) + // { + // // Consume one value at a time, but make sure we don't have an ever growing buffer. We only use one item if we're under our max amount + // break; + // } + + // Debug.LogWarning("Consuming more than one value at a time from buffer"); // todo remove? + } + } + + Debug.Log($"Buffer size: {count}, nb consumed: {nbConsumed}"); + var pos2 = m_LerpEndValue is Vector3 value2 ? value2 : default; + + Debug.DrawLine(pos2, pos2 + Vector3.down * (m_ValueLastTick - samPreviousToLast), Color.cyan, 10, false); + for (int i = 0; i < count; i++) + { + Debug.DrawLine(pos2 + Vector3.up * (i+1), pos2 + Vector3.up* (i+1) + Vector3.left, Color.white, 10, false); + } + } + + public void Update(float deltaTime) + { + TryConsumeFromBuffer(); + + var timeB = new NetworkTime(NetworkManager.Singleton.NetworkTickSystem.TickRate, m_ValueLastTick); + var timeA = timeB - timeB.FixedDeltaTime;// + double range = timeB.Time - timeA.Time; + float t = (float)((NetworkManager.Singleton.NetworkTickSystem.ServerTime.Time - timeA.FixedDeltaTime - timeA.Time) / range); + Debug.Log($"ttttttttttttt {t}"); + // m_CurrentValue = Interpolate(m_LerpStartValue, m_LerpEndValue, t); + m_CurrentValue = m_LerpEndValue; + + var pos = m_CurrentValue is Vector3 value ? value : default; + Debug.DrawLine(pos, pos + Vector3.up, Color.magenta, 10, false); + } + + public void FixedUpdate(float fixedDeltaTime) + { + + } + + + // private int timeInitializedDebug = 20; // number so we wait a few frames to grab the offset. this is debug + // private double clientServerOffsetDebug; + private float m_InterpolationTimeSec; + private int m_ValueLastTick; + + public void AddMeasurement(T newMeasurement, int SentTick) + { + var debugPos = newMeasurement is Vector3 value ? value : default; + Debug.DrawLine(debugPos, debugPos + Vector3.right + Vector3.up, Color.red, 10, false); + + Debug.Log($"Adding measurement {Time.time}"); + m_Buffer.Add(new BufferedItem() {item = newMeasurement, tickSent = SentTick}); + m_Buffer.Sort((item1, item2) => item2.tickSent.CompareTo(item1.tickSent)); + } + + public T GetInterpolatedValue() + { + return m_CurrentValue; + } + + public void Teleport(T value) + { + m_CurrentValue = value; + m_LerpEndValue = value; + m_LerpStartValue = value; + } + + public abstract T Interpolate(T start, T end, float time); + } + + public class BufferedLinearInterpolatorVector3 : BufferedLinearInterpolator + { + public override Vector3 Interpolate(Vector3 start, Vector3 end, float time) + { + return Vector3.LerpUnclamped(start, end, time); + } + } + + public class BufferedLinearInterpolatorQuaternion : BufferedLinearInterpolator + { + public override Quaternion Interpolate(Quaternion start, Quaternion end, float time) + { + return Quaternion.Slerp(start, end, time); + } + } +} \ No newline at end of file diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3Factory.cs.meta b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3Factory.cs.meta new file mode 100644 index 0000000000..957c278840 --- /dev/null +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3Factory.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 199dd81621cd441c19cc731e8d29a217 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/IInterpolator.cs b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/IInterpolator.cs new file mode 100644 index 0000000000..f4cf96ee92 --- /dev/null +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/IInterpolator.cs @@ -0,0 +1,20 @@ +using UnityEngine; + +public interface IInterpolator +{ + public void Update(float deltaTime); + public void FixedUpdate(float fixedDeltaTime); + public void AddMeasurement(T newMeasurement, int SentTick); + public T GetInterpolatedValue(); + public void Teleport(T value); +} + +public abstract class InterpolatorFactory : ScriptableObject +{ + public abstract IInterpolator CreateInterpolator(); +} + +public abstract class InterpolatorVector3Factory : InterpolatorFactory +{ + +} \ No newline at end of file diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/IInterpolator.cs.meta b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/IInterpolator.cs.meta new file mode 100644 index 0000000000..dcef404a65 --- /dev/null +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/IInterpolator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 071f976e9c2d74c5bb836da710fe368e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolationFactory.cs b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolationFactory.cs new file mode 100644 index 0000000000..d04e8296f9 --- /dev/null +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolationFactory.cs @@ -0,0 +1,43 @@ +using UnityEngine; + +namespace DefaultNamespace +{ + [CreateAssetMenu(fileName = "NoInterpolation", menuName = "MLAPI/NoInterpolation", order = 1)] + public class NoInterpolationFactory : InterpolatorVector3Factory + { + public override IInterpolator CreateInterpolator() + { + return new NoInterpolation(); + } + } + + public class NoInterpolation : IInterpolator + { + public Vector3 m_Current; + + public void Update(float deltaTime) + { + // nothing + } + + public void FixedUpdate(float fixedDeltaTime) + { + + } + + public void AddMeasurement(Vector3 newMeasurement, int SentTick) + { + m_Current = newMeasurement; + } + + public Vector3 GetInterpolatedValue() + { + return m_Current; + } + + public void Teleport(Vector3 value) + { + m_Current = value; + } + } +} \ No newline at end of file diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolationFactory.cs.meta b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolationFactory.cs.meta new file mode 100644 index 0000000000..46b8fdc1d8 --- /dev/null +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolationFactory.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6fd1b15ec60324368a3c724e031254f4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/PositionLinearInterpolatorFactory.cs b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/PositionLinearInterpolatorFactory.cs new file mode 100644 index 0000000000..8ffc612367 --- /dev/null +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/PositionLinearInterpolatorFactory.cs @@ -0,0 +1,60 @@ +using System; +using UnityEngine; + +namespace DefaultNamespace +{ + [CreateAssetMenu(fileName = "PositionLinearInterpolator", menuName = "MLAPI/PositionLinearInterpolator", order = 1)] + public class PositionLinearInterpolatorFactory : InterpolatorVector3Factory + { + [SerializeField] + private float m_MaxLerpTime = 0.2f; + + public override IInterpolator CreateInterpolator() + { + return new PositionLinearInterpolator(m_MaxLerpTime); + } + } + + public class PositionLinearInterpolator : IInterpolator + { + public float m_CurrentTime; + public Vector3 m_StartVector; + public Vector3 m_EndVector; + public Vector3 m_UpdatedVector; + + private float m_MaxLerpTime; + + public PositionLinearInterpolator(float maxLerpTime) + { + m_MaxLerpTime = maxLerpTime; + } + + public void Update(float deltaTime) + { + m_CurrentTime += deltaTime; + m_UpdatedVector = Vector3.Lerp(m_StartVector, m_EndVector, m_CurrentTime / m_MaxLerpTime); + } + + public void FixedUpdate(float fixedDeltaTime) + { + + } + + public void AddMeasurement(Vector3 newMeasurement, int SentTick) + { + m_EndVector = newMeasurement; + m_CurrentTime = 0; + m_StartVector = m_UpdatedVector; + } + + public Vector3 GetInterpolatedValue() + { + return m_UpdatedVector; + } + + public void Teleport(Vector3 value) + { + m_UpdatedVector = value; + } + } +} \ No newline at end of file diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/PositionLinearInterpolatorFactory.cs.meta b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/PositionLinearInterpolatorFactory.cs.meta new file mode 100644 index 0000000000..634ea8c755 --- /dev/null +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/PositionLinearInterpolatorFactory.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d27105c543ddf4083b4918635b19348a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs b/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs index c311c957d1..a0455e6fb7 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs @@ -1,8 +1,10 @@ using System; +using DefaultNamespace; using MLAPI.NetworkVariable; using MLAPI.Serialization; using MLAPI.Transports; using UnityEngine; +using UnityEngine.UIElements; namespace MLAPI.Prototyping { @@ -31,12 +33,28 @@ private class NetworkState : INetworkSerializable public Quaternion Rotation; public Vector3 Scale; + public int SentTick; + + public NetworkState(NetworkState copy) + { + InLocalSpace = copy.InLocalSpace; + Position = copy.Position; + Rotation = copy.Rotation; + Scale = copy.Scale; + SentTick = copy.SentTick; + } + + public NetworkState() + { + } + public void NetworkSerialize(NetworkSerializer serializer) { serializer.Serialize(ref InLocalSpace); serializer.Serialize(ref Position); serializer.Serialize(ref Rotation); serializer.Serialize(ref Scale); + serializer.Serialize(ref SentTick); } } @@ -51,7 +69,8 @@ public void NetworkSerialize(NetworkSerializer serializer) /// The network channel to use send updates /// [Tooltip("The network channel to use send updates")] - public NetworkChannel Channel = NetworkChannel.PositionUpdate; + private NetworkChannel Channel = NetworkChannel.SyncChannel; + // private NetworkChannel Channel = NetworkChannel.PositionUpdate; /// /// Sets whether this transform should sync in local space or in world space. @@ -68,6 +87,8 @@ public void NetworkSerialize(NetworkSerializer serializer) [SerializeField, Range(0, 120), Tooltip("The base amount of sends per seconds to use when range is disabled")] public float FixedSendsPerSecond = 30f; + public IInterpolator PositionInterpolator = new BufferedLinearInterpolatorVector3(); + private Transform m_Transform; // cache the transform component to reduce unnecessary bounce between managed and native private readonly NetworkVariable m_NetworkState = new NetworkVariable(new NetworkState()); private NetworkState m_PrevNetworkState; @@ -92,13 +113,13 @@ private bool IsNetworkStateDirty(NetworkState networkState) isDirty |= networkState.InLocalSpace != InLocalSpace; if (InLocalSpace) { - isDirty |= networkState.Position != m_Transform.localPosition; + isDirty |= networkState.Position != PositionInterpolator.GetInterpolatedValue(); isDirty |= networkState.Rotation != m_Transform.localRotation; isDirty |= networkState.Scale != m_Transform.localScale; } else { - isDirty |= networkState.Position != m_Transform.position; + isDirty |= networkState.Position != PositionInterpolator.GetInterpolatedValue(); isDirty |= networkState.Rotation != m_Transform.rotation; isDirty |= networkState.Scale != m_Transform.lossyScale; } @@ -106,9 +127,13 @@ private bool IsNetworkStateDirty(NetworkState networkState) return isDirty; } + private int previousTickSam; + private Vector3 previousPosSam; private void UpdateNetworkState() { m_NetworkState.Value.InLocalSpace = InLocalSpace; + // m_NetworkState.Value.SentTime = Time.realtimeSinceStartup; + m_NetworkState.Value.SentTick = NetworkManager.Singleton.LocalTime.Tick; if (InLocalSpace) { m_NetworkState.Value.Position = m_Transform.localPosition; @@ -122,11 +147,18 @@ private void UpdateNetworkState() m_NetworkState.Value.Scale = m_Transform.lossyScale; } + Debug.Log($"sam asdf distance {Math.Round((m_NetworkState.Value.Position - previousPosSam).magnitude, 2)} tick diff {m_NetworkState.Value.SentTick - previousTickSam} sam"); + previousTickSam = m_NetworkState.Value.SentTick; + previousPosSam = m_NetworkState.Value.Position; + m_NetworkState.SetDirty(true); } private void ApplyNetworkState(NetworkState netState) { + netState = new NetworkState(netState); + netState.Position = PositionInterpolator.GetInterpolatedValue(); + InLocalSpace = netState.InLocalSpace; if (InLocalSpace) { @@ -146,6 +178,8 @@ private void ApplyNetworkState(NetworkState netState) m_PrevNetworkState = netState; } + + private int oldTick; private void OnNetworkStateChanged(NetworkState oldState, NetworkState newState) { if (!NetworkObject.IsSpawned) @@ -160,7 +194,12 @@ private void OnNetworkStateChanged(NetworkState oldState, NetworkState newState) return; } - ApplyNetworkState(newState); + // PositionInterpolator.AddMeasurement(newState.Position, NetworkManager.Singleton.ServerTime.Time); + + Debug.Log($"distance sam {Math.Round((newState.Position - oldState.Position).magnitude, 2)}"); + Debug.Log($"diff tick sam {(newState.SentTick - oldState.SentTick, 2)}"); + // oldTick = NetworkManager.Singleton.ServerTime.Tick; + PositionInterpolator.AddMeasurement(newState.Position, newState.SentTick); } private void UpdateNetVarPerms() @@ -184,6 +223,7 @@ private void UpdateNetVarPerms() private void Awake() { m_Transform = transform; + PositionInterpolator.Teleport(m_Transform.position); UpdateNetVarPerms(); @@ -196,6 +236,10 @@ private void Awake() public override void OnNetworkSpawn() { m_PrevNetworkState = null; + if (enabled) // todo Luke fix your UX + { + NetworkManager.NetworkTickSystem.Tick += NetworkTickUpdate; + } } private void OnDestroy() @@ -203,24 +247,45 @@ private void OnDestroy() m_NetworkState.OnValueChanged -= OnNetworkStateChanged; } - private void FixedUpdate() + private void NetworkTickUpdate() { if (!NetworkObject.IsSpawned) { return; } - if (CanUpdateTransform && IsNetworkStateDirty(m_NetworkState.Value)) + if (CanUpdateTransform) //&& IsNetworkStateDirty(m_NetworkState.Value)) { UpdateNetworkState(); } else { - if (IsNetworkStateDirty(m_PrevNetworkState)) - { - Debug.LogWarning("A local change without authority detected, revert back to latest network state!"); - } + // if (IsNetworkStateDirty(m_PrevNetworkState)) + // { + // Debug.LogWarning("A local change without authority detected, revert back to latest network state!"); + // ApplyNetworkState(m_NetworkState.Value); + // } + + // PositionInterpolator.FixedUpdate(Time.fixedDeltaTime); + } + } + + private int debugOldTime = 0; + + private void Update() + { + // Debug.Log("gaga "+Math.Round(Time.time - (float)NetworkManager.Singleton.ServerTime.Time, 2)); + // Debug.Log($"sam {Math.Round(NetworkManager.Singleton.ServerTime.Time - debugOldTime, 2)}"); + // debugOldTime = NetworkManager.Singleton.ServerTime.Time; + if (!NetworkObject.IsSpawned) + { + return; + } + + if (!CanUpdateTransform) + { + PositionInterpolator.Update(Time.deltaTime); ApplyNetworkState(m_NetworkState.Value); } } diff --git a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs index 2cc1765c58..8d7fe09ed4 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs @@ -396,7 +396,7 @@ private void Initialize(bool server) } else { - NetworkTimeSystem = new NetworkTimeSystem(1.0 / NetworkConfig.TickRate, 1.0 / NetworkConfig.TickRate, 0.2); + NetworkTimeSystem = new NetworkTimeSystem(1.0 / NetworkConfig.TickRate, 3.0 / NetworkConfig.TickRate, 0.2); } NetworkTickSystem = new NetworkTickSystem(NetworkConfig.TickRate, 0, 0); diff --git a/testproject/Assets/MoveInCircle.cs b/testproject/Assets/MoveInCircle.cs index 3586378e93..30ec26bdec 100644 --- a/testproject/Assets/MoveInCircle.cs +++ b/testproject/Assets/MoveInCircle.cs @@ -1,7 +1,7 @@ using MLAPI; using UnityEngine; -public class MoveInCircle : MonoBehaviour +public class MoveInCircle : NetworkBehaviour { [SerializeField] private float m_MoveSpeed = 5; @@ -9,12 +9,22 @@ public class MoveInCircle : MonoBehaviour [SerializeField] private float m_RotationSpeed = 30; - void Update() + private Vector3 oldPosition; + + public override void OnNetworkSpawn() + { + base.OnNetworkSpawn();// + NetworkManager.NetworkTickSystem.Tick += NetworkTickUpdate; + } + + void NetworkTickUpdate() // doesn't work with Update? { if (NetworkManager.Singleton.IsServer) { - transform.position = transform.position + m_MoveSpeed * transform.forward * Time.deltaTime; - transform.Rotate(0, m_RotationSpeed * Time.deltaTime, 0); + oldPosition = transform.position; + transform.position = transform.position + transform.forward * (m_MoveSpeed * NetworkManager.LocalTime.FixedDeltaTime); + Debug.Log($"ewqqwe {(transform.position - oldPosition).magnitude}"); + transform.Rotate(0, m_RotationSpeed * NetworkManager.LocalTime.FixedDeltaTime, 0); } } } diff --git a/testproject/Assets/Prefabs/PlayerCube.prefab b/testproject/Assets/Prefabs/PlayerCube.prefab index fc029f0998..d2dea896cf 100644 --- a/testproject/Assets/Prefabs/PlayerCube.prefab +++ b/testproject/Assets/Prefabs/PlayerCube.prefab @@ -240,7 +240,7 @@ MonoBehaviour: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 8685790303553767886} - m_Enabled: 1 + m_Enabled: 0 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3} m_Name: diff --git a/testproject/Assets/Scenes/SampleScene.unity b/testproject/Assets/Scenes/SampleScene.unity index 82e9518f67..5d5778b190 100644 --- a/testproject/Assets/Scenes/SampleScene.unity +++ b/testproject/Assets/Scenes/SampleScene.unity @@ -535,7 +535,7 @@ MonoBehaviour: m_EditorClassIdentifier: Authority: 0 Channel: 10 - InLocalSpace: 1 + InLocalSpace: 0 FixedSendsPerSecond: 30 --- !u!1 &403665142 GameObject: @@ -1131,6 +1131,150 @@ LightingSettings: m_PVRFilteringAtrousPositionSigmaDirect: 0.5 m_PVRFilteringAtrousPositionSigmaIndirect: 2 m_PVRFilteringAtrousPositionSigmaAO: 1 +--- !u!1 &678326392 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 678326399} + - component: {fileID: 678326398} + - component: {fileID: 678326397} + - component: {fileID: 678326396} + - component: {fileID: 678326394} + - component: {fileID: 678326393} + - component: {fileID: 678326395} + m_Layer: 0 + m_Name: NetworkTransformBuffered + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &678326393 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 678326392} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 307c40a41954948e7a36bb6b64b4b9cb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_MoveSpeed: 5 + m_RotationSpeed: 30 +--- !u!114 &678326394 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 678326392} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} + m_Name: + m_EditorClassIdentifier: + GlobalObjectIdHash: 1079447764 + AlwaysReplicateAsRoot: 0 + DontDestroyWithOwner: 0 + AutoObjectParentSync: 1 +--- !u!114 &678326395 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 678326392} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3} + m_Name: + m_EditorClassIdentifier: + Authority: 0 + Channel: 6 + InLocalSpace: 0 + FixedSendsPerSecond: 30 +--- !u!65 &678326396 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 678326392} + 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 &678326397 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 678326392} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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 &678326398 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 678326392} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &678326399 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 678326392} + m_LocalRotation: {x: 0, y: 1, z: 0, w: 0} + m_LocalPosition: {x: 7.71, y: 1.55, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 12 + m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} --- !u!1 &702051983 GameObject: m_ObjectHideFlags: 0 @@ -2267,9 +2411,9 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3} m_Name: m_EditorClassIdentifier: - Authority: 2 + Authority: 0 Channel: 10 - InLocalSpace: 1 + InLocalSpace: 0 FixedSendsPerSecond: 30 --- !u!114 &1397037319 MonoBehaviour: @@ -2524,9 +2668,9 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3} m_Name: m_EditorClassIdentifier: - Authority: 1 + Authority: 0 Channel: 10 - InLocalSpace: 1 + InLocalSpace: 0 FixedSendsPerSecond: 30 --- !u!114 &1402467446 MonoBehaviour: diff --git a/testproject/Assets/Scenes/ZooSam.unity b/testproject/Assets/Scenes/ZooSam.unity new file mode 100644 index 0000000000..3efe91ef5b --- /dev/null +++ b/testproject/Assets/Scenes/ZooSam.unity @@ -0,0 +1,1338 @@ +%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.61387503, g: 0.6891243, b: 0.8396226, 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: 3 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 2100000, guid: 00cf8ac777c8c42e8967157f70fbfcbf, type: 2} + 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: 705507994} + m_IndirectSpecularColor: {r: 0.22070551, g: 0.22116166, b: 0.45032424, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 12 + m_GIWorkflowMode: 0 + 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: 500 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 500 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 2 + m_PVRDenoiserTypeDirect: 0 + m_PVRDenoiserTypeIndirect: 0 + m_PVRDenoiserTypeAO: 0 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 0 + 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: 633987594} +--- !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 &346676326 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 346676330} + - component: {fileID: 346676329} + - component: {fileID: 346676328} + - component: {fileID: 346676327} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!65 &346676327 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 346676326} + 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 &346676328 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 346676326} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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 &346676329 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 346676326} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &346676330 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 346676326} + 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: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &620561609 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 620561612} + - component: {fileID: 620561611} + - component: {fileID: 620561610} + - component: {fileID: 620561613} + m_Layer: 0 + m_Name: NetworkManager + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &620561610 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 620561609} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b84c2d8dfe509a34fb59e2b81f8e1319, type: 3} + m_Name: + m_EditorClassIdentifier: + MessageBufferSize: 5120 + MaxConnections: 100 + MaxSentMessageQueueSize: 128 + ConnectAddress: 127.0.0.1 + ConnectPort: 7777 + ServerListenPort: 7777 + ServerWebsocketListenPort: 8887 + SupportWebsocket: 0 + Channels: [] + UseMLAPIRelay: 0 + MLAPIRelayAddress: 184.72.104.138 + MLAPIRelayPort: 8888 + MessageSendMode: 0 +--- !u!114 &620561611 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 620561609} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 593a2fe42fa9d37498c96f9a383b6521, type: 3} + m_Name: + m_EditorClassIdentifier: + DontDestroy: 1 + RunInBackground: 1 + LogLevel: 1 + NetworkConfig: + ProtocolVersion: 0 + NetworkTransport: {fileID: 620561610} + RegisteredScenes: + - SampleScene + - ZooSam + AllowRuntimeSceneChanges: 0 + PlayerPrefab: {fileID: 8685790303553767886, guid: 96e0a72e30d0c46c8a5c9a750e8f5807, + type: 3} + NetworkPrefabs: [] + TickRate: 20 + ClientConnectionBufferTimeout: 10 + ConnectionApproval: 0 + ConnectionData: + EnableTimeResync: 0 + TimeResyncInterval: 30 + EnableNetworkVariable: 1 + EnsureNetworkVariableLengthSafety: 0 + EnableSceneManagement: 1 + ForceSamePrefabs: 1 + RecycleNetworkIds: 1 + NetworkIdRecycleDelay: 120 + RpcHashSize: 0 + LoadSceneTimeOut: 120 + EnableMessageBuffering: 1 + MessageBufferTimeout: 20 + EnableNetworkLogs: 1 +--- !u!4 &620561612 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 620561609} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 1} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &620561613 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 620561609} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: db28424c2ae12f64da25c9ecccded6b1, type: 3} + m_Name: + m_EditorClassIdentifier: + Port: 7777 + Address: 127.0.0.1 + PingInterval: 1 + DisconnectTimeout: 5 + ReconnectDelay: 0.5 + MaxConnectAttempts: 10 + channels: [] + MessageBufferSize: 5120 + SimulatePacketLossChance: 0 + SimulateMinLatency: 100 + SimulateMaxLatency: 100 +--- !u!1001 &627808638 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 1333567166} + m_Modifications: + - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + type: 3} + propertyPath: m_Pivot.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + type: 3} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + type: 3} + propertyPath: m_AnchorMax.x + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + type: 3} + propertyPath: m_AnchorMax.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + type: 3} + propertyPath: m_AnchorMin.x + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + type: 3} + propertyPath: m_AnchorMin.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + type: 3} + propertyPath: m_SizeDelta.x + value: 20 + objectReference: {fileID: 0} + - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + type: 3} + propertyPath: m_SizeDelta.y + value: 25 + objectReference: {fileID: 0} + - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + type: 3} + propertyPath: m_AnchoredPosition.x + value: -23.40039 + objectReference: {fileID: 0} + - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + type: 3} + propertyPath: m_AnchoredPosition.y + value: -23.800293 + objectReference: {fileID: 0} + - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2848221156307247795, guid: 3200770c16e3b2b4ebe7f604154faac7, + type: 3} + propertyPath: m_Name + value: ExitButton + objectReference: {fileID: 0} + - target: {fileID: 5266522511616468950, guid: 3200770c16e3b2b4ebe7f604154faac7, + type: 3} + propertyPath: m_SceneMenuToLoad + value: + objectReference: {fileID: 11400000, guid: c10d995498e0c514a853c3506031d3fb, + type: 2} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 3200770c16e3b2b4ebe7f604154faac7, type: 3} +--- !u!224 &627808639 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + type: 3} + m_PrefabInstance: {fileID: 627808638} + m_PrefabAsset: {fileID: 0} +--- !u!850595691 &633987594 +LightingSettings: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Settings.lighting + serializedVersion: 3 + m_GIWorkflowMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_RealtimeEnvironmentLighting: 1 + m_BounceScale: 1 + m_AlbedoBoost: 1 + m_IndirectOutputScale: 1 + m_UsingShadowmask: 1 + m_BakeBackend: 1 + m_LightmapMaxSize: 1024 + m_BakeResolution: 40 + m_Padding: 2 + m_TextureCompression: 1 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAO: 0 + m_MixedBakeMode: 2 + m_LightmapsBakeMode: 1 + m_FilterMode: 1 + m_LightmapParameters: {fileID: 15204, guid: 0000000000000000f000000000000000, type: 0} + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_RealtimeResolution: 2 + m_ForceWhiteAlbedo: 0 + m_ForceUpdates: 0 + m_FinalGather: 0 + m_FinalGatherRayCount: 256 + m_FinalGatherFiltering: 1 + m_PVRCulling: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVREnvironmentSampleCount: 500 + m_PVREnvironmentReferencePointCount: 2048 + m_LightProbeSampleCountMultiplier: 4 + m_PVRBounces: 2 + m_PVRMinBounces: 2 + m_PVREnvironmentMIS: 0 + m_PVRFilteringMode: 2 + m_PVRDenoiserTypeDirect: 0 + m_PVRDenoiserTypeIndirect: 0 + m_PVRDenoiserTypeAO: 0 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 +--- !u!1 &678326392 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 678326399} + - component: {fileID: 678326398} + - component: {fileID: 678326397} + - component: {fileID: 678326396} + - component: {fileID: 678326394} + - component: {fileID: 678326393} + - component: {fileID: 678326395} + m_Layer: 0 + m_Name: NetworkTransformBuffered + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &678326393 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 678326392} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 307c40a41954948e7a36bb6b64b4b9cb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_MoveSpeed: 5 + m_RotationSpeed: 30 +--- !u!114 &678326394 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 678326392} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} + m_Name: + m_EditorClassIdentifier: + GlobalObjectIdHash: 3301752843 + AlwaysReplicateAsRoot: 0 + DontDestroyWithOwner: 0 + AutoObjectParentSync: 1 +--- !u!114 &678326395 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 678326392} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3} + m_Name: + m_EditorClassIdentifier: + Authority: 0 + InLocalSpace: 0 + FixedSendsPerSecond: 30 +--- !u!65 &678326396 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 678326392} + 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 &678326397 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 678326392} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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 &678326398 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 678326392} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &678326399 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 678326392} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -8.25, y: 1.55, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 702051986} + m_Father: {fileID: 0} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &702051983 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 702051986} + - component: {fileID: 702051985} + - component: {fileID: 702051984} + m_Layer: 0 + m_Name: Camera + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &702051984 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 702051983} + m_Enabled: 1 +--- !u!20 &702051985 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 702051983} + 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: 0 + 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 &702051986 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 702051983} + m_LocalRotation: {x: 0.5, y: -0, z: -0, w: 0.8660254} + m_LocalPosition: {x: 8.25, y: 18.45, z: -16} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 678326399} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 60, y: 0, z: 0} +--- !u!1 &705507993 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 705507995} + - component: {fileID: 705507994} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &705507994 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 705507993} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 1 + m_Shape: 0 + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.802082 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 0.3 + 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: 1 + 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 &705507995 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 705507993} + 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: 0 + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &849106629 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 849106632} + - component: {fileID: 849106631} + - component: {fileID: 849106630} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &849106630 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 849106629} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel + m_InputActionsPerSecond: 10 + m_RepeatDelay: 0.5 + m_ForceModuleActive: 0 +--- !u!114 &849106631 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 849106629} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 10 +--- !u!4 &849106632 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 849106629} + 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: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1333567162 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1333567166} + - component: {fileID: 1333567165} + - component: {fileID: 1333567164} + - component: {fileID: 1333567163} + - component: {fileID: 1333567167} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1333567163 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1333567162} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &1333567164 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1333567162} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 1 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 1280, y: 720} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0.5 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 +--- !u!223 &1333567165 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1333567162} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &1333567166 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1333567162} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_Children: + - {fileID: 627808639} + - {fileID: 1536251758} + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!114 &1333567167 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1333567162} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4390d966eb8724ba2907f775b34e94ea, type: 3} + m_Name: + m_EditorClassIdentifier: + NetworkManager: {fileID: 620561611} + ButtonsRoot: {fileID: 0} +--- !u!224 &1536251758 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, + type: 3} + m_PrefabInstance: {fileID: 1928839749} + m_PrefabAsset: {fileID: 0} +--- !u!1 &1643885206 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1643885211} + - component: {fileID: 1643885210} + - component: {fileID: 1643885209} + - component: {fileID: 1643885208} + - component: {fileID: 1643885207} + - component: {fileID: 1643885212} + - component: {fileID: 1643885213} + m_Layer: 0 + m_Name: NetworkTransformLegacy + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!114 &1643885207 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1643885206} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: df4fbe773fc544428171994e08b0483f, type: 3} + m_Name: + m_EditorClassIdentifier: + FixedSendsPerSecond: 20 + AssumeSyncedSends: 1 + InterpolatePosition: 1 + SnapDistance: 10 + InterpolateServer: 1 + MinMeters: 0.15 + MinDegrees: 1.5 + ExtrapolatePosition: 0 + MaxSendsToExtrapolate: 5 + Channel: + EnableRange: 0 + EnableNonProvokedResendChecks: 0 + DistanceSendrate: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 20 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 500 + value: 20 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 +--- !u!65 &1643885208 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1643885206} + 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 &1643885209 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1643885206} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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 &1643885210 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1643885206} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &1643885211 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1643885206} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -10.29, y: 1.55, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1643885212 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1643885206} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} + m_Name: + m_EditorClassIdentifier: + GlobalObjectIdHash: 3638589847 + AlwaysReplicateAsRoot: 0 + DontDestroyWithOwner: 0 + AutoObjectParentSync: 1 +--- !u!114 &1643885213 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1643885206} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 307c40a41954948e7a36bb6b64b4b9cb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_MoveSpeed: 5 + m_RotationSpeed: 30 +--- !u!1001 &1928839749 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 1333567166} + m_Modifications: + - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, + type: 3} + propertyPath: m_Pivot.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, + type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, + type: 3} + propertyPath: m_RootOrder + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, + type: 3} + propertyPath: m_AnchorMax.x + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, + type: 3} + propertyPath: m_AnchorMax.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, + type: 3} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, + type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, + type: 3} + propertyPath: m_SizeDelta.x + value: -952 + objectReference: {fileID: 0} + - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, + type: 3} + propertyPath: m_SizeDelta.y + value: -344 + objectReference: {fileID: 0} + - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, + type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, + type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, + type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, + type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, + type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6963777608485144162, guid: d725b5588e1b956458798319e6541d84, + type: 3} + propertyPath: m_Name + value: ConnectionModeButtons + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: d725b5588e1b956458798319e6541d84, type: 3} diff --git a/testproject/Assets/Scenes/ZooSam.unity.meta b/testproject/Assets/Scenes/ZooSam.unity.meta new file mode 100644 index 0000000000..4945676ba3 --- /dev/null +++ b/testproject/Assets/Scenes/ZooSam.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 4683469c9a191411fbda5e426765b2fc +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/testproject/Assets/Scripts/NetworkTransformLegacy.cs b/testproject/Assets/Scripts/NetworkTransformLegacy.cs index 4ec7d6628a..e702a99b27 100644 --- a/testproject/Assets/Scripts/NetworkTransformLegacy.cs +++ b/testproject/Assets/Scripts/NetworkTransformLegacy.cs @@ -170,9 +170,9 @@ private void Update() { if (IsOwner) { - if (NetworkManager.NetworkTime - m_LastSendTime >= (1f / FixedSendsPerSecond) && (Vector3.Distance(transform.position, m_LastSentPos) > MinMeters || Quaternion.Angle(transform.rotation, m_LastSentRot) > MinDegrees)) + if (NetworkManager.LocalTime.FixedTime - m_LastSendTime >= (1f / FixedSendsPerSecond) && (Vector3.Distance(transform.position, m_LastSentPos) > MinMeters || Quaternion.Angle(transform.rotation, m_LastSentRot) > MinDegrees)) { - m_LastSendTime = NetworkManager.NetworkTime; + m_LastSendTime = (float) NetworkManager.LocalTime.FixedTime; m_LastSentPos = transform.position; m_LastSentRot = transform.rotation; @@ -293,9 +293,9 @@ private void SubmitTransformServerRpc(Vector3 position, Vector3 eulerAngles, Ser Vector3? receiverPosition = NetworkManager.Singleton.ConnectedClientsList[i].PlayerObject == null ? null : new Vector3?(NetworkManager.Singleton.ConnectedClientsList[i].PlayerObject.transform.position); Vector3? senderPosition = NetworkManager.Singleton.ConnectedClients[OwnerClientId].PlayerObject == null ? null : new Vector3?(NetworkManager.Singleton.ConnectedClients[OwnerClientId].PlayerObject.transform.position); - if ((receiverPosition == null || senderPosition == null && NetworkManager.NetworkTime - info.LastSent >= (1f / FixedSendsPerSecond)) || NetworkManager.NetworkTime - info.LastSent >= GetTimeForLerp(receiverPosition.Value, senderPosition.Value)) + if ((receiverPosition == null || senderPosition == null && NetworkManager.LocalTime.FixedTime - info.LastSent >= (1f / FixedSendsPerSecond)) || NetworkManager.LocalTime.FixedTime - info.LastSent >= GetTimeForLerp(receiverPosition.Value, senderPosition.Value)) { - info.LastSent = NetworkManager.NetworkTime; + info.LastSent = (float) NetworkManager.LocalTime.FixedTime; info.LastMissedPosition = null; info.LastMissedRotation = null; @@ -334,7 +334,7 @@ private void CheckForMissedSends() Vector3? receiverPosition = NetworkManager.ConnectedClientsList[i].PlayerObject == null ? null : new Vector3?(NetworkManager.ConnectedClientsList[i].PlayerObject.transform.position); Vector3? senderPosition = NetworkManager.ConnectedClients[OwnerClientId].PlayerObject == null ? null : new Vector3?(NetworkManager.ConnectedClients[OwnerClientId].PlayerObject.transform.position); - if ((receiverPosition == null || senderPosition == null && NetworkManager.NetworkTime - info.LastSent >= (1f / FixedSendsPerSecond)) || NetworkManager.NetworkTime - info.LastSent >= GetTimeForLerp(receiverPosition.Value, senderPosition.Value)) + if ((receiverPosition == null || senderPosition == null && NetworkManager.LocalTime.FixedTime - info.LastSent >= (1f / FixedSendsPerSecond)) || NetworkManager.LocalTime.FixedTime - info.LastSent >= GetTimeForLerp(receiverPosition.Value, senderPosition.Value)) { /* why is this??? ->*/ Vector3? pos = NetworkManager.ConnectedClients[OwnerClientId].PlayerObject == null ? null : new Vector3?(NetworkManager.ConnectedClients[OwnerClientId].PlayerObject.transform.position); @@ -343,7 +343,7 @@ private void CheckForMissedSends() if (info.LastMissedPosition != null && info.LastMissedRotation != null) { - info.LastSent = NetworkManager.NetworkTime; + info.LastSent = (float) NetworkManager.LocalTime.FixedTime; ApplyTransformClientRpc(info.LastMissedPosition.Value, info.LastMissedRotation.Value.eulerAngles, new ClientRpcParams { Send = new ClientRpcSendParams { TargetClientIds = new[] { NetworkManager.ConnectedClientsList[i].ClientId } } }); diff --git a/testproject/ProjectSettings/EditorBuildSettings.asset b/testproject/ProjectSettings/EditorBuildSettings.asset index f4245315f9..58972bd5e9 100644 --- a/testproject/ProjectSettings/EditorBuildSettings.asset +++ b/testproject/ProjectSettings/EditorBuildSettings.asset @@ -5,6 +5,9 @@ EditorBuildSettings: m_ObjectHideFlags: 0 serializedVersion: 2 m_Scenes: + - enabled: 1 + path: Assets/Scenes/ZooSam.unity + guid: 4683469c9a191411fbda5e426765b2fc - enabled: 1 path: Assets/MainMenu.unity guid: 21c7fd68cda9dd9488fc0cc01f885e39 From c81f65a4c8980c39a913e1437d0ef7af71bdd7a7 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Wed, 28 Jul 2021 10:20:27 -0400 Subject: [PATCH 004/113] # --- .../BufferedLinearInterpolatorVector3.asset | 15 ++++ ...fferedLinearInterpolatorVector3.asset.meta | 8 ++ ...ufferedLinearInterpolatorVector3Factory.cs | 82 +++++++++++-------- .../Prototyping/Interpolator/IInterpolator.cs | 13 ++- .../Interpolator/NoInterpolationFactory.cs | 29 ++++--- .../PositionLinearInterpolatorFactory.cs | 27 +++--- .../Prototyping/NetworkTransform.cs | 16 ++-- .../Prototyping/NetworkTransform.cs.meta | 4 +- testproject/Assets/Prefabs/PlayerCube.prefab | 34 ++++---- testproject/Assets/Scenes/ZooSam.unity | 4 +- 10 files changed, 139 insertions(+), 93 deletions(-) create mode 100644 com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3.asset create mode 100644 com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3.asset.meta diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3.asset b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3.asset new file mode 100644 index 0000000000..139fd91530 --- /dev/null +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3.asset @@ -0,0 +1,15 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 199dd81621cd441c19cc731e8d29a217, type: 3} + m_Name: BufferedLinearInterpolatorVector3 + m_EditorClassIdentifier: + InterpolationTime: 0.1 diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3.asset.meta b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3.asset.meta new file mode 100644 index 0000000000..e43ac9cd50 --- /dev/null +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a882403a7bf6247cd881a093a9a3f537 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3Factory.cs b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3Factory.cs index 1270401549..85be5908cc 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3Factory.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3Factory.cs @@ -5,37 +5,62 @@ namespace DefaultNamespace { - public class BufferedLinearInterpolatorVector3Factory : InterpolatorVector3Factory + public abstract class BufferedLinearInterpolatorFactory : InterpolatorFactory + { + [SerializeField] + public float InterpolationTime = 0.100f; + } + + [CreateAssetMenu(fileName = "BufferedLinearInterpolatorVector3", menuName = BaseMenuName + "BufferedLinearInterpolatorVector3", order = 1)] + public class BufferedLinearInterpolatorVector3Factory : BufferedLinearInterpolatorFactory { public override IInterpolator CreateInterpolator() { - return new BufferedLinearInterpolatorVector3(); + return new BufferedLinearInterpolatorVector3(this); + } + } + + [CreateAssetMenu(fileName = "BufferedLinearInterpolatorQuaternion", menuName = BaseMenuName + "BufferedLinearInterpolatorQuaternion", order = 1)] + public class BufferedLinearInterpolatorQuaternionFactory : BufferedLinearInterpolatorFactory + { + public override IInterpolator CreateInterpolator() + { + return new BufferedLinearInterpolatorQuaternion(this); } } public abstract class BufferedLinearInterpolator : IInterpolator where T : struct { - public int BufferAmountTick = 3; - public const float InterpolationConfigTimeSec = 0.100f; // todo remove const for config + public int AdditionalBufferAmountTick = 3; // todo config, todo expose global config, todo use in actual code + // public const float InterpolationConfigTimeSec = 0.100f; // todo remove const for config + + public float InterpolationConfigTimeSec => m_Factory.InterpolationTime; // todo use with range struct BufferedItem { public T item; - public int tickSent; + public NetworkTime tickSent; } - // private double ServerTime => NetworkManager.Singleton.ServerTime.Time; - private double ServerTick => NetworkManager.Singleton.ServerTime.Tick; - private double ServerTickBeingHandledForBuffering => ServerTick;// - BufferAmountTick; + // private double ServerTick => NetworkManager.Singleton.ServerTime.Tick; + protected virtual double ServerTickBeingHandledForBuffering => NetworkManager.Singleton.ServerTime.Tick; // override this if you want configurable buffering, right now using ServerTick's own global buffering T m_LerpStartValue; T m_LerpEndValue; - private T m_CurrentValue; + private NetworkTime m_ValueLastTick; private List> m_Buffer = new List>(); - private int samPreviousToLast; + private readonly BufferedLinearInterpolatorFactory m_Factory; + + public BufferedLinearInterpolator(BufferedLinearInterpolatorFactory factory) + { + m_Factory = factory; + } + + private NetworkTime samPreviousToLast; + private void TryConsumeFromBuffer() { var count = m_Buffer.Count; @@ -43,7 +68,7 @@ private void TryConsumeFromBuffer() for (int i = m_Buffer.Count - 1; i >= 0; i--) { var bufferedValue = m_Buffer[i]; - if (bufferedValue.tickSent <= ServerTickBeingHandledForBuffering) + if (bufferedValue.tickSent.Tick <= ServerTickBeingHandledForBuffering) { m_LerpStartValue = m_LerpEndValue; m_LerpEndValue = bufferedValue.item; @@ -55,27 +80,13 @@ private void TryConsumeFromBuffer() var pos = m_LerpEndValue is Vector3 value ? value : default; Debug.DrawLine(pos, pos + Random.Range(0f, 1f) * Vector3.up + Random.Range(0f, 1f) * Vector3.left, Color.green, 10, false); - - - float maxTickAllowedInBuffer = NetworkManager.Singleton.NetworkTickSystem.TickRate; - - // we're not getting values regularly from the network. This means interpolation needs to adapt - m_InterpolationTimeSec = InterpolationConfigTimeSec; - - // if (ServerTickBeingHandledForBuffering - bufferedValue.tickSent < maxTickAllowedInBuffer) - // { - // // Consume one value at a time, but make sure we don't have an ever growing buffer. We only use one item if we're under our max amount - // break; - // } - - // Debug.LogWarning("Consuming more than one value at a time from buffer"); // todo remove? } } Debug.Log($"Buffer size: {count}, nb consumed: {nbConsumed}"); var pos2 = m_LerpEndValue is Vector3 value2 ? value2 : default; - Debug.DrawLine(pos2, pos2 + Vector3.down * (m_ValueLastTick - samPreviousToLast), Color.cyan, 10, false); + Debug.DrawLine(pos2, pos2 + Vector3.down * (m_ValueLastTick.Tick - samPreviousToLast.Tick), Color.cyan, 10, false); for (int i = 0; i < count; i++) { Debug.DrawLine(pos2 + Vector3.up * (i+1), pos2 + Vector3.up* (i+1) + Vector3.left, Color.white, 10, false); @@ -86,7 +97,7 @@ public void Update(float deltaTime) { TryConsumeFromBuffer(); - var timeB = new NetworkTime(NetworkManager.Singleton.NetworkTickSystem.TickRate, m_ValueLastTick); + var timeB = m_ValueLastTick;//new NetworkTime(NetworkManager.Singleton.NetworkTickSystem.TickRate, m_ValueLastTick); var timeA = timeB - timeB.FixedDeltaTime;// double range = timeB.Time - timeA.Time; float t = (float)((NetworkManager.Singleton.NetworkTickSystem.ServerTime.Time - timeA.FixedDeltaTime - timeA.Time) / range); @@ -98,25 +109,20 @@ public void Update(float deltaTime) Debug.DrawLine(pos, pos + Vector3.up, Color.magenta, 10, false); } - public void FixedUpdate(float fixedDeltaTime) + public void NetworkTickUpdate(float fixedDeltaTime) { } - // private int timeInitializedDebug = 20; // number so we wait a few frames to grab the offset. this is debug - // private double clientServerOffsetDebug; - private float m_InterpolationTimeSec; - private int m_ValueLastTick; - - public void AddMeasurement(T newMeasurement, int SentTick) + public void AddMeasurement(T newMeasurement, NetworkTime SentTick) { var debugPos = newMeasurement is Vector3 value ? value : default; Debug.DrawLine(debugPos, debugPos + Vector3.right + Vector3.up, Color.red, 10, false); Debug.Log($"Adding measurement {Time.time}"); m_Buffer.Add(new BufferedItem() {item = newMeasurement, tickSent = SentTick}); - m_Buffer.Sort((item1, item2) => item2.tickSent.CompareTo(item1.tickSent)); + m_Buffer.Sort((item1, item2) => item2.tickSent.Tick.CompareTo(item1.tickSent.Tick)); } public T GetInterpolatedValue() @@ -124,7 +130,7 @@ public T GetInterpolatedValue() return m_CurrentValue; } - public void Teleport(T value) + public void Teleport(T value, NetworkTime SentTick) { m_CurrentValue = value; m_LerpEndValue = value; @@ -136,6 +142,8 @@ public void Teleport(T value) public class BufferedLinearInterpolatorVector3 : BufferedLinearInterpolator { + public BufferedLinearInterpolatorVector3(BufferedLinearInterpolatorVector3Factory bufferedLinearInterpolatorVector3Factory) : base(bufferedLinearInterpolatorVector3Factory) { } + public override Vector3 Interpolate(Vector3 start, Vector3 end, float time) { return Vector3.LerpUnclamped(start, end, time); @@ -148,5 +156,7 @@ public override Quaternion Interpolate(Quaternion start, Quaternion end, float t { return Quaternion.Slerp(start, end, time); } + + public BufferedLinearInterpolatorQuaternion(BufferedLinearInterpolatorFactory factory) : base(factory) { } } } \ No newline at end of file diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/IInterpolator.cs b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/IInterpolator.cs index f4cf96ee92..edfb268727 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/IInterpolator.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/IInterpolator.cs @@ -1,20 +1,17 @@ +using MLAPI.Timing; using UnityEngine; public interface IInterpolator { public void Update(float deltaTime); - public void FixedUpdate(float fixedDeltaTime); - public void AddMeasurement(T newMeasurement, int SentTick); + public void NetworkTickUpdate(float tickDeltaTime); + public void AddMeasurement(T newMeasurement, NetworkTime sentTime); public T GetInterpolatedValue(); - public void Teleport(T value); + public void Teleport(T value, NetworkTime sentTime); } public abstract class InterpolatorFactory : ScriptableObject { + public const string BaseMenuName = "MLAPI/Interpolator/"; public abstract IInterpolator CreateInterpolator(); } - -public abstract class InterpolatorVector3Factory : InterpolatorFactory -{ - -} \ No newline at end of file diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolationFactory.cs b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolationFactory.cs index d04e8296f9..d08df574e5 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolationFactory.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolationFactory.cs @@ -1,41 +1,50 @@ +using MLAPI.Timing; using UnityEngine; namespace DefaultNamespace { - [CreateAssetMenu(fileName = "NoInterpolation", menuName = "MLAPI/NoInterpolation", order = 1)] - public class NoInterpolationFactory : InterpolatorVector3Factory + [CreateAssetMenu(fileName = "NoInterpolationVector3", menuName = BaseMenuName + "NoInterpolationVector3", order = 1)] + public class NoInterpolationVector3Factory : InterpolatorFactory { public override IInterpolator CreateInterpolator() { - return new NoInterpolation(); + return new NoInterpolation(); } } - public class NoInterpolation : IInterpolator + [CreateAssetMenu(fileName = "NoInterpolationQuaternion", menuName = BaseMenuName + "NoInterpolationQuaternion", order = 1)] + public class NoInterpolationQuaternionFactory : InterpolatorFactory { - public Vector3 m_Current; + public override IInterpolator CreateInterpolator() + { + return new NoInterpolation(); + } + } + + public class NoInterpolation : IInterpolator + { + private T m_Current; public void Update(float deltaTime) { // nothing } - public void FixedUpdate(float fixedDeltaTime) + public void NetworkTickUpdate(float fixedDeltaTime) { - } - public void AddMeasurement(Vector3 newMeasurement, int SentTick) + public void AddMeasurement(T newMeasurement, NetworkTime sentTick) { m_Current = newMeasurement; } - public Vector3 GetInterpolatedValue() + public T GetInterpolatedValue() { return m_Current; } - public void Teleport(Vector3 value) + public void Teleport(T value, NetworkTime SentTick) { m_Current = value; } diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/PositionLinearInterpolatorFactory.cs b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/PositionLinearInterpolatorFactory.cs index 8ffc612367..10a7beee8c 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/PositionLinearInterpolatorFactory.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/PositionLinearInterpolatorFactory.cs @@ -1,17 +1,18 @@ using System; +using MLAPI.Timing; using UnityEngine; -namespace DefaultNamespace +namespace MLAPI { - [CreateAssetMenu(fileName = "PositionLinearInterpolator", menuName = "MLAPI/PositionLinearInterpolator", order = 1)] - public class PositionLinearInterpolatorFactory : InterpolatorVector3Factory + [CreateAssetMenu(fileName = "PositionLinearInterpolator", menuName = BaseMenuName + "PositionLinearInterpolator", order = 1)] + public class PositionLinearInterpolatorFactory : InterpolatorFactory { [SerializeField] - private float m_MaxLerpTime = 0.2f; + public float MaxLerpTime = 0.2f; public override IInterpolator CreateInterpolator() { - return new PositionLinearInterpolator(m_MaxLerpTime); + return new PositionLinearInterpolator(this); } } @@ -21,26 +22,24 @@ public class PositionLinearInterpolator : IInterpolator public Vector3 m_StartVector; public Vector3 m_EndVector; public Vector3 m_UpdatedVector; + private readonly PositionLinearInterpolatorFactory m_Factory; - private float m_MaxLerpTime; - - public PositionLinearInterpolator(float maxLerpTime) + public PositionLinearInterpolator(PositionLinearInterpolatorFactory factory) { - m_MaxLerpTime = maxLerpTime; + m_Factory = factory; } public void Update(float deltaTime) { m_CurrentTime += deltaTime; - m_UpdatedVector = Vector3.Lerp(m_StartVector, m_EndVector, m_CurrentTime / m_MaxLerpTime); + m_UpdatedVector = Vector3.Lerp(m_StartVector, m_EndVector, m_CurrentTime / m_Factory.MaxLerpTime); } - public void FixedUpdate(float fixedDeltaTime) + public void NetworkTickUpdate(float fixedDeltaTime) { - } - public void AddMeasurement(Vector3 newMeasurement, int SentTick) + public void AddMeasurement(Vector3 newMeasurement, NetworkTime SentTick) { m_EndVector = newMeasurement; m_CurrentTime = 0; @@ -52,7 +51,7 @@ public Vector3 GetInterpolatedValue() return m_UpdatedVector; } - public void Teleport(Vector3 value) + public void Teleport(Vector3 value, NetworkTime SentTick) { m_UpdatedVector = value; } diff --git a/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs b/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs index a0455e6fb7..831b2a47c0 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs @@ -1,10 +1,9 @@ using System; -using DefaultNamespace; using MLAPI.NetworkVariable; using MLAPI.Serialization; +using MLAPI.Timing; using MLAPI.Transports; using UnityEngine; -using UnityEngine.UIElements; namespace MLAPI.Prototyping { @@ -87,7 +86,11 @@ public void NetworkSerialize(NetworkSerializer serializer) [SerializeField, Range(0, 120), Tooltip("The base amount of sends per seconds to use when range is disabled")] public float FixedSendsPerSecond = 30f; - public IInterpolator PositionInterpolator = new BufferedLinearInterpolatorVector3(); + [SerializeField] + private InterpolatorFactory m_PositionInterpolatorFactory; + + private IInterpolator PositionInterpolator; + // public IInterpolator PositionInterpolator = new BufferedLinearInterpolatorVector3(ScriptableObject.CreateInstance()); // todo tmp, use default value instead private Transform m_Transform; // cache the transform component to reduce unnecessary bounce between managed and native private readonly NetworkVariable m_NetworkState = new NetworkVariable(new NetworkState()); @@ -199,7 +202,7 @@ private void OnNetworkStateChanged(NetworkState oldState, NetworkState newState) Debug.Log($"distance sam {Math.Round((newState.Position - oldState.Position).magnitude, 2)}"); Debug.Log($"diff tick sam {(newState.SentTick - oldState.SentTick, 2)}"); // oldTick = NetworkManager.Singleton.ServerTime.Tick; - PositionInterpolator.AddMeasurement(newState.Position, newState.SentTick); + PositionInterpolator.AddMeasurement(newState.Position, new NetworkTime(NetworkManager.Singleton.ServerTime.TickRate, newState.SentTick)); } private void UpdateNetVarPerms() @@ -223,7 +226,8 @@ private void UpdateNetVarPerms() private void Awake() { m_Transform = transform; - PositionInterpolator.Teleport(m_Transform.position); + PositionInterpolator = m_PositionInterpolatorFactory.CreateInterpolator(); + PositionInterpolator.Teleport(m_Transform.position, new NetworkTime(NetworkManager.Singleton.ServerTime.TickRate, m_NetworkState.Value.SentTick)); UpdateNetVarPerms(); @@ -266,7 +270,7 @@ private void NetworkTickUpdate() // ApplyNetworkState(m_NetworkState.Value); // } - // PositionInterpolator.FixedUpdate(Time.fixedDeltaTime); + PositionInterpolator.NetworkTickUpdate(NetworkManager.ServerTime.FixedDeltaTime); } } diff --git a/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs.meta b/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs.meta index 4023b38e0e..594420f118 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs.meta +++ b/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs.meta @@ -3,7 +3,9 @@ guid: e96cb6065543e43c4a752faaa1468eb1 MonoImporter: externalObjects: {} serializedVersion: 2 - defaultReferences: [] + defaultReferences: + - m_PositionInterpolator: {fileID: 11400000, guid: a882403a7bf6247cd881a093a9a3f537, + type: 2} executionOrder: 0 icon: {instanceID: 0} userData: diff --git a/testproject/Assets/Prefabs/PlayerCube.prefab b/testproject/Assets/Prefabs/PlayerCube.prefab index d2dea896cf..771aa49a2f 100644 --- a/testproject/Assets/Prefabs/PlayerCube.prefab +++ b/testproject/Assets/Prefabs/PlayerCube.prefab @@ -15,11 +15,11 @@ GameObject: - component: {fileID: 8685790303553767872} - component: {fileID: -745482209883575862} - component: {fileID: 947981134} - - component: {fileID: 7023392397975834761} - component: {fileID: 8685790303553767876} - component: {fileID: 3809075828520557319} - component: {fileID: 7138389085065872747} - component: {fileID: -4978466230159947418} + - component: {fileID: 5715768330125915997} m_Layer: 0 m_Name: PlayerCube m_TagString: Target @@ -233,22 +233,6 @@ MonoBehaviour: AlwaysReplicateAsRoot: 0 DontDestroyWithOwner: 0 AutoObjectParentSync: 1 ---- !u!114 &7023392397975834761 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8685790303553767886} - m_Enabled: 0 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3} - m_Name: - m_EditorClassIdentifier: - Authority: 1 - Channel: 10 - InLocalSpace: 0 - FixedSendsPerSecond: 30 --- !u!114 &8685790303553767876 MonoBehaviour: m_ObjectHideFlags: 0 @@ -300,3 +284,19 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 9548116c10df1486ea12b7329b77c5cf, type: 3} m_Name: m_EditorClassIdentifier: +--- !u!114 &5715768330125915997 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8685790303553767886} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3} + m_Name: + m_EditorClassIdentifier: + Authority: 1 + InLocalSpace: 0 + FixedSendsPerSecond: 30 + m_PositionInterpolatorFactory: {fileID: 0} diff --git a/testproject/Assets/Scenes/ZooSam.unity b/testproject/Assets/Scenes/ZooSam.unity index 3efe91ef5b..9dbf8c0f1e 100644 --- a/testproject/Assets/Scenes/ZooSam.unity +++ b/testproject/Assets/Scenes/ZooSam.unity @@ -284,7 +284,7 @@ MonoBehaviour: - SampleScene - ZooSam AllowRuntimeSceneChanges: 0 - PlayerPrefab: {fileID: 8685790303553767886, guid: 96e0a72e30d0c46c8a5c9a750e8f5807, + PlayerPrefab: {fileID: 4700706668509470175, guid: 7eeaaf9e50c0afc4dab93584a54fb0d6, type: 3} NetworkPrefabs: [] TickRate: 20 @@ -600,6 +600,8 @@ MonoBehaviour: Authority: 0 InLocalSpace: 0 FixedSendsPerSecond: 30 + m_PositionInterpolatorFactory: {fileID: 11400000, guid: a882403a7bf6247cd881a093a9a3f537, + type: 2} --- !u!65 &678326396 BoxCollider: m_ObjectHideFlags: 0 From 4a4aa7b1203243e91e457f36123bdccfdd9d005c Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Thu, 29 Jul 2021 13:55:51 -0400 Subject: [PATCH 005/113] # --- .../Interpolator/BufferedLinearInterpolatorVector3Factory.cs | 2 +- .../Prototyping/Interpolator/IInterpolator.cs | 2 +- .../Prototyping/Interpolator/NoInterpolationFactory.cs | 2 +- .../Interpolator/PositionLinearInterpolatorFactory.cs | 2 +- com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3Factory.cs b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3Factory.cs index 85be5908cc..e79656524a 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3Factory.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3Factory.cs @@ -130,7 +130,7 @@ public T GetInterpolatedValue() return m_CurrentValue; } - public void Teleport(T value, NetworkTime SentTick) + public void Reset(T value, NetworkTime SentTick) { m_CurrentValue = value; m_LerpEndValue = value; diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/IInterpolator.cs b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/IInterpolator.cs index edfb268727..5276fc70f2 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/IInterpolator.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/IInterpolator.cs @@ -7,7 +7,7 @@ public interface IInterpolator public void NetworkTickUpdate(float tickDeltaTime); public void AddMeasurement(T newMeasurement, NetworkTime sentTime); public T GetInterpolatedValue(); - public void Teleport(T value, NetworkTime sentTime); + public void Reset(T value, NetworkTime sentTime); } public abstract class InterpolatorFactory : ScriptableObject diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolationFactory.cs b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolationFactory.cs index d08df574e5..42e7b195a6 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolationFactory.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolationFactory.cs @@ -44,7 +44,7 @@ public T GetInterpolatedValue() return m_Current; } - public void Teleport(T value, NetworkTime SentTick) + public void Reset(T value, NetworkTime SentTick) { m_Current = value; } diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/PositionLinearInterpolatorFactory.cs b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/PositionLinearInterpolatorFactory.cs index 10a7beee8c..1416b6e591 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/PositionLinearInterpolatorFactory.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/PositionLinearInterpolatorFactory.cs @@ -51,7 +51,7 @@ public Vector3 GetInterpolatedValue() return m_UpdatedVector; } - public void Teleport(Vector3 value, NetworkTime SentTick) + public void Reset(Vector3 value, NetworkTime SentTick) { m_UpdatedVector = value; } diff --git a/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs b/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs index 831b2a47c0..5bdc69fa4c 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs @@ -227,7 +227,7 @@ private void Awake() { m_Transform = transform; PositionInterpolator = m_PositionInterpolatorFactory.CreateInterpolator(); - PositionInterpolator.Teleport(m_Transform.position, new NetworkTime(NetworkManager.Singleton.ServerTime.TickRate, m_NetworkState.Value.SentTick)); + PositionInterpolator.Reset(m_Transform.position, new NetworkTime(NetworkManager.Singleton.ServerTime.TickRate, m_NetworkState.Value.SentTick)); UpdateNetVarPerms(); From 5fc7b50ba56e8d35616f140690ecf759fca2387f Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Thu, 5 Aug 2021 14:53:00 -0400 Subject: [PATCH 006/113] # --- ...ufferedLinearInterpolatorVector3Factory.cs | 118 +- .../Prototyping/Interpolator/IInterpolator.cs | 11 +- .../Interpolator/NoInterpolationFactory.cs | 24 +- .../PositionLinearInterpolatorFactory.cs | 24 +- .../Prototyping/NetworkTransform.cs | 67 +- .../Runtime/Timing/TimeMultiInstanceTest.cs | 9 + testproject/Assets/Scenes/ZooSam.unity | 26378 +++++++++++++++- 7 files changed, 25839 insertions(+), 792 deletions(-) diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3Factory.cs b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3Factory.cs index e79656524a..e7a756098e 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3Factory.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3Factory.cs @@ -5,10 +5,20 @@ namespace DefaultNamespace { - public abstract class BufferedLinearInterpolatorFactory : InterpolatorFactory + public interface IBufferedLinearInterpolatorSettings : IInterpolatorSettings + { + public float InterpolationTime { get; } + } + + public abstract class BufferedLinearInterpolatorFactory : InterpolatorFactory, IBufferedLinearInterpolatorSettings { [SerializeField] - public float InterpolationTime = 0.100f; + public float InterpolationTime => 0.100f; + } + + public class BufferedLinearInterpolatorSettings : IBufferedLinearInterpolatorSettings + { + public float InterpolationTime { get; set; } = 0.1f; } [CreateAssetMenu(fileName = "BufferedLinearInterpolatorVector3", menuName = BaseMenuName + "BufferedLinearInterpolatorVector3", order = 1)] @@ -34,7 +44,7 @@ public abstract class BufferedLinearInterpolator : IInterpolator where T : public int AdditionalBufferAmountTick = 3; // todo config, todo expose global config, todo use in actual code // public const float InterpolationConfigTimeSec = 0.100f; // todo remove const for config - public float InterpolationConfigTimeSec => m_Factory.InterpolationTime; // todo use with range + public float InterpolationConfigTimeSec => m_Settings.InterpolationTime; // todo use with range struct BufferedItem { @@ -48,18 +58,34 @@ struct BufferedItem T m_LerpStartValue; T m_LerpEndValue; private T m_CurrentValue; - private NetworkTime m_ValueLastTick; + private NetworkTime m_ValueCurrentTickConsumed; private List> m_Buffer = new List>(); - private readonly BufferedLinearInterpolatorFactory m_Factory; + private readonly IBufferedLinearInterpolatorSettings m_Settings; - public BufferedLinearInterpolator(BufferedLinearInterpolatorFactory factory) + public BufferedLinearInterpolator() { - m_Factory = factory; + m_Settings = new BufferedLinearInterpolatorSettings {InterpolationTime = 0.2f}; } - private NetworkTime samPreviousToLast; + public BufferedLinearInterpolator(IBufferedLinearInterpolatorSettings settings) + { + m_Settings = settings; + } + + public BufferedLinearInterpolator(NetworkVariable> netvar) + { + netvar.OnValueChanged += OnStateChanged; + } + + public void OnStateChanged(IInterpolatedState old, IInterpolatedState newState) + { + var sentTime = new NetworkTime(NetworkManager.Singleton.ServerTime.TickRate, newState.SentTick); + AddMeasurement(newState.Value, sentTime); + } + + private NetworkTime m_PreviousTickConsumed; private void TryConsumeFromBuffer() { @@ -72,8 +98,8 @@ private void TryConsumeFromBuffer() { m_LerpStartValue = m_LerpEndValue; m_LerpEndValue = bufferedValue.item; - samPreviousToLast = m_ValueLastTick; - m_ValueLastTick = bufferedValue.tickSent; + samPreviousTickConsumed = m_ValueCurrentTickConsumed; + m_ValueCurrentTickConsumed = bufferedValue.tickSent; Debug.Log($"hellooooo {bufferedValue.tickSent}"); m_Buffer.RemoveAt(i); nbConsumed++; @@ -86,41 +112,88 @@ private void TryConsumeFromBuffer() Debug.Log($"Buffer size: {count}, nb consumed: {nbConsumed}"); var pos2 = m_LerpEndValue is Vector3 value2 ? value2 : default; - Debug.DrawLine(pos2, pos2 + Vector3.down * (m_ValueLastTick.Tick - samPreviousToLast.Tick), Color.cyan, 10, false); + Debug.DrawLine(pos2, pos2 + Vector3.down * (m_ValueCurrentTickConsumed.Tick - m_PreviousTickConsumed.Tick), Color.cyan, 10, false); for (int i = 0; i < count; i++) { Debug.DrawLine(pos2 + Vector3.up * (i+1), pos2 + Vector3.up* (i+1) + Vector3.left, Color.white, 10, false); } } - public void Update(float deltaTime) + private float samLastServerTime; + private float samLastTime; + + private float serverOffset; + private float m_RenderTime => Time.time - serverOffset; + + public void Start() + { + serverOffset = (float) (Time.time - NetworkManager.Singleton.NetworkTickSystem.ServerTime.Time); + } + + public void OnEnable() { + } + + public void Awake() + { + } + + public void OnNetworkSpawn() + { + } + + public T Update(float deltaTime) + { + if (!NetworkManager.Singleton.IsConnectedClient) return default; + TryConsumeFromBuffer(); - var timeB = m_ValueLastTick;//new NetworkTime(NetworkManager.Singleton.NetworkTickSystem.TickRate, m_ValueLastTick); - var timeA = timeB - timeB.FixedDeltaTime;// + var timeB = m_ValueCurrentTickConsumed;//new NetworkTime(NetworkManager.Singleton.NetworkTickSystem.TickRate, m_ValueLastTick); + // var timeA = timeB - timeB.FixedDeltaTime;// + + // Interpolation example to understand the math below + // 4 6 6.5 + // | | | + // A B Server + var timeA = m_PreviousTickConsumed; double range = timeB.Time - timeA.Time; - float t = (float)((NetworkManager.Singleton.NetworkTickSystem.ServerTime.Time - timeA.FixedDeltaTime - timeA.Time) / range); + var renderTime = NetworkManager.Singleton.NetworkTickSystem.ServerTime.Time - range; + // var renderTime = m_RenderTime; + float t = (float)((renderTime - timeA.Time) / range); + var diffServerTime = NetworkManager.Singleton.NetworkTickSystem.ServerTime.Time - samLastServerTime; + samLastServerTime = (float) NetworkManager.Singleton.NetworkTickSystem.ServerTime.Time; + var diffTime = Time.time - samLastTime; + samLastTime = Time.time; + Debug.Log($"diffServerTime {diffServerTime} diffTime {diffTime} deltaTime {deltaTime}"); Debug.Log($"ttttttttttttt {t}"); + m_CurrentValue = Interpolate(m_LerpStartValue, m_LerpEndValue, t); + // m_CurrentValue = m_LerpEndValue; + + + // var timeB = m_ValueCurrentTickConsumed;//new NetworkTime(NetworkManager.Singleton.NetworkTickSystem.TickRate, m_ValueLastTick); + // var timeA = timeB - timeB.FixedDeltaTime;// + // double range = timeB.Time - timeA.Time; + // float t = (float)((NetworkManager.Singleton.NetworkTickSystem.ServerTime.Time - timeA.FixedDeltaTime - timeA.Time) / range); // m_CurrentValue = Interpolate(m_LerpStartValue, m_LerpEndValue, t); - m_CurrentValue = m_LerpEndValue; + + var pos = m_CurrentValue is Vector3 value ? value : default; Debug.DrawLine(pos, pos + Vector3.up, Color.magenta, 10, false); + return m_CurrentValue; } public void NetworkTickUpdate(float fixedDeltaTime) { - } - public void AddMeasurement(T newMeasurement, NetworkTime SentTick) { var debugPos = newMeasurement is Vector3 value ? value : default; Debug.DrawLine(debugPos, debugPos + Vector3.right + Vector3.up, Color.red, 10, false); Debug.Log($"Adding measurement {Time.time}"); + // todo put limit on size, we don't want lag spikes to create 100 entries and have a list that size in memory for ever m_Buffer.Add(new BufferedItem() {item = newMeasurement, tickSent = SentTick}); m_Buffer.Sort((item1, item2) => item2.tickSent.Tick.CompareTo(item1.tickSent.Tick)); } @@ -137,12 +210,17 @@ public void Reset(T value, NetworkTime SentTick) m_LerpStartValue = value; } + public void OnDestroy() + { + throw new System.NotImplementedException(); + } + public abstract T Interpolate(T start, T end, float time); } public class BufferedLinearInterpolatorVector3 : BufferedLinearInterpolator { - public BufferedLinearInterpolatorVector3(BufferedLinearInterpolatorVector3Factory bufferedLinearInterpolatorVector3Factory) : base(bufferedLinearInterpolatorVector3Factory) { } + public BufferedLinearInterpolatorVector3(IBufferedLinearInterpolatorSettings settings) : base(settings) { } public override Vector3 Interpolate(Vector3 start, Vector3 end, float time) { @@ -157,6 +235,6 @@ public override Quaternion Interpolate(Quaternion start, Quaternion end, float t return Quaternion.Slerp(start, end, time); } - public BufferedLinearInterpolatorQuaternion(BufferedLinearInterpolatorFactory factory) : base(factory) { } + public BufferedLinearInterpolatorQuaternion(IBufferedLinearInterpolatorSettings settings) : base(settings) { } } } \ No newline at end of file diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/IInterpolator.cs b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/IInterpolator.cs index 5276fc70f2..a6862322b4 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/IInterpolator.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/IInterpolator.cs @@ -3,11 +3,16 @@ public interface IInterpolator { - public void Update(float deltaTime); + public void Awake(); + public void OnNetworkSpawn(); + public void Start(); + public void OnEnable(); + public T Update(float deltaTime); public void NetworkTickUpdate(float tickDeltaTime); public void AddMeasurement(T newMeasurement, NetworkTime sentTime); public T GetInterpolatedValue(); public void Reset(T value, NetworkTime sentTime); + public void OnDestroy(); } public abstract class InterpolatorFactory : ScriptableObject @@ -15,3 +20,7 @@ public abstract class InterpolatorFactory : ScriptableObject public const string BaseMenuName = "MLAPI/Interpolator/"; public abstract IInterpolator CreateInterpolator(); } + +public interface IInterpolatorSettings +{ +} diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolationFactory.cs b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolationFactory.cs index 42e7b195a6..3579958737 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolationFactory.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolationFactory.cs @@ -25,9 +25,26 @@ public class NoInterpolation : IInterpolator { private T m_Current; - public void Update(float deltaTime) + public void Awake() + { + } + + public void OnNetworkSpawn() + { + } + + public void Start() + { + } + + public void OnEnable() + { + } + + public T Update(float deltaTime) { // nothing + return GetInterpolatedValue(); } public void NetworkTickUpdate(float fixedDeltaTime) @@ -48,5 +65,10 @@ public void Reset(T value, NetworkTime SentTick) { m_Current = value; } + + public void OnDestroy() + { + throw new System.NotImplementedException(); + } } } \ No newline at end of file diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/PositionLinearInterpolatorFactory.cs b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/PositionLinearInterpolatorFactory.cs index 1416b6e591..e940366add 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/PositionLinearInterpolatorFactory.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/PositionLinearInterpolatorFactory.cs @@ -29,10 +29,27 @@ public PositionLinearInterpolator(PositionLinearInterpolatorFactory factory) m_Factory = factory; } - public void Update(float deltaTime) + public void Awake() + { + } + + public void OnNetworkSpawn() + { + } + + public void Start() + { + } + + public void OnEnable() + { + } + + public Vector3 Update(float deltaTime) { m_CurrentTime += deltaTime; m_UpdatedVector = Vector3.Lerp(m_StartVector, m_EndVector, m_CurrentTime / m_Factory.MaxLerpTime); + return GetInterpolatedValue(); } public void NetworkTickUpdate(float fixedDeltaTime) @@ -55,5 +72,10 @@ public void Reset(Vector3 value, NetworkTime SentTick) { m_UpdatedVector = value; } + + public void OnDestroy() + { + throw new NotImplementedException(); + } } } \ No newline at end of file diff --git a/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs b/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs index 5bdc69fa4c..0540db786b 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs @@ -1,4 +1,5 @@ using System; +using DefaultNamespace; using MLAPI.NetworkVariable; using MLAPI.Serialization; using MLAPI.Timing; @@ -89,7 +90,12 @@ public void NetworkSerialize(NetworkSerializer serializer) [SerializeField] private InterpolatorFactory m_PositionInterpolatorFactory; - private IInterpolator PositionInterpolator; + [SerializeField] + private InterpolatorFactory m_RotationInterpolatorFactory; + + protected virtual IInterpolator PositionInterpolator { get; set; } + + protected virtual IInterpolator RotationInterpolator { get; set; } // public IInterpolator PositionInterpolator = new BufferedLinearInterpolatorVector3(ScriptableObject.CreateInstance()); // todo tmp, use default value instead private Transform m_Transform; // cache the transform component to reduce unnecessary bounce between managed and native @@ -117,13 +123,13 @@ private bool IsNetworkStateDirty(NetworkState networkState) if (InLocalSpace) { isDirty |= networkState.Position != PositionInterpolator.GetInterpolatedValue(); - isDirty |= networkState.Rotation != m_Transform.localRotation; + isDirty |= networkState.Rotation != RotationInterpolator.GetInterpolatedValue(); isDirty |= networkState.Scale != m_Transform.localScale; } else { isDirty |= networkState.Position != PositionInterpolator.GetInterpolatedValue(); - isDirty |= networkState.Rotation != m_Transform.rotation; + isDirty |= networkState.Rotation != RotationInterpolator.GetInterpolatedValue(); isDirty |= networkState.Scale != m_Transform.lossyScale; } @@ -161,6 +167,7 @@ private void ApplyNetworkState(NetworkState netState) { netState = new NetworkState(netState); netState.Position = PositionInterpolator.GetInterpolatedValue(); + netState.Rotation = RotationInterpolator.GetInterpolatedValue(); InLocalSpace = netState.InLocalSpace; if (InLocalSpace) @@ -197,12 +204,20 @@ private void OnNetworkStateChanged(NetworkState oldState, NetworkState newState) return; } + // todo check teleport flag + // if (newState.Teleporting) + // { + // PositionInterpolator.Reset(newState.Position, new NetworkTime(NetworkManager.Singleton.ServerTime.TickRate, newState.SentTick)); + // } + // PositionInterpolator.AddMeasurement(newState.Position, NetworkManager.Singleton.ServerTime.Time); Debug.Log($"distance sam {Math.Round((newState.Position - oldState.Position).magnitude, 2)}"); Debug.Log($"diff tick sam {(newState.SentTick - oldState.SentTick, 2)}"); // oldTick = NetworkManager.Singleton.ServerTime.Tick; - PositionInterpolator.AddMeasurement(newState.Position, new NetworkTime(NetworkManager.Singleton.ServerTime.TickRate, newState.SentTick)); + var sentTime = new NetworkTime(NetworkManager.Singleton.ServerTime.TickRate, newState.SentTick); + PositionInterpolator.AddMeasurement(newState.Position, sentTime); + RotationInterpolator.AddMeasurement(newState.Rotation, sentTime); } private void UpdateNetVarPerms() @@ -225,9 +240,32 @@ private void UpdateNetVarPerms() private void Awake() { + //debug, remove me + // Time.maximumDeltaTime = 999f; + m_Transform = transform; - PositionInterpolator = m_PositionInterpolatorFactory.CreateInterpolator(); - PositionInterpolator.Reset(m_Transform.position, new NetworkTime(NetworkManager.Singleton.ServerTime.TickRate, m_NetworkState.Value.SentTick)); + var defaultBufferTime = 0.1f; + if (m_PositionInterpolatorFactory == null) + { + PositionInterpolator = new BufferedLinearInterpolatorVector3(new BufferedLinearInterpolatorSettings {InterpolationTime = defaultBufferTime}); + } + else + { + PositionInterpolator = m_PositionInterpolatorFactory.CreateInterpolator(); + } + + if (m_RotationInterpolatorFactory == null) + { + RotationInterpolator = new BufferedLinearInterpolatorQuaternion(new BufferedLinearInterpolatorSettings {InterpolationTime = defaultBufferTime}); + } + else + { + RotationInterpolator = m_RotationInterpolatorFactory.CreateInterpolator(); + } + + var currentTime = new NetworkTime(NetworkManager.Singleton.ServerTime.TickRate, m_NetworkState.Value.SentTick); + PositionInterpolator.Reset(m_Transform.position, currentTime); + RotationInterpolator.Reset(m_Transform.rotation, currentTime); UpdateNetVarPerms(); @@ -244,6 +282,9 @@ public override void OnNetworkSpawn() { NetworkManager.NetworkTickSystem.Tick += NetworkTickUpdate; } + + PositionInterpolator.OnNetworkSpawn(); + RotationInterpolator.OnNetworkSpawn(); } private void OnDestroy() @@ -264,13 +305,14 @@ private void NetworkTickUpdate() } else { - // if (IsNetworkStateDirty(m_PrevNetworkState)) - // { - // Debug.LogWarning("A local change without authority detected, revert back to latest network state!"); - // ApplyNetworkState(m_NetworkState.Value); - // } + if (IsNetworkStateDirty(m_PrevNetworkState)) + { + Debug.LogWarning("A local change without authority detected, revert back to latest network state!"); + ApplyNetworkState(m_NetworkState.Value); + } PositionInterpolator.NetworkTickUpdate(NetworkManager.ServerTime.FixedDeltaTime); + RotationInterpolator.NetworkTickUpdate(NetworkManager.ServerTime.FixedDeltaTime); } } @@ -290,6 +332,7 @@ private void Update() if (!CanUpdateTransform) { PositionInterpolator.Update(Time.deltaTime); + RotationInterpolator.Update(Time.deltaTime); ApplyNetworkState(m_NetworkState.Value); } } @@ -310,6 +353,8 @@ internal void SetAuthority(NetworkAuthority authority) /// public void Teleport(Vector3 newPosition, Quaternion newRotation, Vector3 newScale) { + // check server side + // set teleport flag in state throw new NotImplementedException(); // TODO MTT-769 } } diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/Timing/TimeMultiInstanceTest.cs b/com.unity.multiplayer.mlapi/Tests/Runtime/Timing/TimeMultiInstanceTest.cs index bd69aa69aa..00cdc61e06 100644 --- a/com.unity.multiplayer.mlapi/Tests/Runtime/Timing/TimeMultiInstanceTest.cs +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/Timing/TimeMultiInstanceTest.cs @@ -40,6 +40,15 @@ private void UpdateTimeStates(NetworkManager[] networkManagers) m_Client2State = new NetworkTimeState(secondClient); } + [UnityTest] + public IEnumerator TestSam() + { + yield return StartSomeClientsAndServerWithPlayersCustom(true, NbClients, 60, 30); + + + + } + [UnityTest] [TestCase(60, 30, ExpectedResult = null)] [TestCase(30, 30, ExpectedResult = null)] diff --git a/testproject/Assets/Scenes/ZooSam.unity b/testproject/Assets/Scenes/ZooSam.unity index 9dbf8c0f1e..299f27c9c8 100644 --- a/testproject/Assets/Scenes/ZooSam.unity +++ b/testproject/Assets/Scenes/ZooSam.unity @@ -123,7 +123,7 @@ NavMeshSettings: debug: m_Flags: 0 m_NavMeshData: {fileID: 0} ---- !u!1 &346676326 +--- !u!1 &33522693 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -131,37 +131,52 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 346676330} - - component: {fileID: 346676329} - - component: {fileID: 346676328} - - component: {fileID: 346676327} + - component: {fileID: 33522694} + - component: {fileID: 33522697} + - component: {fileID: 33522696} + - component: {fileID: 33522695} m_Layer: 0 - m_Name: Cube + m_Name: werq (146) m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!65 &346676327 -BoxCollider: +--- !u!4 &33522694 +Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 346676326} + m_GameObject: {fileID: 33522693} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.4059999, y: 0, z: -1.9800014} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 146 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &33522695 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 33522693} 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 &346676328 + serializedVersion: 4 + m_Convex: 0 + m_CookingOptions: 30 + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &33522696 MeshRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 346676326} + m_GameObject: {fileID: 33522693} m_Enabled: 1 m_CastShadows: 1 m_ReceiveShadows: 1 @@ -174,7 +189,7 @@ MeshRenderer: m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: - - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 2100000, guid: d255f11ce58034f15b98a74b2dce910d, type: 2} m_StaticBatchInfo: firstSubMesh: 0 subMeshCount: 0 @@ -196,29 +211,111 @@ MeshRenderer: m_SortingLayer: 0 m_SortingOrder: 0 m_AdditionalVertexStreams: {fileID: 0} ---- !u!33 &346676329 +--- !u!33 &33522697 MeshFilter: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 346676326} - m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!4 &346676330 + m_GameObject: {fileID: 33522693} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &37826286 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 37826287} + - component: {fileID: 37826290} + - component: {fileID: 37826289} + - component: {fileID: 37826288} + m_Layer: 0 + m_Name: werq (93) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &37826287 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 346676326} + m_GameObject: {fileID: 37826286} 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_LocalPosition: {x: 3.072, y: 0, z: -0.731} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 6 + m_Father: {fileID: 727811950} + m_RootOrder: 93 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &620561609 +--- !u!64 &37826288 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 37826286} + 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 &37826289 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 37826286} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &37826290 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 37826286} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &49482614 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -226,314 +323,25020 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 620561612} - - component: {fileID: 620561611} - - component: {fileID: 620561610} - - component: {fileID: 620561613} + - component: {fileID: 49482615} + - component: {fileID: 49482618} + - component: {fileID: 49482617} + - component: {fileID: 49482616} m_Layer: 0 - m_Name: NetworkManager + m_Name: werq (85) m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!114 &620561610 -MonoBehaviour: +--- !u!4 &49482615 +Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 620561609} + m_GameObject: {fileID: 49482614} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3.072, y: 0, z: -0.23800087} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 85 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &49482616 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 49482614} + m_Material: {fileID: 0} + m_IsTrigger: 0 m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: b84c2d8dfe509a34fb59e2b81f8e1319, type: 3} - m_Name: - m_EditorClassIdentifier: - MessageBufferSize: 5120 - MaxConnections: 100 - MaxSentMessageQueueSize: 128 - ConnectAddress: 127.0.0.1 - ConnectPort: 7777 - ServerListenPort: 7777 - ServerWebsocketListenPort: 8887 - SupportWebsocket: 0 - Channels: [] - UseMLAPIRelay: 0 - MLAPIRelayAddress: 184.72.104.138 - MLAPIRelayPort: 8888 - MessageSendMode: 0 ---- !u!114 &620561611 -MonoBehaviour: + serializedVersion: 4 + m_Convex: 0 + m_CookingOptions: 30 + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &49482617 +MeshRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 620561609} + m_GameObject: {fileID: 49482614} m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 593a2fe42fa9d37498c96f9a383b6521, type: 3} - m_Name: - m_EditorClassIdentifier: - DontDestroy: 1 - RunInBackground: 1 - LogLevel: 1 - NetworkConfig: - ProtocolVersion: 0 - NetworkTransport: {fileID: 620561610} - RegisteredScenes: - - SampleScene - - ZooSam - AllowRuntimeSceneChanges: 0 - PlayerPrefab: {fileID: 4700706668509470175, guid: 7eeaaf9e50c0afc4dab93584a54fb0d6, - type: 3} - NetworkPrefabs: [] - TickRate: 20 - ClientConnectionBufferTimeout: 10 - ConnectionApproval: 0 - ConnectionData: - EnableTimeResync: 0 - TimeResyncInterval: 30 - EnableNetworkVariable: 1 - EnsureNetworkVariableLengthSafety: 0 - EnableSceneManagement: 1 - ForceSamePrefabs: 1 - RecycleNetworkIds: 1 - NetworkIdRecycleDelay: 120 - RpcHashSize: 0 - LoadSceneTimeOut: 120 - EnableMessageBuffering: 1 - MessageBufferTimeout: 20 - EnableNetworkLogs: 1 ---- !u!4 &620561612 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &49482618 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 49482614} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &53667804 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 53667805} + - component: {fileID: 53667808} + - component: {fileID: 53667807} + - component: {fileID: 53667806} + m_Layer: 0 + m_Name: werq (197) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &53667805 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 620561609} + m_GameObject: {fileID: 53667804} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 1} - m_LocalScale: {x: 1, y: 1, z: 1} + m_LocalPosition: {x: 2.127, y: 0, z: -2.2180023} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 1 + m_Father: {fileID: 727811950} + m_RootOrder: 197 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &620561613 -MonoBehaviour: +--- !u!64 &53667806 +MeshCollider: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 620561609} + m_GameObject: {fileID: 53667804} + m_Material: {fileID: 0} + m_IsTrigger: 0 m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: db28424c2ae12f64da25c9ecccded6b1, type: 3} - m_Name: - m_EditorClassIdentifier: - Port: 7777 - Address: 127.0.0.1 - PingInterval: 1 - DisconnectTimeout: 5 - ReconnectDelay: 0.5 - MaxConnectAttempts: 10 - channels: [] - MessageBufferSize: 5120 - SimulatePacketLossChance: 0 - SimulateMinLatency: 100 - SimulateMaxLatency: 100 ---- !u!1001 &627808638 -PrefabInstance: + serializedVersion: 4 + m_Convex: 0 + m_CookingOptions: 30 + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &53667807 +MeshRenderer: m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 1333567166} - m_Modifications: - - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, - type: 3} - propertyPath: m_Pivot.x - value: 0.5 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 53667804} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &53667808 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 53667804} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &71608578 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 71608579} + - component: {fileID: 71608582} + - component: {fileID: 71608581} + - component: {fileID: 71608580} + m_Layer: 0 + m_Name: werq (25) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &71608579 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 71608578} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.178, y: 0, z: -0.49300003} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 25 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &71608580 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 71608578} + 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 &71608581 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 71608578} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &71608582 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 71608578} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &79838171 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 79838172} + - component: {fileID: 79838175} + - component: {fileID: 79838174} + - component: {fileID: 79838173} + m_Layer: 0 + m_Name: werq (192) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &79838172 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 79838171} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.894, y: 0, z: -1.9800014} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 192 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &79838173 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 79838171} + 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 &79838174 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 79838171} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &79838175 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 79838171} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &80528582 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 80528583} + - component: {fileID: 80528586} + - component: {fileID: 80528585} + - component: {fileID: 80528584} + m_Layer: 0 + m_Name: werq (105) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &80528583 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 80528582} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.127, y: 0, z: -1.4699993} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 105 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &80528584 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 80528582} + 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 &80528585 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 80528582} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &80528586 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 80528582} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &100213237 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 100213238} + - component: {fileID: 100213241} + - component: {fileID: 100213240} + - component: {fileID: 100213239} + m_Layer: 0 + m_Name: werq (228) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &100213238 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 100213237} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.894, y: 0, z: -3.1950016} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 228 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &100213239 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 100213237} + 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 &100213240 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 100213237} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &100213241 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 100213237} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &106240636 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 106240637} + - component: {fileID: 106240640} + - component: {fileID: 106240639} + - component: {fileID: 106240638} + m_Layer: 0 + m_Name: werq (238) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &106240637 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 106240636} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.355, y: 0, z: -3.6880016} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 238 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &106240638 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 106240636} + 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 &106240639 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 106240636} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &106240640 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 106240636} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &106591948 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 106591949} + - component: {fileID: 106591952} + - component: {fileID: 106591951} + - component: {fileID: 106591950} + m_Layer: 0 + m_Name: werq (250) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &106591949 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 106591948} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3.3, y: 0, z: -3.4500008} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 250 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &106591950 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 106591948} + 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 &106591951 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 106591948} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &106591952 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 106591948} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &110121429 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 110121430} + - component: {fileID: 110121433} + - component: {fileID: 110121432} + - component: {fileID: 110121431} + m_Layer: 0 + m_Name: werq (141) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &110121430 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 110121429} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.233, y: 0, z: -2.7110014} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 141 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &110121431 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 110121429} + 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 &110121432 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 110121429} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &110121433 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 110121429} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &125350741 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 125350742} + - component: {fileID: 125350745} + - component: {fileID: 125350744} + - component: {fileID: 125350743} + m_Layer: 0 + m_Name: werq (235) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &125350742 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 125350741} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.588, y: 0, z: -3.4500008} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 235 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &125350743 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 125350741} + 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 &125350744 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 125350741} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &125350745 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 125350741} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &145865922 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 145865923} + - component: {fileID: 145865926} + - component: {fileID: 145865925} + - component: {fileID: 145865924} + m_Layer: 0 + m_Name: werq (23) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &145865923 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 145865922} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.6389999, y: 0, z: -0.238} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 23 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &145865924 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 145865922} + 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 &145865925 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 145865922} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &145865926 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 145865922} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &149862984 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 149862985} + - component: {fileID: 149862988} + - component: {fileID: 149862987} + - component: {fileID: 149862986} + m_Layer: 0 + m_Name: werq (140) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &149862985 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 149862984} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -2.7110023} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 140 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &149862986 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 149862984} + 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 &149862987 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 149862984} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &149862988 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 149862984} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &150536644 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 150536645} + - component: {fileID: 150536648} + - component: {fileID: 150536647} + - component: {fileID: 150536646} + m_Layer: 0 + m_Name: werq (143) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &150536645 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 150536644} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.69399995, y: 0, z: -2.7110014} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 143 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &150536646 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 150536644} + 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 &150536647 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 150536644} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &150536648 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 150536644} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &169380227 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 169380228} + - component: {fileID: 169380231} + - component: {fileID: 169380230} + - component: {fileID: 169380229} + m_Layer: 0 + m_Name: werq (164) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &169380228 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 169380227} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -3.1950016} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 164 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &169380229 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 169380227} + 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 &169380230 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 169380227} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &169380231 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 169380227} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &181816470 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 181816471} + - component: {fileID: 181816474} + - component: {fileID: 181816473} + - component: {fileID: 181816472} + m_Layer: 0 + m_Name: werq (24) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &181816471 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 181816470} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.94499993, y: 0, z: -0.49300003} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 24 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &181816472 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 181816470} + 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 &181816473 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 181816470} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &181816474 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 181816470} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &186281139 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 186281140} + - component: {fileID: 186281143} + - component: {fileID: 186281142} + - component: {fileID: 186281141} + m_Layer: 0 + m_Name: werq (189) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &186281140 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 186281139} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.178, y: 0, z: -3.6880007} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 189 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &186281141 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 186281139} + 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 &186281142 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 186281139} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &186281143 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 186281139} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &188404883 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 188404884} + - component: {fileID: 188404887} + - component: {fileID: 188404886} + - component: {fileID: 188404885} + m_Layer: 0 + m_Name: werq (253) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &188404884 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 188404883} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3.072, y: 0, z: -3.6880007} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 253 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &188404885 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 188404883} + 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 &188404886 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 188404883} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &188404887 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 188404883} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &191799453 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 191799454} + - component: {fileID: 191799457} + - component: {fileID: 191799456} + - component: {fileID: 191799455} + m_Layer: 0 + m_Name: werq (125) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &191799454 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 191799453} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3.072, y: 0, z: -1.7079992} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 125 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &191799455 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 191799453} + 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 &191799456 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 191799453} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &191799457 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 191799453} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &193655140 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 193655141} + - component: {fileID: 193655144} + - component: {fileID: 193655143} + - component: {fileID: 193655142} + m_Layer: 0 + m_Name: werq (63) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &193655141 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 193655140} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.6389999, y: 0, z: -1.7079993} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 63 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &193655142 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 193655140} + 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 &193655143 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 193655140} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &193655144 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 193655140} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &193992118 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 193992119} + - component: {fileID: 193992122} + - component: {fileID: 193992121} + - component: {fileID: 193992120} + m_Layer: 0 + m_Name: werq (127) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &193992119 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 193992118} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3.533, y: 0, z: -1.7079993} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 127 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &193992120 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 193992118} + 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 &193992121 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 193992118} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &193992122 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 193992118} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &206214829 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 206214830} + - component: {fileID: 206214833} + - component: {fileID: 206214832} + - component: {fileID: 206214831} + m_Layer: 0 + m_Name: werq (169) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &206214830 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 206214829} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.233, y: 0, z: -3.4500008} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 169 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &206214831 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 206214829} + 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 &206214832 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 206214829} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &206214833 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 206214829} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &210309823 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 210309824} + - component: {fileID: 210309827} + - component: {fileID: 210309826} + - component: {fileID: 210309825} + m_Layer: 0 + m_Name: werq (157) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &210309824 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 210309823} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.178, y: 0, z: -2.7110014} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 157 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &210309825 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 210309823} + 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 &210309826 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 210309823} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &210309827 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 210309823} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &213478266 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 213478267} + - component: {fileID: 213478270} + - component: {fileID: 213478269} + - component: {fileID: 213478268} + m_Layer: 0 + m_Name: werq (104) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &213478267 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 213478266} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.894, y: 0, z: -1.4699993} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 104 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &213478268 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 213478266} + 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 &213478269 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 213478266} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &213478270 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 213478266} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &218116997 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 218116998} + - component: {fileID: 218117001} + - component: {fileID: 218117000} + - component: {fileID: 218116999} + m_Layer: 0 + m_Name: werq (108) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &218116998 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 218116997} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.894, y: 0, z: -1.7080002} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 108 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &218116999 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 218116997} + 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 &218117000 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 218116997} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &218117001 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 218116997} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &224195388 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224195389} + - component: {fileID: 224195392} + - component: {fileID: 224195391} + - component: {fileID: 224195390} + m_Layer: 0 + m_Name: werq (83) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &224195389 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 224195388} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3.533, y: 0, z: 0} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 83 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &224195390 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 224195388} + 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 &224195391 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 224195388} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &224195392 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 224195388} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &233906887 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 233906888} + - component: {fileID: 233906891} + - component: {fileID: 233906890} + - component: {fileID: 233906889} + m_Layer: 0 + m_Name: werq (39) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &233906888 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 233906887} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.69399995, y: 0, z: -1.2149993} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 39 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &233906889 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 233906887} + 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 &233906890 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 233906887} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &233906891 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 233906887} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &235112665 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 235112666} + - component: {fileID: 235112669} + - component: {fileID: 235112668} + - component: {fileID: 235112667} + m_Layer: 0 + m_Name: werq (166) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &235112666 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 235112665} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.461, y: 0, z: -3.1950016} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 166 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &235112667 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 235112665} + 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 &235112668 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 235112665} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &235112669 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 235112665} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &237078269 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 237078270} + - component: {fileID: 237078273} + - component: {fileID: 237078272} + - component: {fileID: 237078271} + m_Layer: 0 + m_Name: werq (135) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &237078270 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 237078269} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.69399995, y: 0, z: -2.2180014} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 135 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &237078271 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 237078269} + 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 &237078272 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 237078269} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &237078273 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 237078269} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &250510712 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 250510713} + - component: {fileID: 250510716} + - component: {fileID: 250510715} + - component: {fileID: 250510714} + m_Layer: 0 + m_Name: werq (5) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &250510713 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 250510712} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.233, y: 0, z: -0.23800087} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &250510714 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 250510712} + 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 &250510715 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 250510712} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &250510716 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 250510712} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &256564933 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 256564934} + - component: {fileID: 256564937} + - component: {fileID: 256564936} + - component: {fileID: 256564935} + m_Layer: 0 + m_Name: werq (131) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &256564934 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 256564933} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.69399995, y: 0, z: -1.9800014} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 131 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &256564935 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 256564933} + 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 &256564936 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 256564933} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &256564937 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 256564933} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &261586002 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 261586003} + - component: {fileID: 261586006} + - component: {fileID: 261586005} + - component: {fileID: 261586004} + m_Layer: 0 + m_Name: werq (123) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &261586003 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 261586002} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3.533, y: 0, z: -1.4699993} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 123 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &261586004 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 261586002} + 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 &261586005 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 261586002} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &261586006 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 261586002} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &286306874 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 286306875} + - component: {fileID: 286306878} + - component: {fileID: 286306877} + - component: {fileID: 286306876} + m_Layer: 0 + m_Name: werq (242) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &286306875 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 286306874} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3.3, y: 0, z: -2.9570007} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 242 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &286306876 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 286306874} + 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 &286306877 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 286306874} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &286306878 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 286306874} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &292590885 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 292590886} + - component: {fileID: 292590889} + - component: {fileID: 292590888} + - component: {fileID: 292590887} + m_Layer: 0 + m_Name: werq (175) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &292590886 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 292590885} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.69399995, y: 0, z: -3.6880007} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 175 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &292590887 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 292590885} + 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 &292590888 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 292590885} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &292590889 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 292590885} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &324852034 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 324852035} + - component: {fileID: 324852038} + - component: {fileID: 324852037} + - component: {fileID: 324852036} + m_Layer: 0 + m_Name: werq (97) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &324852035 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 324852034} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.127, y: 0, z: -0.9769993} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 97 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &324852036 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 324852034} + 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 &324852037 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 324852034} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &324852038 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 324852034} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &346676326 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 346676330} + - component: {fileID: 346676329} + - component: {fileID: 346676328} + - component: {fileID: 346676327} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!65 &346676327 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 346676326} + 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 &346676328 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 346676326} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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 &346676329 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 346676326} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &346676330 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 346676326} + 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: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &351881178 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 351881179} + - component: {fileID: 351881182} + - component: {fileID: 351881181} + - component: {fileID: 351881180} + m_Layer: 0 + m_Name: werq (75) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &351881179 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 351881178} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.588, y: 0, z: -0.49300003} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 75 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &351881180 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 351881178} + 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 &351881181 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 351881178} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &351881182 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 351881178} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &364557581 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 364557582} + - component: {fileID: 364557585} + - component: {fileID: 364557584} + - component: {fileID: 364557583} + m_Layer: 0 + m_Name: werq (58) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &364557582 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 364557581} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.4059999, y: 0, z: -1.4699993} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 58 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &364557583 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 364557581} + 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 &364557584 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 364557581} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &364557585 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 364557581} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &379641072 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 379641073} + - component: {fileID: 379641076} + - component: {fileID: 379641075} + - component: {fileID: 379641074} + m_Layer: 0 + m_Name: werq (241) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &379641073 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 379641072} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3.072, y: 0, z: -2.9570007} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 241 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &379641074 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 379641072} + 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 &379641075 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 379641072} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &379641076 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 379641072} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &379921466 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 379921467} + - component: {fileID: 379921470} + - component: {fileID: 379921469} + - component: {fileID: 379921468} + m_Layer: 0 + m_Name: werq (168) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &379921467 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 379921466} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -3.4500008} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 168 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &379921468 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 379921466} + 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 &379921469 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 379921466} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &379921470 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 379921466} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &385354836 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 385354837} + - component: {fileID: 385354840} + - component: {fileID: 385354839} + - component: {fileID: 385354838} + m_Layer: 0 + m_Name: werq (204) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &385354837 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 385354836} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.894, y: 0, z: -2.7110023} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 204 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &385354838 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 385354836} + 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 &385354839 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 385354836} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &385354840 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 385354836} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &389923200 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 389923201} + - component: {fileID: 389923204} + - component: {fileID: 389923203} + - component: {fileID: 389923202} + m_Layer: 0 + m_Name: werq (122) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &389923201 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 389923200} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3.3, y: 0, z: -1.4699993} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 122 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &389923202 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 389923200} + 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 &389923203 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 389923200} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &389923204 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 389923200} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &398540132 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 398540133} + - component: {fileID: 398540136} + - component: {fileID: 398540135} + - component: {fileID: 398540134} + m_Layer: 0 + m_Name: werq (254) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &398540133 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 398540132} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3.3, y: 0, z: -3.6880016} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 254 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &398540134 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 398540132} + 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 &398540135 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 398540132} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &398540136 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 398540132} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &405946599 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 405946600} + - component: {fileID: 405946603} + - component: {fileID: 405946602} + - component: {fileID: 405946601} + m_Layer: 0 + m_Name: werq (171) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &405946600 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 405946599} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.69399995, y: 0, z: -3.4500008} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 171 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &405946601 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 405946599} + 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 &405946602 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 405946599} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &405946603 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 405946599} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &407199355 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 407199356} + - component: {fileID: 407199359} + - component: {fileID: 407199358} + - component: {fileID: 407199357} + m_Layer: 0 + m_Name: werq (57) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &407199356 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 407199355} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.178, y: 0, z: -1.4699993} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 57 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &407199357 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 407199355} + 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 &407199358 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 407199355} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &407199359 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 407199355} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &482542012 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 482542013} + - component: {fileID: 482542016} + - component: {fileID: 482542015} + - component: {fileID: 482542014} + m_Layer: 0 + m_Name: werq (17) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &482542013 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 482542012} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.178, y: 0, z: 0} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 17 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &482542014 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 482542012} + 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 &482542015 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 482542012} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &482542016 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 482542012} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &482761098 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 482761099} + - component: {fileID: 482761102} + - component: {fileID: 482761101} + - component: {fileID: 482761100} + m_Layer: 0 + m_Name: werq (98) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &482761099 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 482761098} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.355, y: 0, z: -0.9769993} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 98 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &482761100 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 482761098} + 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 &482761101 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 482761098} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &482761102 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 482761098} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &488989116 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 488989117} + - component: {fileID: 488989120} + - component: {fileID: 488989119} + - component: {fileID: 488989118} + m_Layer: 0 + m_Name: werq (136) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &488989117 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 488989116} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -2.4730015} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 136 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &488989118 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 488989116} + 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 &488989119 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 488989116} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &488989120 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 488989116} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &489960630 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 489960631} + - component: {fileID: 489960634} + - component: {fileID: 489960633} + - component: {fileID: 489960632} + m_Layer: 0 + m_Name: werq (114) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &489960631 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 489960630} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3.3, y: 0, z: -0.9769993} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 114 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &489960632 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 489960630} + 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 &489960633 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 489960630} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &489960634 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 489960630} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &506377921 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 506377922} + - component: {fileID: 506377925} + - component: {fileID: 506377924} + - component: {fileID: 506377923} + m_Layer: 0 + m_Name: werq (62) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &506377922 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 506377921} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.4059999, y: 0, z: -1.7080002} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 62 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &506377923 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 506377921} + 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 &506377924 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 506377921} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &506377925 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 506377921} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &518010392 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 518010393} + - component: {fileID: 518010396} + - component: {fileID: 518010395} + - component: {fileID: 518010394} + m_Layer: 0 + m_Name: werq (215) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &518010393 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 518010392} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3.533, y: 0, z: -2.2180014} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 215 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &518010394 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 518010392} + 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 &518010395 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 518010392} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &518010396 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 518010392} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &529345318 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 529345319} + - component: {fileID: 529345322} + - component: {fileID: 529345321} + - component: {fileID: 529345320} + m_Layer: 0 + m_Name: werq (163) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &529345319 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 529345318} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.69399995, y: 0, z: -2.9570007} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 163 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &529345320 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 529345318} + 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 &529345321 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 529345318} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &529345322 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 529345318} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &555000401 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 555000402} + - component: {fileID: 555000405} + - component: {fileID: 555000404} + - component: {fileID: 555000403} + m_Layer: 0 + m_Name: werq (66) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &555000402 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 555000401} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.355, y: 0, z: 0} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 66 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &555000403 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 555000401} + 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 &555000404 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 555000401} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &555000405 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 555000401} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &561629645 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 561629646} + - component: {fileID: 561629649} + - component: {fileID: 561629648} + - component: {fileID: 561629647} + m_Layer: 0 + m_Name: werq (150) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &561629646 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 561629645} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.4059999, y: 0, z: -2.2180023} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 150 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &561629647 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 561629645} + 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 &561629648 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 561629645} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &561629649 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 561629645} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &565740968 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 565740969} + - component: {fileID: 565740972} + - component: {fileID: 565740971} + - component: {fileID: 565740970} + m_Layer: 0 + m_Name: werq (214) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &565740969 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 565740968} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3.3, y: 0, z: -2.2180023} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 214 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &565740970 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 565740968} + 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 &565740971 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 565740968} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &565740972 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 565740968} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &585236792 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 585236793} + - component: {fileID: 585236796} + - component: {fileID: 585236795} + - component: {fileID: 585236794} + m_Layer: 0 + m_Name: werq (37) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &585236793 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 585236792} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.233, y: 0, z: -1.2150002} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 37 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &585236794 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 585236792} + 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 &585236795 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 585236792} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &585236796 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 585236792} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &586781683 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 586781684} + - component: {fileID: 586781687} + - component: {fileID: 586781686} + - component: {fileID: 586781685} + m_Layer: 0 + m_Name: werq (129) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &586781684 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 586781683} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.233, y: 0, z: -1.9800014} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 129 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &586781685 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 586781683} + 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 &586781686 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 586781683} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &586781687 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 586781683} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &590172462 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 590172463} + - component: {fileID: 590172466} + - component: {fileID: 590172465} + - component: {fileID: 590172464} + m_Layer: 0 + m_Name: werq (68) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &590172463 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 590172462} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.894, y: 0, z: -0.23800087} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 68 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &590172464 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 590172462} + 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 &590172465 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 590172462} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &590172466 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 590172462} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &596272298 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 596272299} + - component: {fileID: 596272302} + - component: {fileID: 596272301} + - component: {fileID: 596272300} + m_Layer: 0 + m_Name: werq (212) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &596272299 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 596272298} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.839, y: 0, z: -2.2180023} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 212 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &596272300 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 596272298} + 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 &596272301 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 596272298} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &596272302 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 596272298} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &601557655 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 601557656} + - component: {fileID: 601557659} + - component: {fileID: 601557658} + - component: {fileID: 601557657} + m_Layer: 0 + m_Name: werq (179) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &601557656 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 601557655} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.6389999, y: 0, z: -2.9570007} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 179 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &601557657 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 601557655} + 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 &601557658 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 601557655} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &601557659 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 601557655} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &604298090 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 604298091} + - component: {fileID: 604298094} + - component: {fileID: 604298093} + - component: {fileID: 604298092} + m_Layer: 0 + m_Name: werq (203) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &604298091 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 604298090} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.588, y: 0, z: -2.4730015} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 203 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &604298092 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 604298090} + 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 &604298093 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 604298090} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &604298094 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 604298090} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &620561609 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 620561612} + - component: {fileID: 620561611} + - component: {fileID: 620561610} + - component: {fileID: 620561613} + m_Layer: 0 + m_Name: NetworkManager + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &620561610 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 620561609} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b84c2d8dfe509a34fb59e2b81f8e1319, type: 3} + m_Name: + m_EditorClassIdentifier: + MessageBufferSize: 5120 + MaxConnections: 100 + MaxSentMessageQueueSize: 128 + ConnectAddress: 127.0.0.1 + ConnectPort: 7777 + ServerListenPort: 7777 + ServerWebsocketListenPort: 8887 + SupportWebsocket: 0 + Channels: [] + UseMLAPIRelay: 0 + MLAPIRelayAddress: 184.72.104.138 + MLAPIRelayPort: 8888 + MessageSendMode: 0 +--- !u!114 &620561611 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 620561609} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 593a2fe42fa9d37498c96f9a383b6521, type: 3} + m_Name: + m_EditorClassIdentifier: + DontDestroy: 1 + RunInBackground: 1 + LogLevel: 1 + NetworkConfig: + ProtocolVersion: 0 + NetworkTransport: {fileID: 620561610} + RegisteredScenes: + - SampleScene + - ZooSam + AllowRuntimeSceneChanges: 0 + PlayerPrefab: {fileID: 4700706668509470175, guid: 7eeaaf9e50c0afc4dab93584a54fb0d6, + type: 3} + NetworkPrefabs: [] + TickRate: 20 + ClientConnectionBufferTimeout: 10 + ConnectionApproval: 0 + ConnectionData: + EnableTimeResync: 0 + TimeResyncInterval: 30 + EnableNetworkVariable: 1 + EnsureNetworkVariableLengthSafety: 0 + EnableSceneManagement: 1 + ForceSamePrefabs: 1 + RecycleNetworkIds: 1 + NetworkIdRecycleDelay: 120 + RpcHashSize: 0 + LoadSceneTimeOut: 120 + EnableMessageBuffering: 1 + MessageBufferTimeout: 20 + EnableNetworkLogs: 1 +--- !u!4 &620561612 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 620561609} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 1} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &620561613 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 620561609} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: db28424c2ae12f64da25c9ecccded6b1, type: 3} + m_Name: + m_EditorClassIdentifier: + Port: 7777 + Address: 127.0.0.1 + PingInterval: 1 + DisconnectTimeout: 5 + ReconnectDelay: 0.5 + MaxConnectAttempts: 10 + channels: [] + MessageBufferSize: 5120 + SimulatePacketLossChance: 0 + SimulateMinLatency: 100 + SimulateMaxLatency: 100 +--- !u!1001 &627808638 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 1333567166} + m_Modifications: + - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + type: 3} + propertyPath: m_Pivot.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + type: 3} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + type: 3} + propertyPath: m_AnchorMax.x + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + type: 3} + propertyPath: m_AnchorMax.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + type: 3} + propertyPath: m_AnchorMin.x + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + type: 3} + propertyPath: m_AnchorMin.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + type: 3} + propertyPath: m_SizeDelta.x + value: 20 + objectReference: {fileID: 0} + - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + type: 3} + propertyPath: m_SizeDelta.y + value: 25 + objectReference: {fileID: 0} + - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + type: 3} + propertyPath: m_AnchoredPosition.x + value: -23.40039 + objectReference: {fileID: 0} + - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + type: 3} + propertyPath: m_AnchoredPosition.y + value: -23.800293 + objectReference: {fileID: 0} + - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2848221156307247795, guid: 3200770c16e3b2b4ebe7f604154faac7, + type: 3} + propertyPath: m_Name + value: ExitButton + objectReference: {fileID: 0} + - target: {fileID: 5266522511616468950, guid: 3200770c16e3b2b4ebe7f604154faac7, + type: 3} + propertyPath: m_SceneMenuToLoad + value: + objectReference: {fileID: 11400000, guid: c10d995498e0c514a853c3506031d3fb, + type: 2} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 3200770c16e3b2b4ebe7f604154faac7, type: 3} +--- !u!224 &627808639 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + type: 3} + m_PrefabInstance: {fileID: 627808638} + m_PrefabAsset: {fileID: 0} +--- !u!1 &630511901 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 630511902} + - component: {fileID: 630511905} + - component: {fileID: 630511904} + - component: {fileID: 630511903} + m_Layer: 0 + m_Name: werq (80) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &630511902 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 630511901} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.839, y: 0, z: 0} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 80 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &630511903 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 630511901} + 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 &630511904 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 630511901} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &630511905 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 630511901} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!850595691 &633987594 +LightingSettings: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Settings.lighting + serializedVersion: 3 + m_GIWorkflowMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_RealtimeEnvironmentLighting: 1 + m_BounceScale: 1 + m_AlbedoBoost: 1 + m_IndirectOutputScale: 1 + m_UsingShadowmask: 1 + m_BakeBackend: 1 + m_LightmapMaxSize: 1024 + m_BakeResolution: 40 + m_Padding: 2 + m_TextureCompression: 1 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAO: 0 + m_MixedBakeMode: 2 + m_LightmapsBakeMode: 1 + m_FilterMode: 1 + m_LightmapParameters: {fileID: 15204, guid: 0000000000000000f000000000000000, type: 0} + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_RealtimeResolution: 2 + m_ForceWhiteAlbedo: 0 + m_ForceUpdates: 0 + m_FinalGather: 0 + m_FinalGatherRayCount: 256 + m_FinalGatherFiltering: 1 + m_PVRCulling: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVREnvironmentSampleCount: 500 + m_PVREnvironmentReferencePointCount: 2048 + m_LightProbeSampleCountMultiplier: 4 + m_PVRBounces: 2 + m_PVRMinBounces: 2 + m_PVREnvironmentMIS: 0 + m_PVRFilteringMode: 2 + m_PVRDenoiserTypeDirect: 0 + m_PVRDenoiserTypeIndirect: 0 + m_PVRDenoiserTypeAO: 0 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 +--- !u!1 &644252816 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 644252817} + - component: {fileID: 644252820} + - component: {fileID: 644252819} + - component: {fileID: 644252818} + m_Layer: 0 + m_Name: werq (210) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &644252817 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 644252816} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3.3, y: 0, z: -1.9800014} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 210 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &644252818 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 644252816} + 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 &644252819 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 644252816} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &644252820 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 644252816} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &646268286 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 646268287} + - component: {fileID: 646268290} + - component: {fileID: 646268289} + - component: {fileID: 646268288} + m_Layer: 0 + m_Name: werq (84) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &646268287 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 646268286} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.839, y: 0, z: -0.23800087} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 84 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &646268288 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 646268286} + 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 &646268289 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 646268286} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &646268290 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 646268286} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &647288638 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 647288639} + - component: {fileID: 647288642} + - component: {fileID: 647288641} + - component: {fileID: 647288640} + m_Layer: 0 + m_Name: werq (170) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &647288639 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 647288638} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.461, y: 0, z: -3.4500008} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 170 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &647288640 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 647288638} + 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 &647288641 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 647288638} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &647288642 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 647288638} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &648827426 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 648827427} + - component: {fileID: 648827430} + - component: {fileID: 648827429} + - component: {fileID: 648827428} + m_Layer: 0 + m_Name: werq (44) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &648827427 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 648827426} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -1.7080002} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 44 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &648827428 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 648827426} + 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 &648827429 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 648827426} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &648827430 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 648827426} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &650186540 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 650186541} + - component: {fileID: 650186544} + - component: {fileID: 650186543} + - component: {fileID: 650186542} + m_Layer: 0 + m_Name: werq (126) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &650186541 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 650186540} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3.3, y: 0, z: -1.7080002} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 126 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &650186542 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 650186540} + 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 &650186543 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 650186540} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &650186544 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 650186540} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &657213826 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 657213827} + - component: {fileID: 657213830} + - component: {fileID: 657213829} + - component: {fileID: 657213828} + m_Layer: 0 + m_Name: werq (26) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &657213827 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 657213826} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.4059999, y: 0, z: -0.49300003} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 26 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &657213828 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 657213826} + 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 &657213829 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 657213826} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &657213830 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 657213826} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &672979497 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 672979498} + - component: {fileID: 672979501} + - component: {fileID: 672979500} + - component: {fileID: 672979499} + m_Layer: 0 + m_Name: werq (21) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &672979498 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 672979497} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.178, y: 0, z: -0.23800087} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 21 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &672979499 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 672979497} + 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 &672979500 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 672979497} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &672979501 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 672979497} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &674940303 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 674940304} + - component: {fileID: 674940307} + - component: {fileID: 674940306} + - component: {fileID: 674940305} + m_Layer: 0 + m_Name: werq (155) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &674940304 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 674940303} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.6389999, y: 0, z: -2.4730015} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 155 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &674940305 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 674940303} + 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 &674940306 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 674940303} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &674940307 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 674940303} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &678326392 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 678326399} + - component: {fileID: 678326398} + - component: {fileID: 678326397} + - component: {fileID: 678326396} + - component: {fileID: 678326394} + - component: {fileID: 678326393} + - component: {fileID: 678326395} + m_Layer: 0 + m_Name: NetworkTransformBuffered + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &678326393 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 678326392} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 307c40a41954948e7a36bb6b64b4b9cb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_MoveSpeed: 5 + m_RotationSpeed: 30 +--- !u!114 &678326394 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 678326392} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} + m_Name: + m_EditorClassIdentifier: + GlobalObjectIdHash: 3301752843 + AlwaysReplicateAsRoot: 0 + DontDestroyWithOwner: 0 + AutoObjectParentSync: 1 +--- !u!114 &678326395 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 678326392} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3} + m_Name: + m_EditorClassIdentifier: + Authority: 0 + InLocalSpace: 0 + FixedSendsPerSecond: 30 + m_PositionInterpolatorFactory: {fileID: 11400000, guid: a882403a7bf6247cd881a093a9a3f537, + type: 2} +--- !u!65 &678326396 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 678326392} + 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 &678326397 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 678326392} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: 16358fcb4e0c94cc8b980fbb17259843, 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 &678326398 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 678326392} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &678326399 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 678326392} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -8.25, y: 1.55, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 702051986} + m_Father: {fileID: 0} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &680150732 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 680150733} + - component: {fileID: 680150736} + - component: {fileID: 680150735} + - component: {fileID: 680150734} + m_Layer: 0 + m_Name: werq (54) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &680150733 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 680150732} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.4059999, y: 0, z: -1.2150002} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 54 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &680150734 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 680150732} + 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 &680150735 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 680150732} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &680150736 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 680150732} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &687753481 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 687753482} + - component: {fileID: 687753485} + - component: {fileID: 687753484} + - component: {fileID: 687753483} + m_Layer: 0 + m_Name: werq (218) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &687753482 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 687753481} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3.3, y: 0, z: -2.4730015} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 218 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &687753483 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 687753481} + 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 &687753484 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 687753481} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &687753485 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 687753481} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &695189437 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 695189438} + - component: {fileID: 695189441} + - component: {fileID: 695189440} + - component: {fileID: 695189439} + m_Layer: 0 + m_Name: werq (222) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &695189438 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 695189437} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3.3, y: 0, z: -2.7110023} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 222 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &695189439 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 695189437} + 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 &695189440 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 695189437} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &695189441 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 695189437} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &702051983 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 702051986} + - component: {fileID: 702051985} + - component: {fileID: 702051984} + m_Layer: 0 + m_Name: Camera + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &702051984 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 702051983} + m_Enabled: 1 +--- !u!20 &702051985 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 702051983} + 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: 0 + 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 &702051986 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 702051983} + m_LocalRotation: {x: 0.5, y: -0, z: -0, w: 0.8660254} + m_LocalPosition: {x: 8.25, y: 18.45, z: -16} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 678326399} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 60, y: 0, z: 0} +--- !u!1 &705507993 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 705507995} + - component: {fileID: 705507994} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &705507994 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 705507993} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 1 + m_Shape: 0 + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.802082 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 0.3 + 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: 1 + 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 &705507995 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 705507993} + 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: 0 + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &707341896 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 707341897} + - component: {fileID: 707341900} + - component: {fileID: 707341899} + - component: {fileID: 707341898} + m_Layer: 0 + m_Name: werq (147) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &707341897 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 707341896} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.6389999, y: 0, z: -1.9800014} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 147 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &707341898 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 707341896} + 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 &707341899 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 707341896} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &707341900 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 707341896} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &709695180 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 709695181} + - component: {fileID: 709695184} + - component: {fileID: 709695183} + - component: {fileID: 709695182} + m_Layer: 0 + m_Name: werq (144) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &709695181 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 709695180} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.94499993, y: 0, z: -1.9800014} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 144 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &709695182 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 709695180} + 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 &709695183 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 709695180} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &709695184 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 709695180} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &725194418 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 725194419} + - component: {fileID: 725194422} + - component: {fileID: 725194421} + - component: {fileID: 725194420} + m_Layer: 0 + m_Name: werq (90) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &725194419 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 725194418} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3.3, y: 0, z: -0.49300003} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 90 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &725194420 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 725194418} + 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 &725194421 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 725194418} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &725194422 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 725194418} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &726973988 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 726973989} + - component: {fileID: 726973992} + - component: {fileID: 726973991} + - component: {fileID: 726973990} + m_Layer: 0 + m_Name: werq (100) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &726973989 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 726973988} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.894, y: 0, z: -1.2150002} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 100 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &726973990 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 726973988} + 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 &726973991 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 726973988} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &726973992 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 726973988} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &727811949 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 727811950} + m_Layer: 0 + m_Name: scene + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &727811950 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 727811949} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -16.3, y: 0, z: 14.7} + m_LocalScale: {x: 8.708106, y: 8.708106, z: 8.708106} + m_Children: + - {fileID: 965264336} + - {fileID: 2078151580} + - {fileID: 1137692337} + - {fileID: 1788125429} + - {fileID: 983885396} + - {fileID: 250510713} + - {fileID: 1074598069} + - {fileID: 917869278} + - {fileID: 1570850648} + - {fileID: 2129603127} + - {fileID: 1300058641} + - {fileID: 1180163489} + - {fileID: 774843098} + - {fileID: 1790575671} + - {fileID: 1067422388} + - {fileID: 1156253991} + - {fileID: 817113581} + - {fileID: 482542013} + - {fileID: 1215758530} + - {fileID: 1357212647} + - {fileID: 1112769138} + - {fileID: 672979498} + - {fileID: 1694079736} + - {fileID: 145865923} + - {fileID: 181816471} + - {fileID: 71608579} + - {fileID: 657213827} + - {fileID: 896146542} + - {fileID: 1461177417} + - {fileID: 1586201512} + - {fileID: 897885835} + - {fileID: 1691410013} + - {fileID: 1268059512} + - {fileID: 1159180716} + - {fileID: 1048788819} + - {fileID: 1405769696} + - {fileID: 1224370287} + - {fileID: 585236793} + - {fileID: 1133583831} + - {fileID: 233906888} + - {fileID: 1047784309} + - {fileID: 835641754} + - {fileID: 1949195316} + - {fileID: 1131956204} + - {fileID: 648827427} + - {fileID: 1385336452} + - {fileID: 2089701613} + - {fileID: 1602406365} + - {fileID: 1377941354} + - {fileID: 1426981712} + - {fileID: 1703907385} + - {fileID: 731245576} + - {fileID: 1060401003} + - {fileID: 1003925989} + - {fileID: 680150733} + - {fileID: 2128892964} + - {fileID: 1421330464} + - {fileID: 407199356} + - {fileID: 364557582} + - {fileID: 1740002709} + - {fileID: 1429461274} + - {fileID: 865488583} + - {fileID: 506377922} + - {fileID: 193655141} + - {fileID: 1409818199} + - {fileID: 1895837568} + - {fileID: 555000402} + - {fileID: 1870696866} + - {fileID: 590172463} + - {fileID: 1518464149} + - {fileID: 1093974178} + - {fileID: 1619314279} + - {fileID: 1958441939} + - {fileID: 1858019618} + - {fileID: 1180366241} + - {fileID: 351881179} + - {fileID: 1406760490} + - {fileID: 737390303} + - {fileID: 1732288670} + - {fileID: 827154094} + - {fileID: 630511902} + - {fileID: 961255783} + - {fileID: 863682373} + - {fileID: 224195389} + - {fileID: 646268287} + - {fileID: 49482615} + - {fileID: 1341498265} + - {fileID: 1952242987} + - {fileID: 1262347583} + - {fileID: 1271441866} + - {fileID: 725194419} + - {fileID: 1659076780} + - {fileID: 1278291353} + - {fileID: 37826287} + - {fileID: 1839669254} + - {fileID: 1669016180} + - {fileID: 1156559623} + - {fileID: 324852035} + - {fileID: 482761099} + - {fileID: 1409119961} + - {fileID: 726973989} + - {fileID: 1190201087} + - {fileID: 1687987867} + - {fileID: 1425645966} + - {fileID: 213478267} + - {fileID: 80528583} + - {fileID: 1571650944} + - {fileID: 1325528651} + - {fileID: 218116998} + - {fileID: 1730875156} + - {fileID: 2019907571} + - {fileID: 744554807} + - {fileID: 1748430818} + - {fileID: 1049975820} + - {fileID: 489960631} + - {fileID: 1663972044} + - {fileID: 2053103142} + - {fileID: 1162454166} + - {fileID: 1147996526} + - {fileID: 2049090155} + - {fileID: 1114307393} + - {fileID: 1209088797} + - {fileID: 389923201} + - {fileID: 261586003} + - {fileID: 819907130} + - {fileID: 191799454} + - {fileID: 650186541} + - {fileID: 193992119} + - {fileID: 2024574102} + - {fileID: 586781684} + - {fileID: 2106865351} + - {fileID: 256564934} + - {fileID: 777257499} + - {fileID: 1838111266} + - {fileID: 2030561001} + - {fileID: 237078270} + - {fileID: 488989117} + - {fileID: 1860346520} + - {fileID: 1029714101} + - {fileID: 1985357180} + - {fileID: 149862985} + - {fileID: 110121430} + - {fileID: 1728034271} + - {fileID: 150536645} + - {fileID: 709695181} + - {fileID: 1680116253} + - {fileID: 33522694} + - {fileID: 707341897} + - {fileID: 2036986369} + - {fileID: 1005765828} + - {fileID: 561629646} + - {fileID: 1532247925} + - {fileID: 1618818993} + - {fileID: 1566163831} + - {fileID: 1583118626} + - {fileID: 674940304} + - {fileID: 839241139} + - {fileID: 210309824} + - {fileID: 942872872} + - {fileID: 956820039} + - {fileID: 1493942655} + - {fileID: 1104813048} + - {fileID: 902054443} + - {fileID: 529345319} + - {fileID: 169380228} + - {fileID: 1852876036} + - {fileID: 235112666} + - {fileID: 1711317423} + - {fileID: 379921467} + - {fileID: 206214830} + - {fileID: 647288639} + - {fileID: 405946600} + - {fileID: 1859094915} + - {fileID: 1981994849} + - {fileID: 788050735} + - {fileID: 292590886} + - {fileID: 1258424360} + - {fileID: 1323055548} + - {fileID: 1821753631} + - {fileID: 601557656} + - {fileID: 1615309368} + - {fileID: 1439769665} + - {fileID: 1191496718} + - {fileID: 1812680816} + - {fileID: 734717413} + - {fileID: 1556458765} + - {fileID: 953666714} + - {fileID: 1402687344} + - {fileID: 1368127828} + - {fileID: 186281140} + - {fileID: 779681318} + - {fileID: 959147176} + - {fileID: 79838172} + - {fileID: 1618109824} + - {fileID: 884228700} + - {fileID: 1089358756} + - {fileID: 916313679} + - {fileID: 53667805} + - {fileID: 1604954356} + - {fileID: 1056515548} + - {fileID: 1451779898} + - {fileID: 1633292496} + - {fileID: 1218492681} + - {fileID: 604298091} + - {fileID: 385354837} + - {fileID: 1796328355} + - {fileID: 1269849011} + - {fileID: 1537050449} + - {fileID: 1272924906} + - {fileID: 1191630249} + - {fileID: 644252817} + - {fileID: 1093954316} + - {fileID: 596272299} + - {fileID: 995765806} + - {fileID: 565740969} + - {fileID: 518010393} + - {fileID: 1776278817} + - {fileID: 1180486513} + - {fileID: 687753482} + - {fileID: 1248100665} + - {fileID: 1165208748} + - {fileID: 1433282151} + - {fileID: 695189438} + - {fileID: 1953834567} + - {fileID: 2060061433} + - {fileID: 1697254606} + - {fileID: 1918158912} + - {fileID: 956406376} + - {fileID: 100213238} + - {fileID: 1103049817} + - {fileID: 1426769440} + - {fileID: 801747461} + - {fileID: 1783447246} + - {fileID: 1769252478} + - {fileID: 1778934116} + - {fileID: 125350742} + - {fileID: 2133559710} + - {fileID: 777692127} + - {fileID: 106240637} + - {fileID: 1027215038} + - {fileID: 1333670312} + - {fileID: 379641073} + - {fileID: 286306875} + - {fileID: 1347200039} + - {fileID: 771846004} + - {fileID: 2068975255} + - {fileID: 1254141403} + - {fileID: 1350981874} + - {fileID: 1722987696} + - {fileID: 1168640878} + - {fileID: 106591949} + - {fileID: 959806568} + - {fileID: 1091646623} + - {fileID: 188404884} + - {fileID: 398540133} + - {fileID: 1399839515} + m_Father: {fileID: 0} + m_RootOrder: 7 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &731245575 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 731245576} + - component: {fileID: 731245579} + - component: {fileID: 731245578} + - component: {fileID: 731245577} + m_Layer: 0 + m_Name: werq (51) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &731245576 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 731245575} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.6389999, y: 0, z: -0.9769993} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 51 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &731245577 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 731245575} + 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 &731245578 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 731245575} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &731245579 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 731245575} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &734717412 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 734717413} + - component: {fileID: 734717416} + - component: {fileID: 734717415} + - component: {fileID: 734717414} + m_Layer: 0 + m_Name: werq (184) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &734717413 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 734717412} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.94499993, y: 0, z: -3.4500008} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 184 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &734717414 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 734717412} + 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 &734717415 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 734717412} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &734717416 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 734717412} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &737390302 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 737390303} + - component: {fileID: 737390306} + - component: {fileID: 737390305} + - component: {fileID: 737390304} + m_Layer: 0 + m_Name: werq (77) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &737390303 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 737390302} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.127, y: 0, z: -0.731} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 77 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &737390304 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 737390302} + 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 &737390305 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 737390302} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &737390306 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 737390302} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &744554806 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 744554807} + - component: {fileID: 744554810} + - component: {fileID: 744554809} + - component: {fileID: 744554808} + m_Layer: 0 + m_Name: werq (111) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &744554807 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 744554806} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.588, y: 0, z: -1.7079993} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 111 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &744554808 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 744554806} + 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 &744554809 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 744554806} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &744554810 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 744554806} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &771846003 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 771846004} + - component: {fileID: 771846007} + - component: {fileID: 771846006} + - component: {fileID: 771846005} + m_Layer: 0 + m_Name: werq (244) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &771846004 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 771846003} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.839, y: 0, z: -3.1950016} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 244 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &771846005 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 771846003} + 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 &771846006 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 771846003} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &771846007 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 771846003} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &774843097 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 774843098} + - component: {fileID: 774843101} + - component: {fileID: 774843100} + - component: {fileID: 774843099} + m_Layer: 0 + m_Name: werq (12) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &774843098 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 774843097} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -0.7310009} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 12 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &774843099 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 774843097} + 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 &774843100 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 774843097} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &774843101 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 774843097} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &777257498 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 777257499} + - component: {fileID: 777257502} + - component: {fileID: 777257501} + - component: {fileID: 777257500} + m_Layer: 0 + m_Name: werq (132) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &777257499 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 777257498} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -2.2180023} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 132 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &777257500 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 777257498} + 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 &777257501 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 777257498} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &777257502 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 777257498} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &777692126 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 777692127} + - component: {fileID: 777692130} + - component: {fileID: 777692129} + - component: {fileID: 777692128} + m_Layer: 0 + m_Name: werq (237) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &777692127 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 777692126} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.127, y: 0, z: -3.6880007} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 237 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &777692128 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 777692126} + 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 &777692129 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 777692126} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &777692130 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 777692126} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &779681317 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 779681318} + - component: {fileID: 779681321} + - component: {fileID: 779681320} + - component: {fileID: 779681319} + m_Layer: 0 + m_Name: werq (190) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &779681318 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 779681317} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.4059999, y: 0, z: -3.6880016} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 190 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &779681319 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 779681317} + 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 &779681320 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 779681317} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &779681321 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 779681317} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &788050734 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 788050735} + - component: {fileID: 788050738} + - component: {fileID: 788050737} + - component: {fileID: 788050736} + m_Layer: 0 + m_Name: werq (174) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &788050735 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 788050734} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.461, y: 0, z: -3.6880016} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 174 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &788050736 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 788050734} + 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 &788050737 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 788050734} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &788050738 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 788050734} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &801747460 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 801747461} + - component: {fileID: 801747464} + - component: {fileID: 801747463} + - component: {fileID: 801747462} + m_Layer: 0 + m_Name: werq (231) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &801747461 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 801747460} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.588, y: 0, z: -3.1950006} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 231 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &801747462 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 801747460} + 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 &801747463 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 801747460} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &801747464 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 801747460} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &817113580 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 817113581} + - component: {fileID: 817113584} + - component: {fileID: 817113583} + - component: {fileID: 817113582} + m_Layer: 0 + m_Name: werq (16) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &817113581 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 817113580} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.94499993, y: 0, z: 0} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 16 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &817113582 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 817113580} + 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 &817113583 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 817113580} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &817113584 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 817113580} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &819907129 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 819907130} + - component: {fileID: 819907133} + - component: {fileID: 819907132} + - component: {fileID: 819907131} + m_Layer: 0 + m_Name: werq (124) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &819907130 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 819907129} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.839, y: 0, z: -1.7080002} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 124 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &819907131 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 819907129} + 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 &819907132 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 819907129} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &819907133 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 819907129} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &827154093 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 827154094} + - component: {fileID: 827154097} + - component: {fileID: 827154096} + - component: {fileID: 827154095} + m_Layer: 0 + m_Name: werq (79) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &827154094 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 827154093} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.588, y: 0, z: -0.73100007} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 79 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &827154095 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 827154093} + 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 &827154096 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 827154093} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &827154097 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 827154093} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &835641753 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 835641754} + - component: {fileID: 835641757} + - component: {fileID: 835641756} + - component: {fileID: 835641755} + m_Layer: 0 + m_Name: werq (41) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &835641754 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 835641753} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.233, y: 0, z: -1.4699993} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 41 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &835641755 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 835641753} + 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 &835641756 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 835641753} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &835641757 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 835641753} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &839241138 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 839241139} + - component: {fileID: 839241142} + - component: {fileID: 839241141} + - component: {fileID: 839241140} + m_Layer: 0 + m_Name: werq (156) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &839241139 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 839241138} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.94499993, y: 0, z: -2.7110023} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 156 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &839241140 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 839241138} + 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 &839241141 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 839241138} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &839241142 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 839241138} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &849106629 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 849106632} + - component: {fileID: 849106631} + - component: {fileID: 849106630} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &849106630 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 849106629} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel + m_InputActionsPerSecond: 10 + m_RepeatDelay: 0.5 + m_ForceModuleActive: 0 +--- !u!114 &849106631 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 849106629} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 10 +--- !u!4 &849106632 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 849106629} + 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: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &863682372 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 863682373} + - component: {fileID: 863682376} + - component: {fileID: 863682375} + - component: {fileID: 863682374} + m_Layer: 0 + m_Name: werq (82) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &863682373 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 863682372} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3.3, y: 0, z: 0} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 82 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &863682374 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 863682372} + 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 &863682375 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 863682372} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &863682376 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 863682372} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &865488582 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 865488583} + - component: {fileID: 865488586} + - component: {fileID: 865488585} + - component: {fileID: 865488584} + m_Layer: 0 + m_Name: werq (61) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &865488583 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 865488582} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.178, y: 0, z: -1.7079992} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 61 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &865488584 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 865488582} + 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 &865488585 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 865488582} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &865488586 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 865488582} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &884228699 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 884228700} + - component: {fileID: 884228703} + - component: {fileID: 884228702} + - component: {fileID: 884228701} + m_Layer: 0 + m_Name: werq (194) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &884228700 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 884228699} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.355, y: 0, z: -1.9800014} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 194 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &884228701 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 884228699} + 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 &884228702 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 884228699} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &884228703 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 884228699} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &896146541 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 896146542} + - component: {fileID: 896146545} + - component: {fileID: 896146544} + - component: {fileID: 896146543} + m_Layer: 0 + m_Name: werq (27) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &896146542 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 896146541} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.6389999, y: 0, z: -0.49300003} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 27 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &896146543 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 896146541} + 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 &896146544 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 896146541} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &896146545 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 896146541} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &897885834 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 897885835} + - component: {fileID: 897885838} + - component: {fileID: 897885837} + - component: {fileID: 897885836} + m_Layer: 0 + m_Name: werq (30) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &897885835 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 897885834} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.4059999, y: 0, z: -0.7310009} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 30 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &897885836 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 897885834} + 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 &897885837 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 897885834} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &897885838 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 897885834} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &902054442 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 902054443} + - component: {fileID: 902054446} + - component: {fileID: 902054445} + - component: {fileID: 902054444} + m_Layer: 0 + m_Name: werq (162) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &902054443 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 902054442} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.461, y: 0, z: -2.9570007} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 162 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &902054444 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 902054442} + 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 &902054445 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 902054442} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &902054446 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 902054442} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &916313678 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 916313679} + - component: {fileID: 916313682} + - component: {fileID: 916313681} + - component: {fileID: 916313680} + m_Layer: 0 + m_Name: werq (196) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &916313679 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 916313678} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.894, y: 0, z: -2.2180023} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 196 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &916313680 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 916313678} + 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 &916313681 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 916313678} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &916313682 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 916313678} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &917869277 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 917869278} + - component: {fileID: 917869281} + - component: {fileID: 917869280} + - component: {fileID: 917869279} + m_Layer: 0 + m_Name: werq (7) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &917869278 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 917869277} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.69399995, y: 0, z: -0.238} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 7 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &917869279 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 917869277} + 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 &917869280 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 917869277} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &917869281 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 917869277} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &942872871 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 942872872} + - component: {fileID: 942872875} + - component: {fileID: 942872874} + - component: {fileID: 942872873} + m_Layer: 0 + m_Name: werq (158) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &942872872 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 942872871} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.4059999, y: 0, z: -2.7110023} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 158 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &942872873 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 942872871} + 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 &942872874 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 942872871} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &942872875 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 942872871} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &953666713 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 953666714} + - component: {fileID: 953666717} + - component: {fileID: 953666716} + - component: {fileID: 953666715} + m_Layer: 0 + m_Name: werq (186) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &953666714 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 953666713} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.4059999, y: 0, z: -3.4500008} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 186 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &953666715 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 953666713} + 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 &953666716 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 953666713} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &953666717 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 953666713} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &956406375 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 956406376} + - component: {fileID: 956406379} + - component: {fileID: 956406378} + - component: {fileID: 956406377} + m_Layer: 0 + m_Name: werq (227) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &956406376 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 956406375} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.588, y: 0, z: -2.9570007} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 227 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &956406377 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 956406375} + 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 &956406378 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 956406375} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &956406379 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 956406375} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &956820038 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 956820039} + - component: {fileID: 956820042} + - component: {fileID: 956820041} + - component: {fileID: 956820040} + m_Layer: 0 + m_Name: werq (159) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &956820039 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 956820038} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.6389999, y: 0, z: -2.7110014} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 159 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &956820040 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 956820038} + 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 &956820041 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 956820038} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &956820042 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 956820038} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &959147175 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 959147176} + - component: {fileID: 959147179} + - component: {fileID: 959147178} + - component: {fileID: 959147177} + m_Layer: 0 + m_Name: werq (191) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &959147176 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 959147175} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.6389999, y: 0, z: -3.6880007} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 191 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &959147177 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 959147175} + 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 &959147178 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 959147175} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &959147179 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 959147175} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &959806567 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 959806568} + - component: {fileID: 959806571} + - component: {fileID: 959806570} + - component: {fileID: 959806569} + m_Layer: 0 + m_Name: werq (251) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &959806568 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 959806567} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3.533, y: 0, z: -3.4500008} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 251 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &959806569 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 959806567} + 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 &959806570 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 959806567} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &959806571 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 959806567} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &961255782 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 961255783} + - component: {fileID: 961255786} + - component: {fileID: 961255785} + - component: {fileID: 961255784} + m_Layer: 0 + m_Name: werq (81) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &961255783 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 961255782} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3.072, y: 0, z: 0} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 81 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &961255784 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 961255782} + 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 &961255785 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 961255782} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &961255786 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 961255782} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &965264335 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 965264336} + - component: {fileID: 965264339} + - component: {fileID: 965264338} + - component: {fileID: 965264337} + m_Layer: 0 + m_Name: werq + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &965264336 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 965264335} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &965264337 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 965264335} + 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 &965264338 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 965264335} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &965264339 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 965264335} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &983885395 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 983885396} + - component: {fileID: 983885399} + - component: {fileID: 983885398} + - component: {fileID: 983885397} + m_Layer: 0 + m_Name: werq (4) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &983885396 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 983885395} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -0.23800087} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &983885397 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 983885395} + 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 &983885398 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 983885395} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &983885399 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 983885395} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &995765805 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 995765806} + - component: {fileID: 995765809} + - component: {fileID: 995765808} + - component: {fileID: 995765807} + m_Layer: 0 + m_Name: werq (213) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &995765806 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 995765805} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3.072, y: 0, z: -2.2180023} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 213 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &995765807 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 995765805} + 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 &995765808 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 995765805} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &995765809 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 995765805} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1003925988 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1003925989} + - component: {fileID: 1003925992} + - component: {fileID: 1003925991} + - component: {fileID: 1003925990} + m_Layer: 0 + m_Name: werq (53) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1003925989 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1003925988} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.178, y: 0, z: -1.2150002} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 53 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1003925990 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1003925988} + 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 &1003925991 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1003925988} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1003925992 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1003925988} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1005765827 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1005765828} + - component: {fileID: 1005765831} + - component: {fileID: 1005765830} + - component: {fileID: 1005765829} + m_Layer: 0 + m_Name: werq (149) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1005765828 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1005765827} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.178, y: 0, z: -2.2180023} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 149 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1005765829 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1005765827} + 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 &1005765830 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1005765827} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1005765831 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1005765827} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1027215037 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1027215038} + - component: {fileID: 1027215041} + - component: {fileID: 1027215040} + - component: {fileID: 1027215039} + m_Layer: 0 + m_Name: werq (239) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1027215038 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1027215037} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.588, y: 0, z: -3.6880007} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 239 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1027215039 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1027215037} + 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 &1027215040 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1027215037} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1027215041 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1027215037} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1029714100 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1029714101} + - component: {fileID: 1029714104} + - component: {fileID: 1029714103} + - component: {fileID: 1029714102} + m_Layer: 0 + m_Name: werq (138) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1029714101 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1029714100} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.461, y: 0, z: -2.4730015} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 138 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1029714102 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1029714100} + 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 &1029714103 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1029714100} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1029714104 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1029714100} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1047784308 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1047784309} + - component: {fileID: 1047784312} + - component: {fileID: 1047784311} + - component: {fileID: 1047784310} + m_Layer: 0 + m_Name: werq (40) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1047784309 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1047784308} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -1.4699993} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 40 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1047784310 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1047784308} + 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 &1047784311 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1047784308} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1047784312 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1047784308} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1048788818 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1048788819} + - component: {fileID: 1048788822} + - component: {fileID: 1048788821} + - component: {fileID: 1048788820} + m_Layer: 0 + m_Name: werq (34) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1048788819 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1048788818} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.461, y: 0, z: -0.9769993} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 34 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1048788820 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1048788818} + 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 &1048788821 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1048788818} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1048788822 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1048788818} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1049975819 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1049975820} + - component: {fileID: 1049975823} + - component: {fileID: 1049975822} + - component: {fileID: 1049975821} + m_Layer: 0 + m_Name: werq (113) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1049975820 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1049975819} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3.072, y: 0, z: -0.9769993} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 113 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1049975821 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1049975819} + 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 &1049975822 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1049975819} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1049975823 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1049975819} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1056515547 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1056515548} + - component: {fileID: 1056515551} + - component: {fileID: 1056515550} + - component: {fileID: 1056515549} + m_Layer: 0 + m_Name: werq (199) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1056515548 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1056515547} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.588, y: 0, z: -2.2180014} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 199 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1056515549 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1056515547} + 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 &1056515550 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1056515547} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1056515551 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1056515547} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1060401002 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1060401003} + - component: {fileID: 1060401006} + - component: {fileID: 1060401005} + - component: {fileID: 1060401004} + m_Layer: 0 + m_Name: werq (52) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1060401003 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1060401002} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.94499993, y: 0, z: -1.2150002} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 52 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1060401004 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1060401002} + 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 &1060401005 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1060401002} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1060401006 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1060401002} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1067422387 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1067422388} + - component: {fileID: 1067422391} + - component: {fileID: 1067422390} + - component: {fileID: 1067422389} + m_Layer: 0 + m_Name: werq (14) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1067422388 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1067422387} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.461, y: 0, z: -0.7310009} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 14 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1067422389 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1067422387} + 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 &1067422390 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1067422387} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1067422391 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1067422387} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1074598068 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1074598069} + - component: {fileID: 1074598072} + - component: {fileID: 1074598071} + - component: {fileID: 1074598070} + m_Layer: 0 + m_Name: werq (6) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1074598069 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1074598068} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.461, y: 0, z: -0.23800087} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1074598070 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1074598068} + 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 &1074598071 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1074598068} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1074598072 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1074598068} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1089358755 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1089358756} + - component: {fileID: 1089358759} + - component: {fileID: 1089358758} + - component: {fileID: 1089358757} + m_Layer: 0 + m_Name: werq (195) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1089358756 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1089358755} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.588, y: 0, z: -1.9800014} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 195 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1089358757 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1089358755} + 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 &1089358758 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1089358755} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1089358759 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1089358755} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1091646622 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1091646623} + - component: {fileID: 1091646626} + - component: {fileID: 1091646625} + - component: {fileID: 1091646624} + m_Layer: 0 + m_Name: werq (252) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1091646623 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1091646622} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.839, y: 0, z: -3.6880016} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 252 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1091646624 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1091646622} + 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 &1091646625 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1091646622} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1091646626 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1091646622} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1093954315 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1093954316} + - component: {fileID: 1093954319} + - component: {fileID: 1093954318} + - component: {fileID: 1093954317} + m_Layer: 0 + m_Name: werq (211) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1093954316 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1093954315} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3.533, y: 0, z: -1.9800014} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 211 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1093954317 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1093954315} + 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 &1093954318 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1093954315} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1093954319 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1093954315} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1093974177 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1093974178} + - component: {fileID: 1093974181} + - component: {fileID: 1093974180} + - component: {fileID: 1093974179} + m_Layer: 0 + m_Name: werq (70) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1093974178 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1093974177} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.355, y: 0, z: -0.23800087} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 70 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1093974179 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1093974177} + 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 &1093974180 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1093974177} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1093974181 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1093974177} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1103049816 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1103049817} + - component: {fileID: 1103049820} + - component: {fileID: 1103049819} + - component: {fileID: 1103049818} + m_Layer: 0 + m_Name: werq (229) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1103049817 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1103049816} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.127, y: 0, z: -3.1950016} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 229 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1103049818 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1103049816} + 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 &1103049819 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1103049816} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1103049820 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1103049816} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1104813047 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1104813048} + - component: {fileID: 1104813051} + - component: {fileID: 1104813050} + - component: {fileID: 1104813049} + m_Layer: 0 + m_Name: werq (161) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1104813048 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1104813047} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.233, y: 0, z: -2.9570007} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 161 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1104813049 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1104813047} + 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 &1104813050 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1104813047} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1104813051 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1104813047} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1112769137 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1112769138} + - component: {fileID: 1112769141} + - component: {fileID: 1112769140} + - component: {fileID: 1112769139} + m_Layer: 0 + m_Name: werq (20) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1112769138 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1112769137} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.94499993, y: 0, z: -0.23800087} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 20 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1112769139 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1112769137} + 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 &1112769140 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1112769137} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1112769141 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1112769137} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1114307392 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1114307393} + - component: {fileID: 1114307396} + - component: {fileID: 1114307395} + - component: {fileID: 1114307394} + m_Layer: 0 + m_Name: werq (120) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1114307393 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1114307392} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.839, y: 0, z: -1.4699993} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 120 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1114307394 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1114307392} + 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 &1114307395 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1114307392} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1114307396 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1114307392} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1131956203 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1131956204} + - component: {fileID: 1131956207} + - component: {fileID: 1131956206} + - component: {fileID: 1131956205} + m_Layer: 0 + m_Name: werq (43) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1131956204 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1131956203} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.69399995, y: 0, z: -1.4699993} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 43 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1131956205 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1131956203} + 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 &1131956206 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1131956203} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1131956207 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1131956203} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1133583830 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1133583831} + - component: {fileID: 1133583834} + - component: {fileID: 1133583833} + - component: {fileID: 1133583832} + m_Layer: 0 + m_Name: werq (38) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1133583831 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1133583830} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.461, y: 0, z: -1.2150002} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 38 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1133583832 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1133583830} + 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 &1133583833 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1133583830} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1133583834 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1133583830} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1137692336 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1137692337} + - component: {fileID: 1137692340} + - component: {fileID: 1137692339} + - component: {fileID: 1137692338} + m_Layer: 0 + m_Name: werq (2) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1137692337 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1137692336} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.461, y: 0, z: 0} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1137692338 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1137692336} + 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 &1137692339 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1137692336} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1137692340 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1137692336} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1147996525 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1147996526} + - component: {fileID: 1147996529} + - component: {fileID: 1147996528} + - component: {fileID: 1147996527} + m_Layer: 0 + m_Name: werq (118) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1147996526 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1147996525} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3.3, y: 0, z: -1.2150002} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 118 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1147996527 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1147996525} + 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 &1147996528 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1147996525} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1147996529 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1147996525} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1156253990 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1156253991} + - component: {fileID: 1156253994} + - component: {fileID: 1156253993} + - component: {fileID: 1156253992} + m_Layer: 0 + m_Name: werq (15) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1156253991 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1156253990} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.69399995, y: 0, z: -0.73100007} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 15 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1156253992 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1156253990} + 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 &1156253993 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1156253990} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1156253994 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1156253990} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1156559622 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1156559623} + - component: {fileID: 1156559626} + - component: {fileID: 1156559625} + - component: {fileID: 1156559624} + m_Layer: 0 + m_Name: werq (96) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1156559623 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1156559622} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.894, y: 0, z: -0.9769993} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 96 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1156559624 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1156559622} + 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 &1156559625 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1156559622} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1156559626 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1156559622} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1159180715 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1159180716} + - component: {fileID: 1159180719} + - component: {fileID: 1159180718} + - component: {fileID: 1159180717} + m_Layer: 0 + m_Name: werq (33) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1159180716 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1159180715} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.233, y: 0, z: -0.9769993} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 33 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1159180717 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1159180715} + 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 &1159180718 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1159180715} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1159180719 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1159180715} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1162454165 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1162454166} + - component: {fileID: 1162454169} + - component: {fileID: 1162454168} + - component: {fileID: 1162454167} + m_Layer: 0 + m_Name: werq (117) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1162454166 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1162454165} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3.072, y: 0, z: -1.2150002} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 117 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1162454167 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1162454165} + 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 &1162454168 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1162454165} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1162454169 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1162454165} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1165208747 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1165208748} + - component: {fileID: 1165208751} + - component: {fileID: 1165208750} + - component: {fileID: 1165208749} + m_Layer: 0 + m_Name: werq (220) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1165208748 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1165208747} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.839, y: 0, z: -2.7110023} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 220 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1165208749 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1165208747} + 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 &1165208750 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1165208747} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1165208751 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1165208747} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1168640877 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1168640878} + - component: {fileID: 1168640881} + - component: {fileID: 1168640880} + - component: {fileID: 1168640879} + m_Layer: 0 + m_Name: werq (249) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1168640878 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1168640877} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3.072, y: 0, z: -3.4500008} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 249 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1168640879 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1168640877} + 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 &1168640880 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1168640877} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1168640881 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1168640877} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1180163488 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1180163489} + - component: {fileID: 1180163492} + - component: {fileID: 1180163491} + - component: {fileID: 1180163490} + m_Layer: 0 + m_Name: werq (11) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1180163489 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1180163488} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.69399995, y: 0, z: -0.49300003} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 11 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1180163490 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1180163488} + 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 &1180163491 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1180163488} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1180163492 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1180163488} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1180366240 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1180366241} + - component: {fileID: 1180366244} + - component: {fileID: 1180366243} + - component: {fileID: 1180366242} + m_Layer: 0 + m_Name: werq (74) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1180366241 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1180366240} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.355, y: 0, z: -0.49300003} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 74 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1180366242 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1180366240} + 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 &1180366243 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1180366240} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1180366244 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1180366240} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1180486512 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1180486513} + - component: {fileID: 1180486516} + - component: {fileID: 1180486515} + - component: {fileID: 1180486514} + m_Layer: 0 + m_Name: werq (217) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1180486513 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1180486512} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3.072, y: 0, z: -2.4730015} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 217 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1180486514 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1180486512} + 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 &1180486515 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1180486512} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1180486516 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1180486512} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1190201086 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1190201087} + - component: {fileID: 1190201090} + - component: {fileID: 1190201089} + - component: {fileID: 1190201088} + m_Layer: 0 + m_Name: werq (101) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1190201087 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1190201086} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.127, y: 0, z: -1.2150002} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 101 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1190201088 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1190201086} + 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 &1190201089 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1190201086} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1190201090 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1190201086} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1191496717 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1191496718} + - component: {fileID: 1191496721} + - component: {fileID: 1191496720} + - component: {fileID: 1191496719} + m_Layer: 0 + m_Name: werq (182) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1191496718 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1191496717} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.4059999, y: 0, z: -3.1950016} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 182 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1191496719 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1191496717} + 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 &1191496720 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1191496717} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1191496721 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1191496717} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1191630248 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1191630249} + - component: {fileID: 1191630252} + - component: {fileID: 1191630251} + - component: {fileID: 1191630250} + m_Layer: 0 + m_Name: werq (209) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1191630249 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1191630248} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3.072, y: 0, z: -1.9800014} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 209 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1191630250 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1191630248} + 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 &1191630251 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1191630248} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1191630252 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1191630248} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1209088796 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1209088797} + - component: {fileID: 1209088800} + - component: {fileID: 1209088799} + - component: {fileID: 1209088798} + m_Layer: 0 + m_Name: werq (121) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1209088797 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1209088796} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3.072, y: 0, z: -1.4699993} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 121 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1209088798 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1209088796} + 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 &1209088799 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1209088796} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1209088800 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1209088796} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1215758529 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1215758530} + - component: {fileID: 1215758533} + - component: {fileID: 1215758532} + - component: {fileID: 1215758531} + m_Layer: 0 + m_Name: werq (18) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1215758530 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1215758529} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.4059999, y: 0, z: 0} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 18 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1215758531 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1215758529} + 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 &1215758532 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1215758529} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1215758533 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1215758529} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1218492680 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1218492681} + - component: {fileID: 1218492684} + - component: {fileID: 1218492683} + - component: {fileID: 1218492682} + m_Layer: 0 + m_Name: werq (202) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1218492681 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1218492680} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.355, y: 0, z: -2.4730015} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 202 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1218492682 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1218492680} + 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 &1218492683 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1218492680} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1218492684 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1218492680} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1224370286 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1224370287} + - component: {fileID: 1224370290} + - component: {fileID: 1224370289} + - component: {fileID: 1224370288} + m_Layer: 0 + m_Name: werq (36) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1224370287 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1224370286} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -1.2150002} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 36 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1224370288 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1224370286} + 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 &1224370289 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1224370286} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1224370290 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1224370286} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1248100664 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1248100665} + - component: {fileID: 1248100668} + - component: {fileID: 1248100667} + - component: {fileID: 1248100666} + m_Layer: 0 + m_Name: werq (219) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1248100665 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1248100664} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3.533, y: 0, z: -2.4730015} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 219 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1248100666 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1248100664} + 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 &1248100667 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1248100664} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1248100668 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1248100664} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1254141402 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1254141403} + - component: {fileID: 1254141406} + - component: {fileID: 1254141405} + - component: {fileID: 1254141404} + m_Layer: 0 + m_Name: werq (246) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1254141403 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1254141402} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3.3, y: 0, z: -3.1950016} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 246 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1254141404 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1254141402} + 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 &1254141405 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1254141402} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1254141406 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1254141402} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1258424359 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1258424360} + - component: {fileID: 1258424363} + - component: {fileID: 1258424362} + - component: {fileID: 1258424361} + m_Layer: 0 + m_Name: werq (176) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1258424360 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1258424359} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.94499993, y: 0, z: -2.9570007} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 176 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1258424361 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1258424359} + 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 &1258424362 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1258424359} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1258424363 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1258424359} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1262347582 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1262347583} + - component: {fileID: 1262347586} + - component: {fileID: 1262347585} + - component: {fileID: 1262347584} + m_Layer: 0 + m_Name: werq (88) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1262347583 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1262347582} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.839, y: 0, z: -0.49300003} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 88 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1262347584 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1262347582} + 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 &1262347585 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1262347582} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1262347586 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1262347582} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1268059511 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1268059512} + - component: {fileID: 1268059515} + - component: {fileID: 1268059514} + - component: {fileID: 1268059513} + m_Layer: 0 + m_Name: werq (32) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1268059512 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1268059511} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -0.9769993} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 32 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1268059513 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1268059511} + 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 &1268059514 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1268059511} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1268059515 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1268059511} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1269849010 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1269849011} + - component: {fileID: 1269849014} + - component: {fileID: 1269849013} + - component: {fileID: 1269849012} + m_Layer: 0 + m_Name: werq (206) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1269849011 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1269849010} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.355, y: 0, z: -2.7110023} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 206 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1269849012 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1269849010} + 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 &1269849013 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1269849010} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1269849014 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1269849010} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1271441865 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1271441866} + - component: {fileID: 1271441869} + - component: {fileID: 1271441868} + - component: {fileID: 1271441867} + m_Layer: 0 + m_Name: werq (89) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1271441866 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1271441865} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3.072, y: 0, z: -0.49300003} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 89 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1271441867 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1271441865} + 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 &1271441868 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1271441865} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1271441869 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1271441865} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1272924905 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1272924906} + - component: {fileID: 1272924909} + - component: {fileID: 1272924908} + - component: {fileID: 1272924907} + m_Layer: 0 + m_Name: werq (208) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1272924906 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1272924905} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.839, y: 0, z: -1.9800014} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 208 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1272924907 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1272924905} + 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 &1272924908 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1272924905} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1272924909 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1272924905} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1278291352 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1278291353} + - component: {fileID: 1278291356} + - component: {fileID: 1278291355} + - component: {fileID: 1278291354} + m_Layer: 0 + m_Name: werq (92) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1278291353 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1278291352} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.839, y: 0, z: -0.7310009} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 92 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1278291354 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1278291352} + 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 &1278291355 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1278291352} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1278291356 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1278291352} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1300058640 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1300058641} + - component: {fileID: 1300058644} + - component: {fileID: 1300058643} + - component: {fileID: 1300058642} + m_Layer: 0 + m_Name: werq (10) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1300058641 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1300058640} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.461, y: 0, z: -0.49300003} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 10 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1300058642 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1300058640} + 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 &1300058643 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1300058640} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1300058644 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1300058640} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1323055547 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1323055548} + - component: {fileID: 1323055551} + - component: {fileID: 1323055550} + - component: {fileID: 1323055549} + m_Layer: 0 + m_Name: werq (177) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1323055548 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1323055547} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.178, y: 0, z: -2.9570007} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 177 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1323055549 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1323055547} + 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 &1323055550 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1323055547} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1323055551 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1323055547} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1325528650 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1325528651} + - component: {fileID: 1325528654} + - component: {fileID: 1325528653} + - component: {fileID: 1325528652} + m_Layer: 0 + m_Name: werq (107) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1325528651 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1325528650} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.588, y: 0, z: -1.4699993} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 107 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1325528652 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1325528650} + 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 &1325528653 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1325528650} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1325528654 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1325528650} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1333567162 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1333567166} + - component: {fileID: 1333567165} + - component: {fileID: 1333567164} + - component: {fileID: 1333567163} + - component: {fileID: 1333567167} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1333567163 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1333567162} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &1333567164 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1333567162} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 1 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 1280, y: 720} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0.5 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 +--- !u!223 &1333567165 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1333567162} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &1333567166 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1333567162} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_Children: + - {fileID: 627808639} + - {fileID: 1536251758} + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!114 &1333567167 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1333567162} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4390d966eb8724ba2907f775b34e94ea, type: 3} + m_Name: + m_EditorClassIdentifier: + NetworkManager: {fileID: 620561611} + ButtonsRoot: {fileID: 0} +--- !u!1 &1333670311 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1333670312} + - component: {fileID: 1333670315} + - component: {fileID: 1333670314} + - component: {fileID: 1333670313} + m_Layer: 0 + m_Name: werq (240) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1333670312 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1333670311} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.839, y: 0, z: -2.9570007} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 240 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1333670313 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1333670311} + 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 &1333670314 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1333670311} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1333670315 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1333670311} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1341498264 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1341498265} + - component: {fileID: 1341498268} + - component: {fileID: 1341498267} + - component: {fileID: 1341498266} + m_Layer: 0 + m_Name: werq (86) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1341498265 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1341498264} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3.3, y: 0, z: -0.23800087} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 86 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1341498266 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1341498264} + 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 &1341498267 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1341498264} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1341498268 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1341498264} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1347200038 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1347200039} + - component: {fileID: 1347200042} + - component: {fileID: 1347200041} + - component: {fileID: 1347200040} + m_Layer: 0 + m_Name: werq (243) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1347200039 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1347200038} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3.533, y: 0, z: -2.9570007} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 243 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1347200040 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1347200038} + 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 &1347200041 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1347200038} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1347200042 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1347200038} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1350981873 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1350981874} + - component: {fileID: 1350981877} + - component: {fileID: 1350981876} + - component: {fileID: 1350981875} + m_Layer: 0 + m_Name: werq (247) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1350981874 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1350981873} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3.533, y: 0, z: -3.1950016} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 247 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1350981875 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1350981873} + 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 &1350981876 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1350981873} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1350981877 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1350981873} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1357212646 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1357212647} + - component: {fileID: 1357212650} + - component: {fileID: 1357212649} + - component: {fileID: 1357212648} + m_Layer: 0 + m_Name: werq (19) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1357212647 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1357212646} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.6389999, y: 0, z: 0} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 19 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1357212648 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1357212646} + 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 &1357212649 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1357212646} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1357212650 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1357212646} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1368127827 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1368127828} + - component: {fileID: 1368127831} + - component: {fileID: 1368127830} + - component: {fileID: 1368127829} + m_Layer: 0 + m_Name: werq (188) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1368127828 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1368127827} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.94499993, y: 0, z: -3.6880016} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 188 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1368127829 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1368127827} + 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 &1368127830 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1368127827} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1368127831 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1368127827} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1377941353 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1377941354} + - component: {fileID: 1377941357} + - component: {fileID: 1377941356} + - component: {fileID: 1377941355} + m_Layer: 0 + m_Name: werq (48) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1377941354 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1377941353} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.94499993, y: 0, z: -0.9769993} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 48 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1377941355 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1377941353} + 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 &1377941356 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1377941353} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1377941357 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1377941353} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1385336451 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1385336452} + - component: {fileID: 1385336455} + - component: {fileID: 1385336454} + - component: {fileID: 1385336453} + m_Layer: 0 + m_Name: werq (45) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1385336452 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1385336451} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.233, y: 0, z: -1.7079992} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 45 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1385336453 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1385336451} + 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 &1385336454 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1385336451} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1385336455 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1385336451} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1399839514 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1399839515} + - component: {fileID: 1399839518} + - component: {fileID: 1399839517} + - component: {fileID: 1399839516} + m_Layer: 0 + m_Name: werq (255) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1399839515 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1399839514} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3.533, y: 0, z: -3.6880007} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 255 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1399839516 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1399839514} + 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 &1399839517 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1399839514} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1399839518 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1399839514} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1402687343 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1402687344} + - component: {fileID: 1402687347} + - component: {fileID: 1402687346} + - component: {fileID: 1402687345} + m_Layer: 0 + m_Name: werq (187) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1402687344 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1402687343} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.6389999, y: 0, z: -3.4500008} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 187 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1402687345 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1402687343} + 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 &1402687346 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1402687343} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1402687347 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1402687343} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1405769695 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1405769696} + - component: {fileID: 1405769699} + - component: {fileID: 1405769698} + - component: {fileID: 1405769697} + m_Layer: 0 + m_Name: werq (35) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1405769696 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1405769695} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.69399995, y: 0, z: -0.9769993} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 35 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1405769697 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1405769695} + 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 &1405769698 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1405769695} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1405769699 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1405769695} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1406760489 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1406760490} + - component: {fileID: 1406760493} + - component: {fileID: 1406760492} + - component: {fileID: 1406760491} + m_Layer: 0 + m_Name: werq (76) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1406760490 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1406760489} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.894, y: 0, z: -0.7310009} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 76 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1406760491 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1406760489} + 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 &1406760492 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1406760489} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1406760493 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1406760489} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1409119960 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1409119961} + - component: {fileID: 1409119964} + - component: {fileID: 1409119963} + - component: {fileID: 1409119962} + m_Layer: 0 + m_Name: werq (99) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1409119961 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1409119960} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.588, y: 0, z: -0.9769993} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 99 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1409119962 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1409119960} + 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 &1409119963 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1409119960} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1409119964 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1409119960} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1409818198 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1409818199} + - component: {fileID: 1409818202} + - component: {fileID: 1409818201} + - component: {fileID: 1409818200} + m_Layer: 0 + m_Name: werq (64) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1409818199 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1409818198} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.894, y: 0, z: 0} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 64 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1409818200 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1409818198} + 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 &1409818201 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1409818198} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1409818202 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1409818198} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1421330463 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1421330464} + - component: {fileID: 1421330467} + - component: {fileID: 1421330466} + - component: {fileID: 1421330465} + m_Layer: 0 + m_Name: werq (56) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1421330464 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1421330463} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.94499993, y: 0, z: -1.4699993} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 56 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1421330465 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1421330463} + 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 &1421330466 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1421330463} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1421330467 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1421330463} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1425645965 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1425645966} + - component: {fileID: 1425645969} + - component: {fileID: 1425645968} + - component: {fileID: 1425645967} + m_Layer: 0 + m_Name: werq (103) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1425645966 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1425645965} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.588, y: 0, z: -1.2149993} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 103 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1425645967 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1425645965} + 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 &1425645968 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1425645965} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1425645969 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1425645965} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1426769439 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1426769440} + - component: {fileID: 1426769443} + - component: {fileID: 1426769442} + - component: {fileID: 1426769441} + m_Layer: 0 + m_Name: werq (230) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1426769440 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1426769439} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.355, y: 0, z: -3.1950016} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 230 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1426769441 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1426769439} + 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 &1426769442 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1426769439} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1426769443 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1426769439} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1426981711 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1426981712} + - component: {fileID: 1426981715} + - component: {fileID: 1426981714} + - component: {fileID: 1426981713} + m_Layer: 0 + m_Name: werq (49) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1426981712 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1426981711} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.178, y: 0, z: -0.9769993} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 49 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1426981713 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1426981711} + 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 &1426981714 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1426981711} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1426981715 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1426981711} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1429461273 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1429461274} + - component: {fileID: 1429461277} + - component: {fileID: 1429461276} + - component: {fileID: 1429461275} + m_Layer: 0 + m_Name: werq (60) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1429461274 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1429461273} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.94499993, y: 0, z: -1.7080002} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 60 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1429461275 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1429461273} + 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 &1429461276 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1429461273} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1429461277 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1429461273} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1433282150 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1433282151} + - component: {fileID: 1433282154} + - component: {fileID: 1433282153} + - component: {fileID: 1433282152} + m_Layer: 0 + m_Name: werq (221) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1433282151 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1433282150} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3.072, y: 0, z: -2.7110014} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 221 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1433282152 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1433282150} + 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 &1433282153 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1433282150} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1433282154 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1433282150} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1439769664 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1439769665} + - component: {fileID: 1439769668} + - component: {fileID: 1439769667} + - component: {fileID: 1439769666} + m_Layer: 0 + m_Name: werq (181) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1439769665 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1439769664} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.178, y: 0, z: -3.1950016} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 181 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1439769666 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1439769664} + 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 &1439769667 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1439769664} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1439769668 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1439769664} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1451779897 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1451779898} + - component: {fileID: 1451779901} + - component: {fileID: 1451779900} + - component: {fileID: 1451779899} + m_Layer: 0 + m_Name: werq (200) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1451779898 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1451779897} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.894, y: 0, z: -2.4730015} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 200 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1451779899 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1451779897} + 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 &1451779900 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1451779897} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1451779901 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1451779897} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1461177416 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1461177417} + - component: {fileID: 1461177420} + - component: {fileID: 1461177419} + - component: {fileID: 1461177418} + m_Layer: 0 + m_Name: werq (28) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1461177417 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1461177416} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.94499993, y: 0, z: -0.7310009} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 28 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1461177418 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1461177416} + 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 &1461177419 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1461177416} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1461177420 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1461177416} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1493942654 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1493942655} + - component: {fileID: 1493942658} + - component: {fileID: 1493942657} + - component: {fileID: 1493942656} + m_Layer: 0 + m_Name: werq (160) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1493942655 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1493942654} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -2.9570007} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 160 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1493942656 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1493942654} + 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 &1493942657 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1493942654} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1493942658 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1493942654} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1518464148 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1518464149} + - component: {fileID: 1518464152} + - component: {fileID: 1518464151} + - component: {fileID: 1518464150} + m_Layer: 0 + m_Name: werq (69) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1518464149 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1518464148} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.127, y: 0, z: -0.23800087} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 69 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1518464150 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1518464148} + 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 &1518464151 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1518464148} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1518464152 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1518464148} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1532247924 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1532247925} + - component: {fileID: 1532247928} + - component: {fileID: 1532247927} + - component: {fileID: 1532247926} + m_Layer: 0 + m_Name: werq (151) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1532247925 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1532247924} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.6389999, y: 0, z: -2.2180014} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 151 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1532247926 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1532247924} + 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 &1532247927 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1532247924} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1532247928 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1532247924} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!224 &1536251758 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, + type: 3} + m_PrefabInstance: {fileID: 1928839749} + m_PrefabAsset: {fileID: 0} +--- !u!1 &1537050448 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1537050449} + - component: {fileID: 1537050452} + - component: {fileID: 1537050451} + - component: {fileID: 1537050450} + m_Layer: 0 + m_Name: werq (207) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1537050449 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1537050448} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.588, y: 0, z: -2.7110014} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 207 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1537050450 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1537050448} + 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 &1537050451 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1537050448} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1537050452 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1537050448} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1556458764 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1556458765} + - component: {fileID: 1556458768} + - component: {fileID: 1556458767} + - component: {fileID: 1556458766} + m_Layer: 0 + m_Name: werq (185) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1556458765 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1556458764} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.178, y: 0, z: -3.4500008} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 185 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1556458766 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1556458764} + 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 &1556458767 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1556458764} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1556458768 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1556458764} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1566163830 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1566163831} + - component: {fileID: 1566163834} + - component: {fileID: 1566163833} + - component: {fileID: 1566163832} + m_Layer: 0 + m_Name: werq (153) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1566163831 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1566163830} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.178, y: 0, z: -2.4730015} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 153 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1566163832 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1566163830} + 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 &1566163833 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1566163830} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1566163834 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1566163830} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1570850647 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1570850648} + - component: {fileID: 1570850651} + - component: {fileID: 1570850650} + - component: {fileID: 1570850649} + m_Layer: 0 + m_Name: werq (8) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1570850648 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1570850647} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -0.49300003} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 8 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1570850649 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1570850647} + 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 &1570850650 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1570850647} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1570850651 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1570850647} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1571650943 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1571650944} + - component: {fileID: 1571650947} + - component: {fileID: 1571650946} + - component: {fileID: 1571650945} + m_Layer: 0 + m_Name: werq (106) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1571650944 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1571650943} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.355, y: 0, z: -1.4699993} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 106 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1571650945 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1571650943} + 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 &1571650946 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1571650943} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1571650947 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1571650943} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1583118625 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1583118626} + - component: {fileID: 1583118629} + - component: {fileID: 1583118628} + - component: {fileID: 1583118627} + m_Layer: 0 + m_Name: werq (154) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1583118626 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1583118625} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.4059999, y: 0, z: -2.4730015} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 154 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1583118627 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1583118625} + 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 &1583118628 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1583118625} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1583118629 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1583118625} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1586201511 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1586201512} + - component: {fileID: 1586201515} + - component: {fileID: 1586201514} + - component: {fileID: 1586201513} + m_Layer: 0 + m_Name: werq (29) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1586201512 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1586201511} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.178, y: 0, z: -0.731} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 29 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1586201513 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1586201511} + 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 &1586201514 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1586201511} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1586201515 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1586201511} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1602406364 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1602406365} + - component: {fileID: 1602406368} + - component: {fileID: 1602406367} + - component: {fileID: 1602406366} + m_Layer: 0 + m_Name: werq (47) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1602406365 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1602406364} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.69399995, y: 0, z: -1.7079993} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 47 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1602406366 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1602406364} + 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 &1602406367 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1602406364} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1602406368 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1602406364} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1604954355 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1604954356} + - component: {fileID: 1604954359} + - component: {fileID: 1604954358} + - component: {fileID: 1604954357} + m_Layer: 0 + m_Name: werq (198) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1604954356 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1604954355} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.355, y: 0, z: -2.2180023} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 198 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1604954357 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1604954355} + 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 &1604954358 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1604954355} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1604954359 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1604954355} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1615309367 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1615309368} + - component: {fileID: 1615309371} + - component: {fileID: 1615309370} + - component: {fileID: 1615309369} + m_Layer: 0 + m_Name: werq (180) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1615309368 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1615309367} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.94499993, y: 0, z: -3.1950016} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 180 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1615309369 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1615309367} + 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 &1615309370 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1615309367} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1615309371 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1615309367} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1618109823 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1618109824} + - component: {fileID: 1618109827} + - component: {fileID: 1618109826} + - component: {fileID: 1618109825} + m_Layer: 0 + m_Name: werq (193) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1618109824 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1618109823} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.127, y: 0, z: -1.9800014} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 193 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1618109825 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1618109823} + 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 &1618109826 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1618109823} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1618109827 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1618109823} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1618818992 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1618818993} + - component: {fileID: 1618818996} + - component: {fileID: 1618818995} + - component: {fileID: 1618818994} + m_Layer: 0 + m_Name: werq (152) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1618818993 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1618818992} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.94499993, y: 0, z: -2.4730015} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 152 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1618818994 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1618818992} + 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 &1618818995 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1618818992} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1618818996 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1618818992} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1619314278 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1619314279} + - component: {fileID: 1619314282} + - component: {fileID: 1619314281} + - component: {fileID: 1619314280} + m_Layer: 0 + m_Name: werq (71) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1619314279 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1619314278} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.588, y: 0, z: -0.238} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 71 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1619314280 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1619314278} + 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 &1619314281 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1619314278} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1619314282 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1619314278} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1633292495 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1633292496} + - component: {fileID: 1633292499} + - component: {fileID: 1633292498} + - component: {fileID: 1633292497} + m_Layer: 0 + m_Name: werq (201) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1633292496 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1633292495} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.127, y: 0, z: -2.4730015} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 201 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1633292497 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1633292495} + 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 &1633292498 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1633292495} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1633292499 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1633292495} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1643885206 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1643885211} + - component: {fileID: 1643885210} + - component: {fileID: 1643885209} + - component: {fileID: 1643885208} + - component: {fileID: 1643885207} + - component: {fileID: 1643885212} + - component: {fileID: 1643885213} + m_Layer: 0 + m_Name: NetworkTransformLegacy + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!114 &1643885207 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1643885206} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: df4fbe773fc544428171994e08b0483f, type: 3} + m_Name: + m_EditorClassIdentifier: + FixedSendsPerSecond: 20 + AssumeSyncedSends: 1 + InterpolatePosition: 1 + SnapDistance: 10 + InterpolateServer: 1 + MinMeters: 0.15 + MinDegrees: 1.5 + ExtrapolatePosition: 0 + MaxSendsToExtrapolate: 5 + Channel: + EnableRange: 0 + EnableNonProvokedResendChecks: 0 + DistanceSendrate: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 20 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 500 + value: 20 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 +--- !u!65 &1643885208 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1643885206} + 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 &1643885209 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1643885206} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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 &1643885210 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1643885206} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &1643885211 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1643885206} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -10.29, y: 1.55, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1643885212 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1643885206} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} + m_Name: + m_EditorClassIdentifier: + GlobalObjectIdHash: 3638589847 + AlwaysReplicateAsRoot: 0 + DontDestroyWithOwner: 0 + AutoObjectParentSync: 1 +--- !u!114 &1643885213 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1643885206} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 307c40a41954948e7a36bb6b64b4b9cb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_MoveSpeed: 5 + m_RotationSpeed: 30 +--- !u!1 &1659076779 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1659076780} + - component: {fileID: 1659076783} + - component: {fileID: 1659076782} + - component: {fileID: 1659076781} + m_Layer: 0 + m_Name: werq (91) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1659076780 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1659076779} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3.533, y: 0, z: -0.49300003} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 91 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1659076781 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1659076779} + 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 &1659076782 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1659076779} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1659076783 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1659076779} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1663972043 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1663972044} + - component: {fileID: 1663972047} + - component: {fileID: 1663972046} + - component: {fileID: 1663972045} + m_Layer: 0 + m_Name: werq (115) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1663972044 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1663972043} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3.533, y: 0, z: -0.9769993} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 115 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1663972045 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1663972043} + 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 &1663972046 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1663972043} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1663972047 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1663972043} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1669016179 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1669016180} + - component: {fileID: 1669016183} + - component: {fileID: 1669016182} + - component: {fileID: 1669016181} + m_Layer: 0 + m_Name: werq (95) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1669016180 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1669016179} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3.533, y: 0, z: -0.73100007} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 95 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1669016181 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1669016179} + 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 &1669016182 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1669016179} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1669016183 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1669016179} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1680116252 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1680116253} + - component: {fileID: 1680116256} + - component: {fileID: 1680116255} + - component: {fileID: 1680116254} + m_Layer: 0 + m_Name: werq (145) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1680116253 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1680116252} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.178, y: 0, z: -1.9800014} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 145 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1680116254 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1680116252} + 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 &1680116255 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1680116252} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1680116256 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1680116252} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1687987866 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1687987867} + - component: {fileID: 1687987870} + - component: {fileID: 1687987869} + - component: {fileID: 1687987868} + m_Layer: 0 + m_Name: werq (102) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1687987867 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1687987866} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.355, y: 0, z: -1.2150002} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 102 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1687987868 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1687987866} + 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 &1687987869 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1687987866} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1687987870 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1687987866} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1691410012 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1691410013} + - component: {fileID: 1691410016} + - component: {fileID: 1691410015} + - component: {fileID: 1691410014} + m_Layer: 0 + m_Name: werq (31) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1691410013 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1691410012} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.6389999, y: 0, z: -0.73100007} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 31 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1691410014 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1691410012} + 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 &1691410015 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1691410012} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1691410016 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1691410012} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1694079735 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1694079736} + - component: {fileID: 1694079739} + - component: {fileID: 1694079738} + - component: {fileID: 1694079737} + m_Layer: 0 + m_Name: werq (22) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1694079736 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1694079735} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.4059999, y: 0, z: -0.23800087} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 22 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1694079737 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1694079735} + 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 &1694079738 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1694079735} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1694079739 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1694079735} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1697254605 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1697254606} + - component: {fileID: 1697254609} + - component: {fileID: 1697254608} + - component: {fileID: 1697254607} + m_Layer: 0 + m_Name: werq (225) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1697254606 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1697254605} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.127, y: 0, z: -2.9570007} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 225 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1697254607 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1697254605} + 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 &1697254608 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1697254605} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1697254609 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1697254605} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1703907384 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1703907385} + - component: {fileID: 1703907388} + - component: {fileID: 1703907387} + - component: {fileID: 1703907386} + m_Layer: 0 + m_Name: werq (50) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1703907385 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1703907384} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.4059999, y: 0, z: -0.9769993} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 50 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1703907386 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1703907384} + 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 &1703907387 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1703907384} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1703907388 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1703907384} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1711317422 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1711317423} + - component: {fileID: 1711317426} + - component: {fileID: 1711317425} + - component: {fileID: 1711317424} + m_Layer: 0 + m_Name: werq (167) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1711317423 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1711317422} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.69399995, y: 0, z: -3.1950006} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 167 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1711317424 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1711317422} + 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 &1711317425 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1711317422} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1711317426 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1711317422} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1722987695 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1722987696} + - component: {fileID: 1722987699} + - component: {fileID: 1722987698} + - component: {fileID: 1722987697} + m_Layer: 0 + m_Name: werq (248) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1722987696 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1722987695} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.839, y: 0, z: -3.4500008} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 248 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1722987697 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1722987695} + 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 &1722987698 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1722987695} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1722987699 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1722987695} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1728034270 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1728034271} + - component: {fileID: 1728034274} + - component: {fileID: 1728034273} + - component: {fileID: 1728034272} + m_Layer: 0 + m_Name: werq (142) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1728034271 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1728034270} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.461, y: 0, z: -2.7110023} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 142 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1728034272 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1728034270} + 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 &1728034273 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1728034270} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1728034274 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1728034270} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1730875155 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1730875156} + - component: {fileID: 1730875159} + - component: {fileID: 1730875158} + - component: {fileID: 1730875157} + m_Layer: 0 + m_Name: werq (109) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1730875156 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1730875155} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.127, y: 0, z: -1.7079992} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 109 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1730875157 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1730875155} + 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 &1730875158 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1730875155} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1730875159 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1730875155} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1732288669 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1732288670} + - component: {fileID: 1732288673} + - component: {fileID: 1732288672} + - component: {fileID: 1732288671} + m_Layer: 0 + m_Name: werq (78) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1732288670 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1732288669} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.355, y: 0, z: -0.7310009} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 78 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1732288671 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1732288669} + 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 &1732288672 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1732288669} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1732288673 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1732288669} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1740002708 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1740002709} + - component: {fileID: 1740002712} + - component: {fileID: 1740002711} + - component: {fileID: 1740002710} + m_Layer: 0 + m_Name: werq (59) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1740002709 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1740002708} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.6389999, y: 0, z: -1.4699993} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 59 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1740002710 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1740002708} + 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 &1740002711 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1740002708} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1740002712 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1740002708} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1748430817 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1748430818} + - component: {fileID: 1748430821} + - component: {fileID: 1748430820} + - component: {fileID: 1748430819} + m_Layer: 0 + m_Name: werq (112) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1748430818 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1748430817} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.839, y: 0, z: -0.9769993} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 112 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1748430819 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1748430817} + 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 &1748430820 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1748430817} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1748430821 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1748430817} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1769252477 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1769252478} + - component: {fileID: 1769252481} + - component: {fileID: 1769252480} + - component: {fileID: 1769252479} + m_Layer: 0 + m_Name: werq (233) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1769252478 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1769252477} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.127, y: 0, z: -3.4500008} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 233 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1769252479 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1769252477} + 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 &1769252480 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1769252477} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1769252481 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1769252477} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1776278816 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1776278817} + - component: {fileID: 1776278820} + - component: {fileID: 1776278819} + - component: {fileID: 1776278818} + m_Layer: 0 + m_Name: werq (216) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1776278817 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1776278816} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.839, y: 0, z: -2.4730015} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 216 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1776278818 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1776278816} + 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 &1776278819 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1776278816} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1776278820 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1776278816} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1778934115 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1778934116} + - component: {fileID: 1778934119} + - component: {fileID: 1778934118} + - component: {fileID: 1778934117} + m_Layer: 0 + m_Name: werq (234) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1778934116 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1778934115} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.355, y: 0, z: -3.45} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 234 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1778934117 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1778934115} + 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 &1778934118 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1778934115} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1778934119 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1778934115} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1783447245 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1783447246} + - component: {fileID: 1783447249} + - component: {fileID: 1783447248} + - component: {fileID: 1783447247} + m_Layer: 0 + m_Name: werq (232) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1783447246 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1783447245} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.894, y: 0, z: -3.4500008} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 232 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1783447247 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1783447245} + 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 &1783447248 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1783447245} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1783447249 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1783447245} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1788125428 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1788125429} + - component: {fileID: 1788125432} + - component: {fileID: 1788125431} + - component: {fileID: 1788125430} + m_Layer: 0 + m_Name: werq (3) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1788125429 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1788125428} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.69399995, y: 0, z: 0} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1788125430 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1788125428} + 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 &1788125431 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1788125428} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1788125432 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1788125428} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1790575670 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1790575671} + - component: {fileID: 1790575674} + - component: {fileID: 1790575673} + - component: {fileID: 1790575672} + m_Layer: 0 + m_Name: werq (13) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1790575671 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1790575670} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.233, y: 0, z: -0.731} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 13 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1790575672 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1790575670} + 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 &1790575673 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1790575670} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1790575674 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1790575670} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1796328354 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1796328355} + - component: {fileID: 1796328358} + - component: {fileID: 1796328357} + - component: {fileID: 1796328356} + m_Layer: 0 + m_Name: werq (205) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1796328355 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1796328354} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.127, y: 0, z: -2.7110014} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 205 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1796328356 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1796328354} + 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 &1796328357 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1796328354} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1796328358 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1796328354} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1812680815 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1812680816} + - component: {fileID: 1812680819} + - component: {fileID: 1812680818} + - component: {fileID: 1812680817} + m_Layer: 0 + m_Name: werq (183) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1812680816 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1812680815} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.6389999, y: 0, z: -3.1950016} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 183 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1812680817 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1812680815} + 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 &1812680818 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1812680815} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1812680819 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1812680815} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1821753630 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1821753631} + - component: {fileID: 1821753634} + - component: {fileID: 1821753633} + - component: {fileID: 1821753632} + m_Layer: 0 + m_Name: werq (178) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1821753631 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1821753630} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.4059999, y: 0, z: -2.9570007} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 178 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1821753632 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1821753630} + 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 &1821753633 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1821753630} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1821753634 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1821753630} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1838111265 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1838111266} + - component: {fileID: 1838111269} + - component: {fileID: 1838111268} + - component: {fileID: 1838111267} + m_Layer: 0 + m_Name: werq (133) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1838111266 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1838111265} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.233, y: 0, z: -2.2180023} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 133 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1838111267 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1838111265} + 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 &1838111268 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1838111265} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1838111269 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1838111265} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1839669253 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1839669254} + - component: {fileID: 1839669257} + - component: {fileID: 1839669256} + - component: {fileID: 1839669255} + m_Layer: 0 + m_Name: werq (94) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1839669254 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1839669253} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3.3, y: 0, z: -0.7310009} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 94 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1839669255 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1839669253} + 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 &1839669256 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1839669253} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1839669257 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1839669253} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1852876035 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1852876036} + - component: {fileID: 1852876039} + - component: {fileID: 1852876038} + - component: {fileID: 1852876037} + m_Layer: 0 + m_Name: werq (165) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1852876036 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1852876035} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.233, y: 0, z: -3.1950016} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 165 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1852876037 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1852876035} + 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 &1852876038 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1852876035} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1852876039 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1852876035} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1858019617 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1858019618} + - component: {fileID: 1858019621} + - component: {fileID: 1858019620} + - component: {fileID: 1858019619} + m_Layer: 0 + m_Name: werq (73) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1858019618 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1858019617} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.127, y: 0, z: -0.49300003} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 73 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1858019619 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1858019617} + 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 &1858019620 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1858019617} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1858019621 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1858019617} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1859094914 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1859094915} + - component: {fileID: 1859094918} + - component: {fileID: 1859094917} + - component: {fileID: 1859094916} + m_Layer: 0 + m_Name: werq (172) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1859094915 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1859094914} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -3.6880016} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 172 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1859094916 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1859094914} + 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 &1859094917 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1859094914} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1859094918 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1859094914} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1860346519 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1860346520} + - component: {fileID: 1860346523} + - component: {fileID: 1860346522} + - component: {fileID: 1860346521} + m_Layer: 0 + m_Name: werq (137) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1860346520 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1860346519} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.233, y: 0, z: -2.4730015} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 137 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1860346521 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1860346519} + 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 &1860346522 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1860346519} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1860346523 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1860346519} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1870696865 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1870696866} + - component: {fileID: 1870696869} + - component: {fileID: 1870696868} + - component: {fileID: 1870696867} + m_Layer: 0 + m_Name: werq (67) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1870696866 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1870696865} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.588, y: 0, z: 0} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 67 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1870696867 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1870696865} + 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 &1870696868 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1870696865} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1870696869 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1870696865} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1895837567 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1895837568} + - component: {fileID: 1895837571} + - component: {fileID: 1895837570} + - component: {fileID: 1895837569} + m_Layer: 0 + m_Name: werq (65) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1895837568 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1895837567} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.127, y: 0, z: 0} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 65 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1895837569 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1895837567} + 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 &1895837570 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1895837567} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1895837571 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1895837567} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1918158911 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1918158912} + - component: {fileID: 1918158915} + - component: {fileID: 1918158914} + - component: {fileID: 1918158913} + m_Layer: 0 + m_Name: werq (226) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1918158912 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1918158911} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.355, y: 0, z: -2.9570007} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 226 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1918158913 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1918158911} + 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 &1918158914 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1918158911} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1918158915 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1918158911} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1001 &1928839749 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 1333567166} + m_Modifications: + - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, + type: 3} + propertyPath: m_Pivot.x + value: 0.5 objectReference: {fileID: 0} - - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, type: 3} propertyPath: m_Pivot.y value: 0.5 objectReference: {fileID: 0} - - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, type: 3} propertyPath: m_RootOrder - value: 0 + value: 1 objectReference: {fileID: 0} - - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, type: 3} propertyPath: m_AnchorMax.x value: 1 objectReference: {fileID: 0} - - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, type: 3} propertyPath: m_AnchorMax.y value: 1 objectReference: {fileID: 0} - - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, type: 3} propertyPath: m_AnchorMin.x - value: 1 + value: 0 objectReference: {fileID: 0} - - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, type: 3} propertyPath: m_SizeDelta.x - value: 20 + value: -952 objectReference: {fileID: 0} - - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, type: 3} propertyPath: m_SizeDelta.y - value: 25 + value: -344 objectReference: {fileID: 0} - - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, type: 3} propertyPath: m_LocalPosition.x value: 0 objectReference: {fileID: 0} - - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, type: 3} propertyPath: m_LocalPosition.y value: 0 objectReference: {fileID: 0} - - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, type: 3} propertyPath: m_LocalPosition.z value: 0 objectReference: {fileID: 0} - - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, type: 3} propertyPath: m_LocalRotation.w value: 1 objectReference: {fileID: 0} - - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, type: 3} propertyPath: m_LocalRotation.x - value: -0 + value: 0 objectReference: {fileID: 0} - - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, type: 3} propertyPath: m_LocalRotation.y - value: -0 + value: 0 objectReference: {fileID: 0} - - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, type: 3} propertyPath: m_LocalRotation.z - value: -0 + value: 0 objectReference: {fileID: 0} - - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, type: 3} propertyPath: m_AnchoredPosition.x - value: -23.40039 + value: 0 objectReference: {fileID: 0} - - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, type: 3} propertyPath: m_AnchoredPosition.y - value: -23.800293 + value: 0 objectReference: {fileID: 0} - - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, type: 3} propertyPath: m_LocalEulerAnglesHint.x value: 0 objectReference: {fileID: 0} - - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, type: 3} propertyPath: m_LocalEulerAnglesHint.y value: 0 objectReference: {fileID: 0} - - target: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, + - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, type: 3} propertyPath: m_LocalEulerAnglesHint.z value: 0 objectReference: {fileID: 0} - - target: {fileID: 2848221156307247795, guid: 3200770c16e3b2b4ebe7f604154faac7, + - target: {fileID: 6963777608485144162, guid: d725b5588e1b956458798319e6541d84, type: 3} propertyPath: m_Name - value: ExitButton + value: ConnectionModeButtons objectReference: {fileID: 0} - - target: {fileID: 5266522511616468950, guid: 3200770c16e3b2b4ebe7f604154faac7, - type: 3} - propertyPath: m_SceneMenuToLoad - value: - objectReference: {fileID: 11400000, guid: c10d995498e0c514a853c3506031d3fb, - type: 2} m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 3200770c16e3b2b4ebe7f604154faac7, type: 3} ---- !u!224 &627808639 stripped -RectTransform: - m_CorrespondingSourceObject: {fileID: 2848221156307247792, guid: 3200770c16e3b2b4ebe7f604154faac7, - type: 3} - m_PrefabInstance: {fileID: 627808638} + m_SourcePrefab: {fileID: 100100000, guid: d725b5588e1b956458798319e6541d84, type: 3} +--- !u!1 &1949195315 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1949195316} + - component: {fileID: 1949195319} + - component: {fileID: 1949195318} + - component: {fileID: 1949195317} + m_Layer: 0 + m_Name: werq (42) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1949195316 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1949195315} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.461, y: 0, z: -1.4699993} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 42 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1949195317 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1949195315} + 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 &1949195318 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1949195315} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1949195319 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1949195315} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1952242986 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1952242987} + - component: {fileID: 1952242990} + - component: {fileID: 1952242989} + - component: {fileID: 1952242988} + m_Layer: 0 + m_Name: werq (87) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1952242987 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1952242986} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3.533, y: 0, z: -0.238} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 87 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1952242988 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1952242986} + 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 &1952242989 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1952242986} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1952242990 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1952242986} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1953834566 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1953834567} + - component: {fileID: 1953834570} + - component: {fileID: 1953834569} + - component: {fileID: 1953834568} + m_Layer: 0 + m_Name: werq (223) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1953834567 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1953834566} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3.533, y: 0, z: -2.7110014} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 223 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1953834568 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1953834566} + 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 &1953834569 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1953834566} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1953834570 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1953834566} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1958441938 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1958441939} + - component: {fileID: 1958441942} + - component: {fileID: 1958441941} + - component: {fileID: 1958441940} + m_Layer: 0 + m_Name: werq (72) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1958441939 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1958441938} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.894, y: 0, z: -0.49300003} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 72 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1958441940 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1958441938} + 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 &1958441941 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1958441938} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1958441942 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1958441938} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1981994848 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1981994849} + - component: {fileID: 1981994852} + - component: {fileID: 1981994851} + - component: {fileID: 1981994850} + m_Layer: 0 + m_Name: werq (173) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1981994849 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1981994848} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.233, y: 0, z: -3.6880007} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 173 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1981994850 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1981994848} + 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 &1981994851 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1981994848} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1981994852 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1981994848} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1985357179 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1985357180} + - component: {fileID: 1985357183} + - component: {fileID: 1985357182} + - component: {fileID: 1985357181} + m_Layer: 0 + m_Name: werq (139) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1985357180 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1985357179} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.69399995, y: 0, z: -2.4730015} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 139 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &1985357181 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1985357179} + 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 &1985357182 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1985357179} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &1985357183 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1985357179} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2019907570 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2019907571} + - component: {fileID: 2019907574} + - component: {fileID: 2019907573} + - component: {fileID: 2019907572} + m_Layer: 0 + m_Name: werq (110) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2019907571 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2019907570} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.355, y: 0, z: -1.7080002} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 110 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &2019907572 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2019907570} + 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 &2019907573 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2019907570} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &2019907574 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2019907570} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2024574101 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2024574102} + - component: {fileID: 2024574105} + - component: {fileID: 2024574104} + - component: {fileID: 2024574103} + m_Layer: 0 + m_Name: werq (128) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2024574102 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2024574101} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -1.9800014} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 128 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &2024574103 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2024574101} + 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 &2024574104 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2024574101} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &2024574105 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2024574101} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2030561000 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2030561001} + - component: {fileID: 2030561004} + - component: {fileID: 2030561003} + - component: {fileID: 2030561002} + m_Layer: 0 + m_Name: werq (134) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2030561001 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2030561000} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.461, y: 0, z: -2.2180023} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 134 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &2030561002 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2030561000} + 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 &2030561003 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2030561000} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &2030561004 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2030561000} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2036986368 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2036986369} + - component: {fileID: 2036986372} + - component: {fileID: 2036986371} + - component: {fileID: 2036986370} + m_Layer: 0 + m_Name: werq (148) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2036986369 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2036986368} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.94499993, y: 0, z: -2.2180023} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 148 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &2036986370 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2036986368} + 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 &2036986371 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2036986368} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &2036986372 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2036986368} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2049090154 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2049090155} + - component: {fileID: 2049090158} + - component: {fileID: 2049090157} + - component: {fileID: 2049090156} + m_Layer: 0 + m_Name: werq (119) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2049090155 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} ---- !u!850595691 &633987594 -LightingSettings: + m_GameObject: {fileID: 2049090154} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3.533, y: 0, z: -1.215} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 119 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &2049090156 +MeshCollider: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_Name: Settings.lighting - serializedVersion: 3 - m_GIWorkflowMode: 0 - m_EnableBakedLightmaps: 1 - m_EnableRealtimeLightmaps: 0 - m_RealtimeEnvironmentLighting: 1 - m_BounceScale: 1 - m_AlbedoBoost: 1 - m_IndirectOutputScale: 1 - m_UsingShadowmask: 1 - m_BakeBackend: 1 - m_LightmapMaxSize: 1024 - m_BakeResolution: 40 - m_Padding: 2 - m_TextureCompression: 1 - m_AO: 0 - m_AOMaxDistance: 1 - m_CompAOExponent: 1 - m_CompAOExponentDirect: 0 - m_ExtractAO: 0 - m_MixedBakeMode: 2 - m_LightmapsBakeMode: 1 - m_FilterMode: 1 - m_LightmapParameters: {fileID: 15204, guid: 0000000000000000f000000000000000, type: 0} - m_ExportTrainingData: 0 - m_TrainingDataDestination: TrainingData - m_RealtimeResolution: 2 - m_ForceWhiteAlbedo: 0 - m_ForceUpdates: 0 - m_FinalGather: 0 - m_FinalGatherRayCount: 256 - m_FinalGatherFiltering: 1 - m_PVRCulling: 1 - m_PVRSampling: 1 - m_PVRDirectSampleCount: 32 - m_PVRSampleCount: 500 - m_PVREnvironmentSampleCount: 500 - m_PVREnvironmentReferencePointCount: 2048 - m_LightProbeSampleCountMultiplier: 4 - m_PVRBounces: 2 - m_PVRMinBounces: 2 - m_PVREnvironmentMIS: 0 - m_PVRFilteringMode: 2 - m_PVRDenoiserTypeDirect: 0 - m_PVRDenoiserTypeIndirect: 0 - m_PVRDenoiserTypeAO: 0 - m_PVRFilterTypeDirect: 0 - m_PVRFilterTypeIndirect: 0 - m_PVRFilterTypeAO: 0 - m_PVRFilteringGaussRadiusDirect: 1 - m_PVRFilteringGaussRadiusIndirect: 5 - m_PVRFilteringGaussRadiusAO: 2 - m_PVRFilteringAtrousPositionSigmaDirect: 0.5 - m_PVRFilteringAtrousPositionSigmaIndirect: 2 - m_PVRFilteringAtrousPositionSigmaAO: 1 ---- !u!1 &678326392 + m_GameObject: {fileID: 2049090154} + 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 &2049090157 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2049090154} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &2049090158 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2049090154} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2053103141 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -541,87 +25344,244 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 678326399} - - component: {fileID: 678326398} - - component: {fileID: 678326397} - - component: {fileID: 678326396} - - component: {fileID: 678326394} - - component: {fileID: 678326393} - - component: {fileID: 678326395} + - component: {fileID: 2053103142} + - component: {fileID: 2053103145} + - component: {fileID: 2053103144} + - component: {fileID: 2053103143} m_Layer: 0 - m_Name: NetworkTransformBuffered + m_Name: werq (116) m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!114 &678326393 -MonoBehaviour: +--- !u!4 &2053103142 +Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 678326392} + m_GameObject: {fileID: 2053103141} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.839, y: 0, z: -1.2150002} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 116 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &2053103143 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2053103141} + m_Material: {fileID: 0} + m_IsTrigger: 0 m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 307c40a41954948e7a36bb6b64b4b9cb, type: 3} - m_Name: - m_EditorClassIdentifier: - m_MoveSpeed: 5 - m_RotationSpeed: 30 ---- !u!114 &678326394 -MonoBehaviour: + serializedVersion: 4 + m_Convex: 0 + m_CookingOptions: 30 + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &2053103144 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2053103141} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &2053103145 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2053103141} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2060061432 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2060061433} + - component: {fileID: 2060061436} + - component: {fileID: 2060061435} + - component: {fileID: 2060061434} + m_Layer: 0 + m_Name: werq (224) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2060061433 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2060061432} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.894, y: 0, z: -2.9570007} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 224 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &2060061434 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2060061432} + 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 &2060061435 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2060061432} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &2060061436 +MeshFilter: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 678326392} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} - m_Name: - m_EditorClassIdentifier: - GlobalObjectIdHash: 3301752843 - AlwaysReplicateAsRoot: 0 - DontDestroyWithOwner: 0 - AutoObjectParentSync: 1 ---- !u!114 &678326395 -MonoBehaviour: + m_GameObject: {fileID: 2060061432} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2068975254 +GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 678326392} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3} - m_Name: - m_EditorClassIdentifier: - Authority: 0 - InLocalSpace: 0 - FixedSendsPerSecond: 30 - m_PositionInterpolatorFactory: {fileID: 11400000, guid: a882403a7bf6247cd881a093a9a3f537, - type: 2} ---- !u!65 &678326396 -BoxCollider: + serializedVersion: 6 + m_Component: + - component: {fileID: 2068975255} + - component: {fileID: 2068975258} + - component: {fileID: 2068975257} + - component: {fileID: 2068975256} + m_Layer: 0 + m_Name: werq (245) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2068975255 +Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 678326392} + m_GameObject: {fileID: 2068975254} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3.072, y: 0, z: -3.1950016} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 245 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &2068975256 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2068975254} 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 &678326397 + serializedVersion: 4 + m_Convex: 0 + m_CookingOptions: 30 + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &2068975257 MeshRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 678326392} + m_GameObject: {fileID: 2068975254} m_Enabled: 1 m_CastShadows: 1 m_ReceiveShadows: 1 @@ -634,7 +25594,7 @@ MeshRenderer: m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: - - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 2100000, guid: d255f11ce58034f15b98a74b2dce910d, type: 2} m_StaticBatchInfo: firstSubMesh: 0 subMeshCount: 0 @@ -656,30 +25616,15 @@ MeshRenderer: m_SortingLayer: 0 m_SortingOrder: 0 m_AdditionalVertexStreams: {fileID: 0} ---- !u!33 &678326398 +--- !u!33 &2068975258 MeshFilter: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 678326392} - m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!4 &678326399 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 678326392} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -8.25, y: 1.55, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 702051986} - m_Father: {fileID: 0} - m_RootOrder: 5 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &702051983 + m_GameObject: {fileID: 2068975254} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2078151579 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -687,82 +25632,95 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 702051986} - - component: {fileID: 702051985} - - component: {fileID: 702051984} + - component: {fileID: 2078151580} + - component: {fileID: 2078151583} + - component: {fileID: 2078151582} + - component: {fileID: 2078151581} m_Layer: 0 - m_Name: Camera + m_Name: werq (1) m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!81 &702051984 -AudioListener: +--- !u!4 &2078151580 +Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 702051983} + m_GameObject: {fileID: 2078151579} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.233, y: 0, z: 0} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &2078151581 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2078151579} + m_Material: {fileID: 0} + m_IsTrigger: 0 m_Enabled: 1 ---- !u!20 &702051985 -Camera: + serializedVersion: 4 + m_Convex: 0 + m_CookingOptions: 30 + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &2078151582 +MeshRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 702051983} + m_GameObject: {fileID: 2078151579} 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: 0 - 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 &702051986 -Transform: + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &2078151583 +MeshFilter: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 702051983} - m_LocalRotation: {x: 0.5, y: -0, z: -0, w: 0.8660254} - m_LocalPosition: {x: 8.25, y: 18.45, z: -16} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 678326399} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 60, y: 0, z: 0} ---- !u!1 &705507993 + m_GameObject: {fileID: 2078151579} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2089701612 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -770,92 +25728,95 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 705507995} - - component: {fileID: 705507994} + - component: {fileID: 2089701613} + - component: {fileID: 2089701616} + - component: {fileID: 2089701615} + - component: {fileID: 2089701614} m_Layer: 0 - m_Name: Directional Light + m_Name: werq (46) m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!108 &705507994 -Light: +--- !u!4 &2089701613 +Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 705507993} + m_GameObject: {fileID: 2089701612} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.461, y: 0, z: -1.7080002} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 46 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &2089701614 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2089701612} + m_Material: {fileID: 0} + m_IsTrigger: 0 m_Enabled: 1 - serializedVersion: 10 - m_Type: 1 - m_Shape: 0 - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_Intensity: 1 - m_Range: 10 - m_SpotAngle: 30 - m_InnerSpotAngle: 21.802082 - m_CookieSize: 10 - m_Shadows: - m_Type: 2 - m_Resolution: -1 - m_CustomResolution: -1 - m_Strength: 0.3 - 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 + serializedVersion: 4 + m_Convex: 0 + m_CookingOptions: 30 + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &2089701615 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2089701612} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 m_RenderingLayerMask: 1 - m_Lightmapping: 1 - 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 &705507995 -Transform: + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: d255f11ce58034f15b98a74b2dce910d, 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 &2089701616 +MeshFilter: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 705507993} - 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: 0 - m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} ---- !u!1 &849106629 + m_GameObject: {fileID: 2089701612} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2106865350 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -863,65 +25824,95 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 849106632} - - component: {fileID: 849106631} - - component: {fileID: 849106630} + - component: {fileID: 2106865351} + - component: {fileID: 2106865354} + - component: {fileID: 2106865353} + - component: {fileID: 2106865352} m_Layer: 0 - m_Name: EventSystem + m_Name: werq (130) m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!114 &849106630 -MonoBehaviour: +--- !u!4 &2106865351 +Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 849106629} + m_GameObject: {fileID: 2106865350} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.461, y: 0, z: -1.9800014} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 130 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &2106865352 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2106865350} + m_Material: {fileID: 0} + m_IsTrigger: 0 m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} - m_Name: - m_EditorClassIdentifier: - m_HorizontalAxis: Horizontal - m_VerticalAxis: Vertical - m_SubmitButton: Submit - m_CancelButton: Cancel - m_InputActionsPerSecond: 10 - m_RepeatDelay: 0.5 - m_ForceModuleActive: 0 ---- !u!114 &849106631 -MonoBehaviour: + serializedVersion: 4 + m_Convex: 0 + m_CookingOptions: 30 + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &2106865353 +MeshRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 849106629} + m_GameObject: {fileID: 2106865350} m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} - m_Name: - m_EditorClassIdentifier: - m_FirstSelected: {fileID: 0} - m_sendNavigationEvents: 1 - m_DragThreshold: 10 ---- !u!4 &849106632 -Transform: + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &2106865354 +MeshFilter: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 849106629} - 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: 3 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1333567162 + m_GameObject: {fileID: 2106865350} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2128892963 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -929,121 +25920,95 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1333567166} - - component: {fileID: 1333567165} - - component: {fileID: 1333567164} - - component: {fileID: 1333567163} - - component: {fileID: 1333567167} - m_Layer: 5 - m_Name: Canvas + - component: {fileID: 2128892964} + - component: {fileID: 2128892967} + - component: {fileID: 2128892966} + - component: {fileID: 2128892965} + m_Layer: 0 + m_Name: werq (55) m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!114 &1333567163 -MonoBehaviour: +--- !u!4 &2128892964 +Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1333567162} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: - serializedVersion: 2 - m_Bits: 4294967295 ---- !u!114 &1333567164 -MonoBehaviour: + m_GameObject: {fileID: 2128892963} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.6389999, y: 0, z: -1.215} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 55 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &2128892965 +MeshCollider: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1333567162} + m_GameObject: {fileID: 2128892963} + m_Material: {fileID: 0} + m_IsTrigger: 0 m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UiScaleMode: 1 - m_ReferencePixelsPerUnit: 100 - m_ScaleFactor: 1 - m_ReferenceResolution: {x: 1280, y: 720} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 0.5 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 96 - m_DefaultSpriteDPI: 96 - m_DynamicPixelsPerUnit: 1 - m_PresetInfoIsWorld: 0 ---- !u!223 &1333567165 -Canvas: + serializedVersion: 4 + m_Convex: 0 + m_CookingOptions: 30 + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &2128892966 +MeshRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1333567162} + m_GameObject: {fileID: 2128892963} m_Enabled: 1 - serializedVersion: 3 - m_RenderMode: 0 - m_Camera: {fileID: 0} - m_PlaneDistance: 100 - m_PixelPerfect: 0 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingBucketNormalizedSize: 0 - m_AdditionalShaderChannelsFlag: 0 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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_TargetDisplay: 0 ---- !u!224 &1333567166 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1333567162} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_Children: - - {fileID: 627808639} - - {fileID: 1536251758} - m_Father: {fileID: 0} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!114 &1333567167 -MonoBehaviour: + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &2128892967 +MeshFilter: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1333567162} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4390d966eb8724ba2907f775b34e94ea, type: 3} - m_Name: - m_EditorClassIdentifier: - NetworkManager: {fileID: 620561611} - ButtonsRoot: {fileID: 0} ---- !u!224 &1536251758 stripped -RectTransform: - m_CorrespondingSourceObject: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, - type: 3} - m_PrefabInstance: {fileID: 1928839749} - m_PrefabAsset: {fileID: 0} ---- !u!1 &1643885206 + m_GameObject: {fileID: 2128892963} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2129603126 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1051,88 +26016,52 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1643885211} - - component: {fileID: 1643885210} - - component: {fileID: 1643885209} - - component: {fileID: 1643885208} - - component: {fileID: 1643885207} - - component: {fileID: 1643885212} - - component: {fileID: 1643885213} + - component: {fileID: 2129603127} + - component: {fileID: 2129603130} + - component: {fileID: 2129603129} + - component: {fileID: 2129603128} m_Layer: 0 - m_Name: NetworkTransformLegacy + m_Name: werq (9) m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!114 &1643885207 -MonoBehaviour: + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2129603127 +Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1643885206} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: df4fbe773fc544428171994e08b0483f, type: 3} - m_Name: - m_EditorClassIdentifier: - FixedSendsPerSecond: 20 - AssumeSyncedSends: 1 - InterpolatePosition: 1 - SnapDistance: 10 - InterpolateServer: 1 - MinMeters: 0.15 - MinDegrees: 1.5 - ExtrapolatePosition: 0 - MaxSendsToExtrapolate: 5 - Channel: - EnableRange: 0 - EnableNonProvokedResendChecks: 0 - DistanceSendrate: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 20 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 500 - value: 20 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 ---- !u!65 &1643885208 -BoxCollider: + m_GameObject: {fileID: 2129603126} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.233, y: 0, z: -0.49300003} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} + m_Children: [] + m_Father: {fileID: 727811950} + m_RootOrder: 9 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!64 &2129603128 +MeshCollider: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1643885206} + m_GameObject: {fileID: 2129603126} 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 &1643885209 + serializedVersion: 4 + m_Convex: 0 + m_CookingOptions: 30 + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &2129603129 MeshRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1643885206} + m_GameObject: {fileID: 2129603126} m_Enabled: 1 m_CastShadows: 1 m_ReceiveShadows: 1 @@ -1145,7 +26074,7 @@ MeshRenderer: m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: - - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 2100000, guid: d255f11ce58034f15b98a74b2dce910d, type: 2} m_StaticBatchInfo: firstSubMesh: 0 subMeshCount: 0 @@ -1167,174 +26096,107 @@ MeshRenderer: m_SortingLayer: 0 m_SortingOrder: 0 m_AdditionalVertexStreams: {fileID: 0} ---- !u!33 &1643885210 +--- !u!33 &2129603130 MeshFilter: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1643885206} - m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!4 &1643885211 + m_GameObject: {fileID: 2129603126} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2133559709 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2133559710} + - component: {fileID: 2133559713} + - component: {fileID: 2133559712} + - component: {fileID: 2133559711} + m_Layer: 0 + m_Name: werq (236) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2133559710 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1643885206} + m_GameObject: {fileID: 2133559709} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -10.29, y: 1.55, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} + m_LocalPosition: {x: 1.894, y: 0, z: -3.6880016} + m_LocalScale: {x: 0.018942, y: 0.018942, z: 0.018942} m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 4 + m_Father: {fileID: 727811950} + m_RootOrder: 236 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1643885212 -MonoBehaviour: +--- !u!64 &2133559711 +MeshCollider: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1643885206} + m_GameObject: {fileID: 2133559709} + m_Material: {fileID: 0} + m_IsTrigger: 0 m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} - m_Name: - m_EditorClassIdentifier: - GlobalObjectIdHash: 3638589847 - AlwaysReplicateAsRoot: 0 - DontDestroyWithOwner: 0 - AutoObjectParentSync: 1 ---- !u!114 &1643885213 -MonoBehaviour: + serializedVersion: 4 + m_Convex: 0 + m_CookingOptions: 30 + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &2133559712 +MeshRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1643885206} + m_GameObject: {fileID: 2133559709} m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 307c40a41954948e7a36bb6b64b4b9cb, type: 3} - m_Name: - m_EditorClassIdentifier: - m_MoveSpeed: 5 - m_RotationSpeed: 30 ---- !u!1001 &1928839749 -PrefabInstance: + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d255f11ce58034f15b98a74b2dce910d, 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 &2133559713 +MeshFilter: m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 1333567166} - m_Modifications: - - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, - type: 3} - propertyPath: m_Pivot.x - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, - type: 3} - propertyPath: m_Pivot.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, - type: 3} - propertyPath: m_RootOrder - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, - type: 3} - propertyPath: m_AnchorMax.x - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, - type: 3} - propertyPath: m_AnchorMax.y - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, - type: 3} - propertyPath: m_AnchorMin.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, - type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, - type: 3} - propertyPath: m_SizeDelta.x - value: -952 - objectReference: {fileID: 0} - - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, - type: 3} - propertyPath: m_SizeDelta.y - value: -344 - objectReference: {fileID: 0} - - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, - type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, - type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, - type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, - type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, - type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, - type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, - type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, - type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, - type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, - type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, - type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6633621479308595792, guid: d725b5588e1b956458798319e6541d84, - type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6963777608485144162, guid: d725b5588e1b956458798319e6541d84, - type: 3} - propertyPath: m_Name - value: ConnectionModeButtons - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: d725b5588e1b956458798319e6541d84, type: 3} + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2133559709} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} From bb7dc837550d03adb2bef985cba68e9cc711757d Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Thu, 5 Aug 2021 19:21:29 -0400 Subject: [PATCH 007/113] # --- ...ufferedLinearInterpolatorVector3Factory.cs | 70 ++++++++------- .../Prototyping/Interpolator/IInterpolator.cs | 5 +- .../Interpolator/NoInterpolationFactory.cs | 2 +- .../PositionLinearInterpolatorFactory.cs | 2 +- .../Prototyping/NetworkTransform.cs | 85 +++++++++++++------ .../Prototyping/NetworkTransform.cs.meta | 3 +- .../Messaging/InternalMessageHandler.cs | 2 +- testproject/Assets/MoveInCircle.cs | 35 ++++++-- 8 files changed, 131 insertions(+), 73 deletions(-) diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3Factory.cs b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3Factory.cs index e7a756098e..b901e07487 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3Factory.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3Factory.cs @@ -1,9 +1,11 @@ using System.Collections.Generic; using MLAPI; +using MLAPI.NetworkVariable; +using MLAPI.Serialization; using MLAPI.Timing; using UnityEngine; -namespace DefaultNamespace +namespace unity.netcode { public interface IBufferedLinearInterpolatorSettings : IInterpolatorSettings { @@ -49,16 +51,16 @@ public abstract class BufferedLinearInterpolator : IInterpolator where T : struct BufferedItem { public T item; - public NetworkTime tickSent; + public NetworkTime timeSent; } // private double ServerTick => NetworkManager.Singleton.ServerTime.Tick; - protected virtual double ServerTickBeingHandledForBuffering => NetworkManager.Singleton.ServerTime.Tick; // override this if you want configurable buffering, right now using ServerTick's own global buffering + protected virtual double ServerTimeBeingHandledForBuffering => NetworkManager.Singleton.ServerTime.Time; // override this if you want configurable buffering, right now using ServerTick's own global buffering T m_LerpStartValue; T m_LerpEndValue; private T m_CurrentValue; - private NetworkTime m_ValueCurrentTickConsumed; + private NetworkTime m_CurrentTimeConsumed; private List> m_Buffer = new List>(); @@ -74,18 +76,7 @@ public BufferedLinearInterpolator(IBufferedLinearInterpolatorSettings settings) m_Settings = settings; } - public BufferedLinearInterpolator(NetworkVariable> netvar) - { - netvar.OnValueChanged += OnStateChanged; - } - - public void OnStateChanged(IInterpolatedState old, IInterpolatedState newState) - { - var sentTime = new NetworkTime(NetworkManager.Singleton.ServerTime.TickRate, newState.SentTick); - AddMeasurement(newState.Value, sentTime); - } - - private NetworkTime m_PreviousTickConsumed; + private NetworkTime m_PreviousTimeConsumed; private void TryConsumeFromBuffer() { @@ -94,13 +85,17 @@ private void TryConsumeFromBuffer() for (int i = m_Buffer.Count - 1; i >= 0; i--) { var bufferedValue = m_Buffer[i]; - if (bufferedValue.tickSent.Tick <= ServerTickBeingHandledForBuffering) + if (bufferedValue.timeSent.Time <= ServerTimeBeingHandledForBuffering) { - m_LerpStartValue = m_LerpEndValue; + if (nbConsumed == 0) + { + m_PreviousTimeConsumed = m_CurrentTimeConsumed; + m_LerpStartValue = m_LerpEndValue; + } + m_LerpEndValue = bufferedValue.item; - samPreviousTickConsumed = m_ValueCurrentTickConsumed; - m_ValueCurrentTickConsumed = bufferedValue.tickSent; - Debug.Log($"hellooooo {bufferedValue.tickSent}"); + m_CurrentTimeConsumed = bufferedValue.timeSent; + Debug.Log($"hellooooo {bufferedValue.timeSent}"); m_Buffer.RemoveAt(i); nbConsumed++; @@ -112,7 +107,7 @@ private void TryConsumeFromBuffer() Debug.Log($"Buffer size: {count}, nb consumed: {nbConsumed}"); var pos2 = m_LerpEndValue is Vector3 value2 ? value2 : default; - Debug.DrawLine(pos2, pos2 + Vector3.down * (m_ValueCurrentTickConsumed.Tick - m_PreviousTickConsumed.Tick), Color.cyan, 10, false); + Debug.DrawLine(pos2, pos2 + Vector3.down * 100 * (float) (m_CurrentTimeConsumed.Time - m_PreviousTimeConsumed.Time), Color.cyan, 10, false); for (int i = 0; i < count; i++) { Debug.DrawLine(pos2 + Vector3.up * (i+1), pos2 + Vector3.up* (i+1) + Vector3.left, Color.white, 10, false); @@ -148,16 +143,17 @@ public T Update(float deltaTime) TryConsumeFromBuffer(); - var timeB = m_ValueCurrentTickConsumed;//new NetworkTime(NetworkManager.Singleton.NetworkTickSystem.TickRate, m_ValueLastTick); - // var timeA = timeB - timeB.FixedDeltaTime;// + // Interpolation example to understand the math below // 4 6 6.5 // | | | // A B Server - var timeA = m_PreviousTickConsumed; + var timeB = m_CurrentTimeConsumed;//new NetworkTime(NetworkManager.Singleton.NetworkTickSystem.TickRate, m_ValueLastTick); + // var timeA = timeB - timeB.FixedDeltaTime;// + var timeA = m_PreviousTimeConsumed; double range = timeB.Time - timeA.Time; - var renderTime = NetworkManager.Singleton.NetworkTickSystem.ServerTime.Time - range; + var renderTime = ServerTimeBeingHandledForBuffering - range; // var renderTime = m_RenderTime; float t = (float)((renderTime - timeA.Time) / range); var diffServerTime = NetworkManager.Singleton.NetworkTickSystem.ServerTime.Time - samLastServerTime; @@ -183,19 +179,19 @@ public T Update(float deltaTime) return m_CurrentValue; } - public void NetworkTickUpdate(float fixedDeltaTime) + public void FixedUpdate(float fixedDeltaTime) { } - public void AddMeasurement(T newMeasurement, NetworkTime SentTick) + public void AddMeasurement(T newMeasurement, NetworkTime sentTime) { var debugPos = newMeasurement is Vector3 value ? value : default; Debug.DrawLine(debugPos, debugPos + Vector3.right + Vector3.up, Color.red, 10, false); Debug.Log($"Adding measurement {Time.time}"); // todo put limit on size, we don't want lag spikes to create 100 entries and have a list that size in memory for ever - m_Buffer.Add(new BufferedItem() {item = newMeasurement, tickSent = SentTick}); - m_Buffer.Sort((item1, item2) => item2.tickSent.Tick.CompareTo(item1.tickSent.Tick)); + m_Buffer.Add(new BufferedItem() {item = newMeasurement, timeSent = sentTime}); + m_Buffer.Sort((item1, item2) => item2.timeSent.Time.CompareTo(item1.timeSent.Time)); } public T GetInterpolatedValue() @@ -203,7 +199,7 @@ public T GetInterpolatedValue() return m_CurrentValue; } - public void Reset(T value, NetworkTime SentTick) + public void Reset(T value, NetworkTime sentTime) { m_CurrentValue = value; m_LerpEndValue = value; @@ -224,17 +220,25 @@ public BufferedLinearInterpolatorVector3(IBufferedLinearInterpolatorSettings set public override Vector3 Interpolate(Vector3 start, Vector3 end, float time) { - return Vector3.LerpUnclamped(start, end, time); + return Vector3.Lerp(start, end, time); } } public class BufferedLinearInterpolatorQuaternion : BufferedLinearInterpolator { + public BufferedLinearInterpolatorQuaternion(IBufferedLinearInterpolatorSettings settings) : base(settings) { } + public override Quaternion Interpolate(Quaternion start, Quaternion end, float time) { return Quaternion.Slerp(start, end, time); } + } - public BufferedLinearInterpolatorQuaternion(IBufferedLinearInterpolatorSettings settings) : base(settings) { } + public class BufferedLinearInterpolatorFloat : BufferedLinearInterpolator + { + public override float Interpolate(float start, float end, float time) + { + return Mathf.Lerp(start, end, time); + } } } \ No newline at end of file diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/IInterpolator.cs b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/IInterpolator.cs index a6862322b4..7752861da5 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/IInterpolator.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/IInterpolator.cs @@ -1,3 +1,4 @@ +using MLAPI.Serialization; using MLAPI.Timing; using UnityEngine; @@ -8,7 +9,7 @@ public interface IInterpolator public void Start(); public void OnEnable(); public T Update(float deltaTime); - public void NetworkTickUpdate(float tickDeltaTime); + public void FixedUpdate(float tickDeltaTime); public void AddMeasurement(T newMeasurement, NetworkTime sentTime); public T GetInterpolatedValue(); public void Reset(T value, NetworkTime sentTime); @@ -24,3 +25,5 @@ public abstract class InterpolatorFactory : ScriptableObject public interface IInterpolatorSettings { } + + diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolationFactory.cs b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolationFactory.cs index 3579958737..803691af18 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolationFactory.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolationFactory.cs @@ -47,7 +47,7 @@ public T Update(float deltaTime) return GetInterpolatedValue(); } - public void NetworkTickUpdate(float fixedDeltaTime) + public void FixedUpdate(float fixedDeltaTime) { } diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/PositionLinearInterpolatorFactory.cs b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/PositionLinearInterpolatorFactory.cs index e940366add..d7c879fc90 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/PositionLinearInterpolatorFactory.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/PositionLinearInterpolatorFactory.cs @@ -52,7 +52,7 @@ public Vector3 Update(float deltaTime) return GetInterpolatedValue(); } - public void NetworkTickUpdate(float fixedDeltaTime) + public void FixedUpdate(float fixedDeltaTime) { } diff --git a/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs b/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs index 0540db786b..904946325f 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs @@ -1,9 +1,9 @@ using System; -using DefaultNamespace; using MLAPI.NetworkVariable; using MLAPI.Serialization; using MLAPI.Timing; using MLAPI.Transports; +using unity.netcode; using UnityEngine; namespace MLAPI.Prototyping @@ -12,6 +12,7 @@ namespace MLAPI.Prototyping /// A prototype component for syncing transforms /// [AddComponentMenu("MLAPI/NetworkTransform")] + [DefaultExecutionOrder(10000)] public class NetworkTransform : NetworkBehaviour { /// @@ -33,7 +34,7 @@ private class NetworkState : INetworkSerializable public Quaternion Rotation; public Vector3 Scale; - public int SentTick; + public double SentTime; public NetworkState(NetworkState copy) { @@ -41,7 +42,7 @@ public NetworkState(NetworkState copy) Position = copy.Position; Rotation = copy.Rotation; Scale = copy.Scale; - SentTick = copy.SentTick; + SentTime = copy.SentTime; } public NetworkState() @@ -54,7 +55,7 @@ public void NetworkSerialize(NetworkSerializer serializer) serializer.Serialize(ref Position); serializer.Serialize(ref Rotation); serializer.Serialize(ref Scale); - serializer.Serialize(ref SentTick); + serializer.Serialize(ref SentTime); } } @@ -136,13 +137,34 @@ private bool IsNetworkStateDirty(NetworkState networkState) return isDirty; } - private int previousTickSam; + private bool IsTransformDirty() + { + bool isDirty = false; + var networkState = m_NetworkState.Value; + isDirty |= networkState.InLocalSpace != InLocalSpace; + if (InLocalSpace) + { + isDirty |= networkState.Position != m_Transform.localPosition; + isDirty |= networkState.Rotation != m_Transform.localRotation; + isDirty |= networkState.Scale != m_Transform.localScale; + } + else + { + isDirty |= networkState.Position != m_Transform.position; + isDirty |= networkState.Rotation != m_Transform.rotation; + isDirty |= networkState.Scale != m_Transform.lossyScale; + } + + return isDirty; + } + + private double previousTimeSam; private Vector3 previousPosSam; private void UpdateNetworkState() { m_NetworkState.Value.InLocalSpace = InLocalSpace; // m_NetworkState.Value.SentTime = Time.realtimeSinceStartup; - m_NetworkState.Value.SentTick = NetworkManager.Singleton.LocalTime.Tick; + m_NetworkState.Value.SentTime = m_DirtyTime; if (InLocalSpace) { m_NetworkState.Value.Position = m_Transform.localPosition; @@ -156,8 +178,8 @@ private void UpdateNetworkState() m_NetworkState.Value.Scale = m_Transform.lossyScale; } - Debug.Log($"sam asdf distance {Math.Round((m_NetworkState.Value.Position - previousPosSam).magnitude, 2)} tick diff {m_NetworkState.Value.SentTick - previousTickSam} sam"); - previousTickSam = m_NetworkState.Value.SentTick; + Debug.Log($"sam asdf distance {Math.Round((m_NetworkState.Value.Position - previousPosSam).magnitude, 2)} tick diff {m_NetworkState.Value.SentTime - previousTimeSam} sam"); + previousTimeSam = m_NetworkState.Value.SentTime; previousPosSam = m_NetworkState.Value.Position; m_NetworkState.SetDirty(true); @@ -213,9 +235,9 @@ private void OnNetworkStateChanged(NetworkState oldState, NetworkState newState) // PositionInterpolator.AddMeasurement(newState.Position, NetworkManager.Singleton.ServerTime.Time); Debug.Log($"distance sam {Math.Round((newState.Position - oldState.Position).magnitude, 2)}"); - Debug.Log($"diff tick sam {(newState.SentTick - oldState.SentTick, 2)}"); + Debug.Log($"diff tick sam {(newState.SentTime - oldState.SentTime, 2)}"); // oldTick = NetworkManager.Singleton.ServerTime.Tick; - var sentTime = new NetworkTime(NetworkManager.Singleton.ServerTime.TickRate, newState.SentTick); + var sentTime = new NetworkTime(NetworkManager.Singleton.ServerTime.TickRate, newState.SentTime); PositionInterpolator.AddMeasurement(newState.Position, sentTime); RotationInterpolator.AddMeasurement(newState.Rotation, sentTime); } @@ -263,10 +285,6 @@ private void Awake() RotationInterpolator = m_RotationInterpolatorFactory.CreateInterpolator(); } - var currentTime = new NetworkTime(NetworkManager.Singleton.ServerTime.TickRate, m_NetworkState.Value.SentTick); - PositionInterpolator.Reset(m_Transform.position, currentTime); - RotationInterpolator.Reset(m_Transform.rotation, currentTime); - UpdateNetVarPerms(); m_NetworkState.Settings.SendNetworkChannel = Channel; @@ -278,10 +296,14 @@ private void Awake() public override void OnNetworkSpawn() { m_PrevNetworkState = null; - if (enabled) // todo Luke fix your UX - { - NetworkManager.NetworkTickSystem.Tick += NetworkTickUpdate; - } + // if (enabled) // todo Luke fix your UX + // { + // NetworkManager.NetworkTickSystem.Tick += NetworkTickUpdate; + // } + + var currentTime = new NetworkTime(NetworkManager.Singleton.ServerTime.TickRate, m_NetworkState.Value.SentTime); + PositionInterpolator.Reset(m_Transform.position, currentTime); + RotationInterpolator.Reset(m_Transform.rotation, currentTime); PositionInterpolator.OnNetworkSpawn(); RotationInterpolator.OnNetworkSpawn(); @@ -292,15 +314,20 @@ private void OnDestroy() m_NetworkState.OnValueChanged -= OnNetworkStateChanged; } - private void NetworkTickUpdate() + private void FixedUpdate() { if (!NetworkObject.IsSpawned) { return; } - - if (CanUpdateTransform) //&& IsNetworkStateDirty(m_NetworkState.Value)) + if (CanUpdateTransform) { + if (IsTransformDirty()) + { + // check for time there was a change to the transform + m_DirtyTime = NetworkManager.LocalTime.Time; + } + UpdateNetworkState(); } else @@ -311,26 +338,30 @@ private void NetworkTickUpdate() ApplyNetworkState(m_NetworkState.Value); } - PositionInterpolator.NetworkTickUpdate(NetworkManager.ServerTime.FixedDeltaTime); - RotationInterpolator.NetworkTickUpdate(NetworkManager.ServerTime.FixedDeltaTime); + PositionInterpolator.FixedUpdate(NetworkManager.ServerTime.FixedDeltaTime); + RotationInterpolator.FixedUpdate(NetworkManager.ServerTime.FixedDeltaTime); } } private int debugOldTime = 0; + private double m_DirtyTime; + private void Update() { - // Debug.Log("gaga "+Math.Round(Time.time - (float)NetworkManager.Singleton.ServerTime.Time, 2)); - - // Debug.Log($"sam {Math.Round(NetworkManager.Singleton.ServerTime.Time - debugOldTime, 2)}"); - // debugOldTime = NetworkManager.Singleton.ServerTime.Time; if (!NetworkObject.IsSpawned) { return; } + if (!CanUpdateTransform) { + // Debug.Log("gaga "+Math.Round(Time.time - (float)NetworkManager.Singleton.ServerTime.Time, 2)); + + // Debug.Log($"sam {Math.Round(NetworkManager.Singleton.ServerTime.Time - debugOldTime, 2)}"); + // debugOldTime = NetworkManager.Singleton.ServerTime.Time; + PositionInterpolator.Update(Time.deltaTime); RotationInterpolator.Update(Time.deltaTime); ApplyNetworkState(m_NetworkState.Value); diff --git a/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs.meta b/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs.meta index 594420f118..6af788f27b 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs.meta +++ b/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs.meta @@ -4,8 +4,9 @@ MonoImporter: externalObjects: {} serializedVersion: 2 defaultReferences: - - m_PositionInterpolator: {fileID: 11400000, guid: a882403a7bf6247cd881a093a9a3f537, + - m_PositionInterpolatorFactory: {fileID: 11400000, guid: a882403a7bf6247cd881a093a9a3f537, type: 2} + - m_RotationInterpolatorFactory: {instanceID: 0} executionOrder: 0 icon: {instanceID: 0} userData: diff --git a/com.unity.multiplayer.mlapi/Runtime/Messaging/InternalMessageHandler.cs b/com.unity.multiplayer.mlapi/Runtime/Messaging/InternalMessageHandler.cs index 2667fccb3a..cfc7bfd322 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Messaging/InternalMessageHandler.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Messaging/InternalMessageHandler.cs @@ -280,7 +280,7 @@ public void HandleDestroyObjects(ulong clientId, Stream stream) public void HandleTimeSync(ulong clientId, Stream stream) { - Assert.IsTrue(clientId == NetworkManager.ServerClientId); + // Assert.IsTrue(clientId == NetworkManager.ServerClientId); using (var reader = PooledNetworkReader.Get(stream)) { diff --git a/testproject/Assets/MoveInCircle.cs b/testproject/Assets/MoveInCircle.cs index 30ec26bdec..3ee77b8ef1 100644 --- a/testproject/Assets/MoveInCircle.cs +++ b/testproject/Assets/MoveInCircle.cs @@ -1,3 +1,4 @@ +using System; using MLAPI; using UnityEngine; @@ -9,22 +10,40 @@ public class MoveInCircle : NetworkBehaviour [SerializeField] private float m_RotationSpeed = 30; + public bool runServerOnly; + public bool runInUpdate; + private Vector3 oldPosition; - public override void OnNetworkSpawn() + // public override void OnNetworkSpawn() + // { + // base.OnNetworkSpawn();// + // NetworkManager.NetworkTickSystem.Tick += NetworkTickUpdate; + // } + + private float lastTime; + + void FixedUpdate() { - base.OnNetworkSpawn();// - NetworkManager.NetworkTickSystem.Tick += NetworkTickUpdate; + if (runInUpdate) return; + Tick(Time.fixedDeltaTime); } - void NetworkTickUpdate() // doesn't work with Update? + void Tick(float deltaTime) { - if (NetworkManager.Singleton.IsServer) + if (NetworkManager.Singleton.IsServer || !runServerOnly) { oldPosition = transform.position; - transform.position = transform.position + transform.forward * (m_MoveSpeed * NetworkManager.LocalTime.FixedDeltaTime); - Debug.Log($"ewqqwe {(transform.position - oldPosition).magnitude}"); - transform.Rotate(0, m_RotationSpeed * NetworkManager.LocalTime.FixedDeltaTime, 0); + transform.position = transform.position + transform.forward * (m_MoveSpeed * deltaTime); + Debug.Log($"ewqqwe {Math.Round((transform.position - oldPosition).magnitude, 2)} time diff {Math.Round(Time.time - lastTime, 2)}"); + lastTime = Time.time; + transform.Rotate(0, m_RotationSpeed * deltaTime, 0); } } + + private void Update() + { + if (!runInUpdate) return; + Tick(Time.deltaTime); + } } From db9688c3ccfe36ce8a4637542cd22b962f63b12f Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Fri, 6 Aug 2021 10:27:23 -0400 Subject: [PATCH 008/113] # --- ...ufferedLinearInterpolatorVector3Factory.cs | 29 +++-- testproject/Assets/Scenes/ZooSam.unity | 123 +++++++++++++++++- 2 files changed, 138 insertions(+), 14 deletions(-) diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3Factory.cs b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3Factory.cs index b901e07487..16ed211c92 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3Factory.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3Factory.cs @@ -101,6 +101,7 @@ private void TryConsumeFromBuffer() var pos = m_LerpEndValue is Vector3 value ? value : default; Debug.DrawLine(pos, pos + Random.Range(0f, 1f) * Vector3.up + Random.Range(0f, 1f) * Vector3.left, Color.green, 10, false); + // break; } } @@ -114,15 +115,15 @@ private void TryConsumeFromBuffer() } } - private float samLastServerTime; - private float samLastTime; + // private float samLastServerTime; + // private float samLastTime; - private float serverOffset; - private float m_RenderTime => Time.time - serverOffset; + // private float serverOffset; + // private float m_RenderTime => Time.time - serverOffset; public void Start() { - serverOffset = (float) (Time.time - NetworkManager.Singleton.NetworkTickSystem.ServerTime.Time); + // serverOffset = (float) (Time.time - NetworkManager.Singleton.NetworkTickSystem.ServerTime.Time); } public void OnEnable() @@ -149,18 +150,24 @@ public T Update(float deltaTime) // 4 6 6.5 // | | | // A B Server + + // Unclamped + // 4 6 6.5 + // | | | | | + // A B Render Server + // A B C + // A B var timeB = m_CurrentTimeConsumed;//new NetworkTime(NetworkManager.Singleton.NetworkTickSystem.TickRate, m_ValueLastTick); - // var timeA = timeB - timeB.FixedDeltaTime;// var timeA = m_PreviousTimeConsumed; double range = timeB.Time - timeA.Time; var renderTime = ServerTimeBeingHandledForBuffering - range; // var renderTime = m_RenderTime; float t = (float)((renderTime - timeA.Time) / range); - var diffServerTime = NetworkManager.Singleton.NetworkTickSystem.ServerTime.Time - samLastServerTime; - samLastServerTime = (float) NetworkManager.Singleton.NetworkTickSystem.ServerTime.Time; - var diffTime = Time.time - samLastTime; - samLastTime = Time.time; - Debug.Log($"diffServerTime {diffServerTime} diffTime {diffTime} deltaTime {deltaTime}"); + // var diffServerTime = NetworkManager.Singleton.NetworkTickSystem.ServerTime.Time - samLastServerTime; + // samLastServerTime = (float) NetworkManager.Singleton.NetworkTickSystem.ServerTime.Time; + // var diffTime = Time.time - samLastTime; + // samLastTime = Time.time; + // Debug.Log($"diffServerTime {diffServerTime} diffTime {diffTime} deltaTime {deltaTime}"); Debug.Log($"ttttttttttttt {t}"); m_CurrentValue = Interpolate(m_LerpStartValue, m_LerpEndValue, t); // m_CurrentValue = m_LerpEndValue; diff --git a/testproject/Assets/Scenes/ZooSam.unity b/testproject/Assets/Scenes/ZooSam.unity index 299f27c9c8..c2a5274cd2 100644 --- a/testproject/Assets/Scenes/ZooSam.unity +++ b/testproject/Assets/Scenes/ZooSam.unity @@ -6194,9 +6194,9 @@ MonoBehaviour: MaxConnectAttempts: 10 channels: [] MessageBufferSize: 5120 - SimulatePacketLossChance: 0 - SimulateMinLatency: 100 - SimulateMaxLatency: 100 + SimulatePacketLossChance: 5 + SimulateMinLatency: 70 + SimulateMaxLatency: 130 --- !u!1001 &627808638 PrefabInstance: m_ObjectHideFlags: 0 @@ -7157,6 +7157,118 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 672979497} m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &674930886 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 674930893} + - component: {fileID: 674930892} + - component: {fileID: 674930891} + - component: {fileID: 674930890} + - component: {fileID: 674930888} + m_Layer: 0 + m_Name: cube that moves + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &674930888 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 674930886} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 307c40a41954948e7a36bb6b64b4b9cb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_MoveSpeed: 5 + m_RotationSpeed: 30 + runServerOnly: 0 + runInUpdate: 1 +--- !u!65 &674930890 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 674930886} + 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 &674930891 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 674930886} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: d2f6bf650dfcc483794cdacf53f9fe2b, 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 &674930892 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 674930886} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &674930893 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 674930886} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -6.2, y: 1.55, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 8 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &674940303 GameObject: m_ObjectHideFlags: 0 @@ -7289,6 +7401,8 @@ MonoBehaviour: m_EditorClassIdentifier: m_MoveSpeed: 5 m_RotationSpeed: 30 + runServerOnly: 1 + runInUpdate: 0 --- !u!114 &678326394 MonoBehaviour: m_ObjectHideFlags: 0 @@ -7322,6 +7436,7 @@ MonoBehaviour: FixedSendsPerSecond: 30 m_PositionInterpolatorFactory: {fileID: 11400000, guid: a882403a7bf6247cd881a093a9a3f537, type: 2} + m_RotationInterpolatorFactory: {fileID: 0} --- !u!65 &678326396 BoxCollider: m_ObjectHideFlags: 0 @@ -20897,6 +21012,8 @@ MonoBehaviour: m_EditorClassIdentifier: m_MoveSpeed: 5 m_RotationSpeed: 30 + runServerOnly: 0 + runInUpdate: 0 --- !u!1 &1659076779 GameObject: m_ObjectHideFlags: 0 From e7bbd12e59ab4dbacee72a32e5bae6bdb9faeb7b Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Tue, 10 Aug 2021 19:38:10 -0400 Subject: [PATCH 009/113] # --- .../Prototyping/NetworkTransform.cs | 50 +++++++++++-------- testproject/Assets/MoveInCircle.cs | 6 +-- testproject/Assets/Scenes/ZooSam.unity | 8 +-- 3 files changed, 36 insertions(+), 28 deletions(-) diff --git a/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs b/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs index 904946325f..8ee42ed935 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs @@ -12,7 +12,7 @@ namespace MLAPI.Prototyping /// A prototype component for syncing transforms /// [AddComponentMenu("MLAPI/NetworkTransform")] - [DefaultExecutionOrder(10000)] + [DefaultExecutionOrder(1000000)] public class NetworkTransform : NetworkBehaviour { /// @@ -160,11 +160,10 @@ private bool IsTransformDirty() private double previousTimeSam; private Vector3 previousPosSam; - private void UpdateNetworkState() + private void SendNetworkStateToGhosts(double dirtyTime) { m_NetworkState.Value.InLocalSpace = InLocalSpace; - // m_NetworkState.Value.SentTime = Time.realtimeSinceStartup; - m_NetworkState.Value.SentTime = m_DirtyTime; + m_NetworkState.Value.SentTime = dirtyTime; if (InLocalSpace) { m_NetworkState.Value.Position = m_Transform.localPosition; @@ -177,7 +176,7 @@ private void UpdateNetworkState() m_NetworkState.Value.Rotation = m_Transform.rotation; m_NetworkState.Value.Scale = m_Transform.lossyScale; } - + Debug.DrawLine(m_NetworkState.Value.Position, m_NetworkState.Value.Position + Vector3.up * 100f * (float) (m_NetworkState.Value.SentTime - previousTimeSam), Color.yellow, 10, false); Debug.Log($"sam asdf distance {Math.Round((m_NetworkState.Value.Position - previousPosSam).magnitude, 2)} tick diff {m_NetworkState.Value.SentTime - previousTimeSam} sam"); previousTimeSam = m_NetworkState.Value.SentTime; previousPosSam = m_NetworkState.Value.Position; @@ -185,7 +184,7 @@ private void UpdateNetworkState() m_NetworkState.SetDirty(true); } - private void ApplyNetworkState(NetworkState netState) + private void ApplyNetworkStateFromAuthority(NetworkState netState) { netState = new NetworkState(netState); netState.Position = PositionInterpolator.GetInterpolatedValue(); @@ -212,6 +211,7 @@ private void ApplyNetworkState(NetworkState netState) private int oldTick; + private NetworkState debug_previousStateChanged; private void OnNetworkStateChanged(NetworkState oldState, NetworkState newState) { if (!NetworkObject.IsSpawned) @@ -237,6 +237,8 @@ private void OnNetworkStateChanged(NetworkState oldState, NetworkState newState) Debug.Log($"distance sam {Math.Round((newState.Position - oldState.Position).magnitude, 2)}"); Debug.Log($"diff tick sam {(newState.SentTime - oldState.SentTime, 2)}"); // oldTick = NetworkManager.Singleton.ServerTime.Tick; + // Debug.DrawLine(newState.Position, newState.Position + Vector3.down + Vector3.left, Color.yellow, 10, false); + debug_previousStateChanged = newState; var sentTime = new NetworkTime(NetworkManager.Singleton.ServerTime.TickRate, newState.SentTime); PositionInterpolator.AddMeasurement(newState.Position, sentTime); RotationInterpolator.AddMeasurement(newState.Rotation, sentTime); @@ -320,22 +322,22 @@ private void FixedUpdate() { return; } - if (CanUpdateTransform) - { - if (IsTransformDirty()) - { - // check for time there was a change to the transform - m_DirtyTime = NetworkManager.LocalTime.Time; - } - - UpdateNetworkState(); - } - else + // if (CanUpdateTransform) + // { + // if (IsTransformDirty()) + // { + // // check for time there was a change to the transform + // m_DirtyTime = NetworkManager.LocalTime.Time; + // } + // + // UpdateNetworkState(); + // } + // else { if (IsNetworkStateDirty(m_PrevNetworkState)) { Debug.LogWarning("A local change without authority detected, revert back to latest network state!"); - ApplyNetworkState(m_NetworkState.Value); + ApplyNetworkStateFromAuthority(m_NetworkState.Value); } PositionInterpolator.FixedUpdate(NetworkManager.ServerTime.FixedDeltaTime); @@ -345,8 +347,6 @@ private void FixedUpdate() private int debugOldTime = 0; - private double m_DirtyTime; - private void Update() { if (!NetworkObject.IsSpawned) @@ -354,6 +354,14 @@ private void Update() return; } + if (CanUpdateTransform) + { + if (IsTransformDirty()) + { + // check for time there was a change to the transform + SendNetworkStateToGhosts(NetworkManager.LocalTime.Time); + } + } if (!CanUpdateTransform) { @@ -364,7 +372,7 @@ private void Update() PositionInterpolator.Update(Time.deltaTime); RotationInterpolator.Update(Time.deltaTime); - ApplyNetworkState(m_NetworkState.Value); + ApplyNetworkStateFromAuthority(m_NetworkState.Value); } } diff --git a/testproject/Assets/MoveInCircle.cs b/testproject/Assets/MoveInCircle.cs index 3ee77b8ef1..cc2aa14bab 100644 --- a/testproject/Assets/MoveInCircle.cs +++ b/testproject/Assets/MoveInCircle.cs @@ -13,7 +13,7 @@ public class MoveInCircle : NetworkBehaviour public bool runServerOnly; public bool runInUpdate; - private Vector3 oldPosition; + private Vector3 debug_oldPosition; // public override void OnNetworkSpawn() // { @@ -33,9 +33,9 @@ void Tick(float deltaTime) { if (NetworkManager.Singleton.IsServer || !runServerOnly) { - oldPosition = transform.position; + debug_oldPosition = transform.position; transform.position = transform.position + transform.forward * (m_MoveSpeed * deltaTime); - Debug.Log($"ewqqwe {Math.Round((transform.position - oldPosition).magnitude, 2)} time diff {Math.Round(Time.time - lastTime, 2)}"); + // Debug.Log($"ewqqwe {Math.Round((transform.position - debug_oldPosition).magnitude, 2)} time diff {Math.Round(Time.time - lastTime, 2)}"); lastTime = Time.time; transform.Rotate(0, m_RotationSpeed * deltaTime, 0); } diff --git a/testproject/Assets/Scenes/ZooSam.unity b/testproject/Assets/Scenes/ZooSam.unity index c2a5274cd2..c4bedd54ef 100644 --- a/testproject/Assets/Scenes/ZooSam.unity +++ b/testproject/Assets/Scenes/ZooSam.unity @@ -6194,9 +6194,9 @@ MonoBehaviour: MaxConnectAttempts: 10 channels: [] MessageBufferSize: 5120 - SimulatePacketLossChance: 5 - SimulateMinLatency: 70 - SimulateMaxLatency: 130 + SimulatePacketLossChance: 0 + SimulateMinLatency: 0 + SimulateMaxLatency: 0 --- !u!1001 &627808638 PrefabInstance: m_ObjectHideFlags: 0 @@ -7402,7 +7402,7 @@ MonoBehaviour: m_MoveSpeed: 5 m_RotationSpeed: 30 runServerOnly: 1 - runInUpdate: 0 + runInUpdate: 1 --- !u!114 &678326394 MonoBehaviour: m_ObjectHideFlags: 0 From 7b93e900512b505d096c74809e0d08a5ad673b9b Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Wed, 11 Aug 2021 11:04:35 -0400 Subject: [PATCH 010/113] fixes for latest develop merge --- ...ufferedLinearInterpolatorVector3Factory.cs | 6 +-- .../Prototyping/Interpolator/IInterpolator.cs | 45 +++++++++---------- .../Interpolator/NoInterpolationFactory.cs | 3 +- .../PositionLinearInterpolatorFactory.cs | 3 +- .../Prototyping/NetworkTransform.cs | 3 +- testproject/Assets/MoveInCircle.cs | 2 +- testproject/Packages/manifest.json | 2 +- testproject/Packages/packages-lock.json | 4 +- 8 files changed, 30 insertions(+), 38 deletions(-) diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3Factory.cs b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3Factory.cs index 16ed211c92..5681d03cea 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3Factory.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3Factory.cs @@ -1,11 +1,7 @@ using System.Collections.Generic; -using MLAPI; -using MLAPI.NetworkVariable; -using MLAPI.Serialization; -using MLAPI.Timing; using UnityEngine; -namespace unity.netcode +namespace Unity.Netcode { public interface IBufferedLinearInterpolatorSettings : IInterpolatorSettings { diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/IInterpolator.cs b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/IInterpolator.cs index 7752861da5..827bff7359 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/IInterpolator.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/IInterpolator.cs @@ -1,29 +1,28 @@ -using MLAPI.Serialization; -using MLAPI.Timing; using UnityEngine; -public interface IInterpolator +namespace Unity.Netcode { - public void Awake(); - public void OnNetworkSpawn(); - public void Start(); - public void OnEnable(); - public T Update(float deltaTime); - public void FixedUpdate(float tickDeltaTime); - public void AddMeasurement(T newMeasurement, NetworkTime sentTime); - public T GetInterpolatedValue(); - public void Reset(T value, NetworkTime sentTime); - public void OnDestroy(); -} + public interface IInterpolator + { + public void Awake(); + public void OnNetworkSpawn(); + public void Start(); + public void OnEnable(); + public T Update(float deltaTime); + public void FixedUpdate(float tickDeltaTime); + public void AddMeasurement(T newMeasurement, NetworkTime sentTime); + public T GetInterpolatedValue(); + public void Reset(T value, NetworkTime sentTime); + public void OnDestroy(); + } -public abstract class InterpolatorFactory : ScriptableObject -{ - public const string BaseMenuName = "MLAPI/Interpolator/"; - public abstract IInterpolator CreateInterpolator(); -} + public abstract class InterpolatorFactory : ScriptableObject + { + public const string BaseMenuName = "MLAPI/Interpolator/"; + public abstract IInterpolator CreateInterpolator(); + } -public interface IInterpolatorSettings -{ + public interface IInterpolatorSettings + { + } } - - diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolationFactory.cs b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolationFactory.cs index 803691af18..b7b561b815 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolationFactory.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolationFactory.cs @@ -1,7 +1,6 @@ -using MLAPI.Timing; using UnityEngine; -namespace DefaultNamespace +namespace Unity.Netcode { [CreateAssetMenu(fileName = "NoInterpolationVector3", menuName = BaseMenuName + "NoInterpolationVector3", order = 1)] public class NoInterpolationVector3Factory : InterpolatorFactory diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/PositionLinearInterpolatorFactory.cs b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/PositionLinearInterpolatorFactory.cs index d7c879fc90..3a24eaf3af 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/PositionLinearInterpolatorFactory.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/PositionLinearInterpolatorFactory.cs @@ -1,8 +1,7 @@ using System; -using MLAPI.Timing; using UnityEngine; -namespace MLAPI +namespace Unity.Netcode { [CreateAssetMenu(fileName = "PositionLinearInterpolator", menuName = BaseMenuName + "PositionLinearInterpolator", order = 1)] public class PositionLinearInterpolatorFactory : InterpolatorFactory diff --git a/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs b/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs index 1b0ae435c5..f8188dd985 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs @@ -1,6 +1,5 @@ using System; -using MLAPI.Timing; -using unity.netcode; +using Unity.Netcode; using UnityEngine; namespace Unity.Netcode.Prototyping diff --git a/testproject/Assets/MoveInCircle.cs b/testproject/Assets/MoveInCircle.cs index cc2aa14bab..1af7460ad3 100644 --- a/testproject/Assets/MoveInCircle.cs +++ b/testproject/Assets/MoveInCircle.cs @@ -1,6 +1,6 @@ using System; -using MLAPI; using UnityEngine; +using Unity.Netcode; public class MoveInCircle : NetworkBehaviour { diff --git a/testproject/Packages/manifest.json b/testproject/Packages/manifest.json index 92929ff725..d05a83f7ce 100644 --- a/testproject/Packages/manifest.json +++ b/testproject/Packages/manifest.json @@ -7,7 +7,7 @@ "com.unity.multiplayer.mlapi": "file:../../com.unity.multiplayer.mlapi", "com.unity.multiplayer.transport.utp": "file:../../com.unity.multiplayer.transport.utp", "com.veriorpies.parrelsync": "https://github.com/VeriorPies/ParrelSync.git?path=/ParrelSync", - "com.mlapi.contrib.transport.litenetlib": "https://github.com/Unity-Technologies/mlapi-community-contributions.git?path=/Transports/com.mlapi.contrib.transport.litenetlib#3f0350ae57befd5ea7deabb1db310eb77704f58e", + "com.mlapi.contrib.transport.litenetlib": "https://github.com/Unity-Technologies/mlapi-community-contributions.git?path=/Transports/com.mlapi.contrib.transport.litenetlib#temp/lnl-develop", "com.unity.package-validation-suite": "0.19.2-preview", "com.unity.test-framework": "1.1.27", "com.unity.test-framework.performance": "2.3.1-preview", diff --git a/testproject/Packages/packages-lock.json b/testproject/Packages/packages-lock.json index 334802f36d..567640d458 100644 --- a/testproject/Packages/packages-lock.json +++ b/testproject/Packages/packages-lock.json @@ -1,11 +1,11 @@ { "dependencies": { "com.mlapi.contrib.transport.litenetlib": { - "version": "https://github.com/Unity-Technologies/mlapi-community-contributions.git?path=/Transports/com.mlapi.contrib.transport.litenetlib#3f0350ae57befd5ea7deabb1db310eb77704f58e", + "version": "https://github.com/Unity-Technologies/mlapi-community-contributions.git?path=/Transports/com.mlapi.contrib.transport.litenetlib#temp/lnl-develop", "depth": 0, "source": "git", "dependencies": {}, - "hash": "3f0350ae57befd5ea7deabb1db310eb77704f58e" + "hash": "46fed6057bc79103e75446eca7b0f69b65ccf16e" }, "com.unity.burst": { "version": "1.3.2", From 3f937b510a50b5e9cc9c00cb2049ed3e2ad017d5 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Wed, 11 Aug 2021 11:05:00 -0400 Subject: [PATCH 011/113] # --- .../BufferedLinearInterpolatorVector3.asset | 2 +- testproject/Assets/Scenes/ZooSam.unity | 13 +++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3.asset b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3.asset index 139fd91530..82227544b1 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3.asset +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3.asset @@ -11,5 +11,5 @@ MonoBehaviour: m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 199dd81621cd441c19cc731e8d29a217, type: 3} m_Name: BufferedLinearInterpolatorVector3 - m_EditorClassIdentifier: + m_EditorClassIdentifier: InterpolationTime: 0.1 diff --git a/testproject/Assets/Scenes/ZooSam.unity b/testproject/Assets/Scenes/ZooSam.unity index c4bedd54ef..08d6103cb5 100644 --- a/testproject/Assets/Scenes/ZooSam.unity +++ b/testproject/Assets/Scenes/ZooSam.unity @@ -6114,9 +6114,9 @@ MonoBehaviour: ServerWebsocketListenPort: 8887 SupportWebsocket: 0 Channels: [] - UseMLAPIRelay: 0 - MLAPIRelayAddress: 184.72.104.138 - MLAPIRelayPort: 8888 + UseNetcodeRelay: 0 + NetcodeRelayAddress: 127.0.0.1 + NetcodeRelayPort: 8888 MessageSendMode: 0 --- !u!114 &620561611 MonoBehaviour: @@ -6157,9 +6157,10 @@ MonoBehaviour: NetworkIdRecycleDelay: 120 RpcHashSize: 0 LoadSceneTimeOut: 120 - EnableMessageBuffering: 1 MessageBufferTimeout: 20 EnableNetworkLogs: 1 + UseSnapshotDelta: 0 + UseSnapshotSpawn: 0 --- !u!4 &620561612 Transform: m_ObjectHideFlags: 0 @@ -7402,7 +7403,7 @@ MonoBehaviour: m_MoveSpeed: 5 m_RotationSpeed: 30 runServerOnly: 1 - runInUpdate: 1 + runInUpdate: 0 --- !u!114 &678326394 MonoBehaviour: m_ObjectHideFlags: 0 @@ -21005,7 +21006,7 @@ MonoBehaviour: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1643885206} - m_Enabled: 1 + m_Enabled: 0 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 307c40a41954948e7a36bb6b64b4b9cb, type: 3} m_Name: From b927f2cb1e27d4f23e387db71e2a6dec712f5d1f Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Wed, 11 Aug 2021 15:42:38 -0400 Subject: [PATCH 012/113] cleanup --- ...ufferedLinearInterpolatorVector3Factory.cs | 165 ++------ .../Prototyping/Interpolator/IInterpolator.cs | 11 - .../Interpolator/NoInterpolationFactory.cs | 22 +- .../PositionLinearInterpolatorFactory.cs | 38 +- .../Prototyping/NetworkTransform.cs | 152 ++++--- testproject/Assets/Scenes/ZooSam.unity | 45 +-- .../Assets/{ => Scripts}/MoveInCircle.cs | 0 .../Assets/{ => Scripts}/MoveInCircle.cs.meta | 0 .../Assets/Scripts/NetworkTransformLegacy.cs | 375 ------------------ .../Scripts/NetworkTransformLegacy.cs.meta | 11 - 10 files changed, 122 insertions(+), 697 deletions(-) rename testproject/Assets/{ => Scripts}/MoveInCircle.cs (100%) rename testproject/Assets/{ => Scripts}/MoveInCircle.cs.meta (100%) delete mode 100644 testproject/Assets/Scripts/NetworkTransformLegacy.cs delete mode 100644 testproject/Assets/Scripts/NetworkTransformLegacy.cs.meta diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3Factory.cs b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3Factory.cs index 5681d03cea..27795572a1 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3Factory.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3Factory.cs @@ -3,81 +3,45 @@ namespace Unity.Netcode { - public interface IBufferedLinearInterpolatorSettings : IInterpolatorSettings - { - public float InterpolationTime { get; } - } - - public abstract class BufferedLinearInterpolatorFactory : InterpolatorFactory, IBufferedLinearInterpolatorSettings - { - [SerializeField] - public float InterpolationTime => 0.100f; - } - - public class BufferedLinearInterpolatorSettings : IBufferedLinearInterpolatorSettings - { - public float InterpolationTime { get; set; } = 0.1f; - } - - [CreateAssetMenu(fileName = "BufferedLinearInterpolatorVector3", menuName = BaseMenuName + "BufferedLinearInterpolatorVector3", order = 1)] - public class BufferedLinearInterpolatorVector3Factory : BufferedLinearInterpolatorFactory - { - public override IInterpolator CreateInterpolator() - { - return new BufferedLinearInterpolatorVector3(this); - } - } - - [CreateAssetMenu(fileName = "BufferedLinearInterpolatorQuaternion", menuName = BaseMenuName + "BufferedLinearInterpolatorQuaternion", order = 1)] - public class BufferedLinearInterpolatorQuaternionFactory : BufferedLinearInterpolatorFactory - { - public override IInterpolator CreateInterpolator() - { - return new BufferedLinearInterpolatorQuaternion(this); - } - } - public abstract class BufferedLinearInterpolator : IInterpolator where T : struct { - public int AdditionalBufferAmountTick = 3; // todo config, todo expose global config, todo use in actual code - // public const float InterpolationConfigTimeSec = 0.100f; // todo remove const for config - - public float InterpolationConfigTimeSec => m_Settings.InterpolationTime; // todo use with range + // public const float InterpolationConfigTimeSec = 0.100f; // todo expose global config, todo use in actual code - struct BufferedItem + private struct BufferedItem { public T item; public NetworkTime timeSent; } - // private double ServerTick => NetworkManager.Singleton.ServerTime.Tick; protected virtual double ServerTimeBeingHandledForBuffering => NetworkManager.Singleton.ServerTime.Time; // override this if you want configurable buffering, right now using ServerTick's own global buffering - T m_LerpStartValue; - T m_LerpEndValue; - private T m_CurrentValue; - private NetworkTime m_CurrentTimeConsumed; + private T m_LerpStartValue; + private T m_LerpEndValue; + + private T m_CurrentUpdatedValue; - private List> m_Buffer = new List>(); + private NetworkTime m_CurrentTimeConsumed; + private NetworkTime m_PreviousTimeConsumed; - private readonly IBufferedLinearInterpolatorSettings m_Settings; + private readonly List m_Buffer = new List(); + private const int k_BufferSizeLimit = 100; - public BufferedLinearInterpolator() + public void Start() { - m_Settings = new BufferedLinearInterpolatorSettings {InterpolationTime = 0.2f}; } - public BufferedLinearInterpolator(IBufferedLinearInterpolatorSettings settings) + public void OnEnable() { - m_Settings = settings; } - private NetworkTime m_PreviousTimeConsumed; + public void OnNetworkSpawn() + { + } private void TryConsumeFromBuffer() { - var count = m_Buffer.Count; int nbConsumed = 0; + // sorted so newer (bigger) time values are at the beginning. for (int i = m_Buffer.Count - 1; i >= 0; i--) { var bufferedValue = m_Buffer[i]; @@ -91,47 +55,10 @@ private void TryConsumeFromBuffer() m_LerpEndValue = bufferedValue.item; m_CurrentTimeConsumed = bufferedValue.timeSent; - Debug.Log($"hellooooo {bufferedValue.timeSent}"); m_Buffer.RemoveAt(i); nbConsumed++; - - var pos = m_LerpEndValue is Vector3 value ? value : default; - Debug.DrawLine(pos, pos + Random.Range(0f, 1f) * Vector3.up + Random.Range(0f, 1f) * Vector3.left, Color.green, 10, false); - // break; } } - - Debug.Log($"Buffer size: {count}, nb consumed: {nbConsumed}"); - var pos2 = m_LerpEndValue is Vector3 value2 ? value2 : default; - - Debug.DrawLine(pos2, pos2 + Vector3.down * 100 * (float) (m_CurrentTimeConsumed.Time - m_PreviousTimeConsumed.Time), Color.cyan, 10, false); - for (int i = 0; i < count; i++) - { - Debug.DrawLine(pos2 + Vector3.up * (i+1), pos2 + Vector3.up* (i+1) + Vector3.left, Color.white, 10, false); - } - } - - // private float samLastServerTime; - // private float samLastTime; - - // private float serverOffset; - // private float m_RenderTime => Time.time - serverOffset; - - public void Start() - { - // serverOffset = (float) (Time.time - NetworkManager.Singleton.NetworkTickSystem.ServerTime.Time); - } - - public void OnEnable() - { - } - - public void Awake() - { - } - - public void OnNetworkSpawn() - { } public T Update(float deltaTime) @@ -140,46 +67,21 @@ public T Update(float deltaTime) TryConsumeFromBuffer(); - - // Interpolation example to understand the math below - // 4 6 6.5 - // | | | - // A B Server - - // Unclamped - // 4 6 6.5 - // | | | | | - // A B Render Server - // A B C - // A B - var timeB = m_CurrentTimeConsumed;//new NetworkTime(NetworkManager.Singleton.NetworkTickSystem.TickRate, m_ValueLastTick); + // 4 4.5 6 6.5 + // | | | | + // A render B Server + + var timeB = m_CurrentTimeConsumed; var timeA = m_PreviousTimeConsumed; double range = timeB.Time - timeA.Time; var renderTime = ServerTimeBeingHandledForBuffering - range; - // var renderTime = m_RenderTime; float t = (float)((renderTime - timeA.Time) / range); - // var diffServerTime = NetworkManager.Singleton.NetworkTickSystem.ServerTime.Time - samLastServerTime; - // samLastServerTime = (float) NetworkManager.Singleton.NetworkTickSystem.ServerTime.Time; - // var diffTime = Time.time - samLastTime; - // samLastTime = Time.time; - // Debug.Log($"diffServerTime {diffServerTime} diffTime {diffTime} deltaTime {deltaTime}"); - Debug.Log($"ttttttttttttt {t}"); - m_CurrentValue = Interpolate(m_LerpStartValue, m_LerpEndValue, t); - // m_CurrentValue = m_LerpEndValue; - + m_CurrentUpdatedValue = Interpolate(m_LerpStartValue, m_LerpEndValue, t); - // var timeB = m_ValueCurrentTickConsumed;//new NetworkTime(NetworkManager.Singleton.NetworkTickSystem.TickRate, m_ValueLastTick); - // var timeA = timeB - timeB.FixedDeltaTime;// - // double range = timeB.Time - timeA.Time; - // float t = (float)((NetworkManager.Singleton.NetworkTickSystem.ServerTime.Time - timeA.FixedDeltaTime - timeA.Time) / range); - // m_CurrentValue = Interpolate(m_LerpStartValue, m_LerpEndValue, t); - - - - var pos = m_CurrentValue is Vector3 value ? value : default; + var pos = m_CurrentUpdatedValue is Vector3 value ? value : default; Debug.DrawLine(pos, pos + Vector3.up, Color.magenta, 10, false); - return m_CurrentValue; + return m_CurrentUpdatedValue; } public void FixedUpdate(float fixedDeltaTime) @@ -191,20 +93,25 @@ public void AddMeasurement(T newMeasurement, NetworkTime sentTime) var debugPos = newMeasurement is Vector3 value ? value : default; Debug.DrawLine(debugPos, debugPos + Vector3.right + Vector3.up, Color.red, 10, false); - Debug.Log($"Adding measurement {Time.time}"); // todo put limit on size, we don't want lag spikes to create 100 entries and have a list that size in memory for ever - m_Buffer.Add(new BufferedItem() {item = newMeasurement, timeSent = sentTime}); - m_Buffer.Sort((item1, item2) => item2.timeSent.Time.CompareTo(item1.timeSent.Time)); + if (m_Buffer.Count >= k_BufferSizeLimit) + { + Debug.LogWarning("Going over buffer size limit while adding new interpolation values, interpolation buffering isn't consuming fast enough, removing last value now."); + // todo remove oldest item + } + + m_Buffer.Add(new BufferedItem {item = newMeasurement, timeSent = sentTime}); + m_Buffer.Sort((item1, item2) => item2.timeSent.Time.CompareTo(item1.timeSent.Time)); // todo test the reverse, this should actually be the other way } public T GetInterpolatedValue() { - return m_CurrentValue; + return m_CurrentUpdatedValue; } public void Reset(T value, NetworkTime sentTime) { - m_CurrentValue = value; + m_CurrentUpdatedValue = value; m_LerpEndValue = value; m_LerpStartValue = value; } @@ -219,8 +126,6 @@ public void OnDestroy() public class BufferedLinearInterpolatorVector3 : BufferedLinearInterpolator { - public BufferedLinearInterpolatorVector3(IBufferedLinearInterpolatorSettings settings) : base(settings) { } - public override Vector3 Interpolate(Vector3 start, Vector3 end, float time) { return Vector3.Lerp(start, end, time); @@ -229,8 +134,6 @@ public override Vector3 Interpolate(Vector3 start, Vector3 end, float time) public class BufferedLinearInterpolatorQuaternion : BufferedLinearInterpolator { - public BufferedLinearInterpolatorQuaternion(IBufferedLinearInterpolatorSettings settings) : base(settings) { } - public override Quaternion Interpolate(Quaternion start, Quaternion end, float time) { return Quaternion.Slerp(start, end, time); diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/IInterpolator.cs b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/IInterpolator.cs index 827bff7359..eaccaa52b6 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/IInterpolator.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/IInterpolator.cs @@ -4,7 +4,6 @@ namespace Unity.Netcode { public interface IInterpolator { - public void Awake(); public void OnNetworkSpawn(); public void Start(); public void OnEnable(); @@ -15,14 +14,4 @@ public interface IInterpolator public void Reset(T value, NetworkTime sentTime); public void OnDestroy(); } - - public abstract class InterpolatorFactory : ScriptableObject - { - public const string BaseMenuName = "MLAPI/Interpolator/"; - public abstract IInterpolator CreateInterpolator(); - } - - public interface IInterpolatorSettings - { - } } diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolationFactory.cs b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolationFactory.cs index b7b561b815..b15a338346 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolationFactory.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolationFactory.cs @@ -1,25 +1,5 @@ -using UnityEngine; - namespace Unity.Netcode { - [CreateAssetMenu(fileName = "NoInterpolationVector3", menuName = BaseMenuName + "NoInterpolationVector3", order = 1)] - public class NoInterpolationVector3Factory : InterpolatorFactory - { - public override IInterpolator CreateInterpolator() - { - return new NoInterpolation(); - } - } - - [CreateAssetMenu(fileName = "NoInterpolationQuaternion", menuName = BaseMenuName + "NoInterpolationQuaternion", order = 1)] - public class NoInterpolationQuaternionFactory : InterpolatorFactory - { - public override IInterpolator CreateInterpolator() - { - return new NoInterpolation(); - } - } - public class NoInterpolation : IInterpolator { private T m_Current; @@ -60,7 +40,7 @@ public T GetInterpolatedValue() return m_Current; } - public void Reset(T value, NetworkTime SentTick) + public void Reset(T value, NetworkTime sentTick) { m_Current = value; } diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/PositionLinearInterpolatorFactory.cs b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/PositionLinearInterpolatorFactory.cs index 3a24eaf3af..a574c87a92 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/PositionLinearInterpolatorFactory.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/PositionLinearInterpolatorFactory.cs @@ -3,34 +3,14 @@ namespace Unity.Netcode { - [CreateAssetMenu(fileName = "PositionLinearInterpolator", menuName = BaseMenuName + "PositionLinearInterpolator", order = 1)] - public class PositionLinearInterpolatorFactory : InterpolatorFactory + public class PositionSimpleInterpolator : IInterpolator { - [SerializeField] - public float MaxLerpTime = 0.2f; + private float m_CurrentTime; + private Vector3 m_StartVector; + private Vector3 m_EndVector; + private Vector3 m_UpdatedVector; - public override IInterpolator CreateInterpolator() - { - return new PositionLinearInterpolator(this); - } - } - - public class PositionLinearInterpolator : IInterpolator - { - public float m_CurrentTime; - public Vector3 m_StartVector; - public Vector3 m_EndVector; - public Vector3 m_UpdatedVector; - private readonly PositionLinearInterpolatorFactory m_Factory; - - public PositionLinearInterpolator(PositionLinearInterpolatorFactory factory) - { - m_Factory = factory; - } - - public void Awake() - { - } + private const float k_MaxLerpTime = 0.1f; public void OnNetworkSpawn() { @@ -47,7 +27,7 @@ public void OnEnable() public Vector3 Update(float deltaTime) { m_CurrentTime += deltaTime; - m_UpdatedVector = Vector3.Lerp(m_StartVector, m_EndVector, m_CurrentTime / m_Factory.MaxLerpTime); + m_UpdatedVector = Vector3.Lerp(m_StartVector, m_EndVector, m_CurrentTime / k_MaxLerpTime); return GetInterpolatedValue(); } @@ -55,7 +35,7 @@ public void FixedUpdate(float fixedDeltaTime) { } - public void AddMeasurement(Vector3 newMeasurement, NetworkTime SentTick) + public void AddMeasurement(Vector3 newMeasurement, NetworkTime sentTick) { m_EndVector = newMeasurement; m_CurrentTime = 0; @@ -67,7 +47,7 @@ public Vector3 GetInterpolatedValue() return m_UpdatedVector; } - public void Reset(Vector3 value, NetworkTime SentTick) + public void Reset(Vector3 value, NetworkTime sentTick) { m_UpdatedVector = value; } diff --git a/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs b/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs index f8188dd985..e0581d14d7 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs @@ -84,18 +84,58 @@ public void NetworkSerialize(NetworkSerializer serializer) [SerializeField, Range(0, 120), Tooltip("The base amount of sends per seconds to use when range is disabled")] public float FixedSendsPerSecond = 30f; - [SerializeField] - private InterpolatorFactory m_PositionInterpolatorFactory; - - [SerializeField] - private InterpolatorFactory m_RotationInterpolatorFactory; - protected virtual IInterpolator PositionInterpolator { get; set; } - protected virtual IInterpolator RotationInterpolator { get; set; } + protected virtual IInterpolator ScaleInterpolator { get; set; } // public IInterpolator PositionInterpolator = new BufferedLinearInterpolatorVector3(ScriptableObject.CreateInstance()); // todo tmp, use default value instead private Transform m_Transform; // cache the transform component to reduce unnecessary bounce between managed and native + + private Vector3 TransformPosition + { + get + { + if (InLocalSpace) + { + return m_Transform.localPosition; + } + else + { + return m_Transform.position; + } + } + } + + private Quaternion TransformRotation + { + get + { + if (InLocalSpace) + { + return m_Transform.localRotation; + } + else + { + return m_Transform.rotation; + } + } + } + + private Vector3 TransformScale + { + get + { + if (InLocalSpace) + { + return m_Transform.localScale; + } + else + { + return m_Transform.lossyScale; + } + } + } + private readonly NetworkVariable m_NetworkState = new NetworkVariable(new NetworkState()); private NetworkState m_PrevNetworkState; @@ -121,13 +161,13 @@ private bool IsNetworkStateDirty(NetworkState networkState) { isDirty |= networkState.Position != PositionInterpolator.GetInterpolatedValue(); isDirty |= networkState.Rotation != RotationInterpolator.GetInterpolatedValue(); - isDirty |= networkState.Scale != m_Transform.localScale; + isDirty |= networkState.Scale != ScaleInterpolator.GetInterpolatedValue(); } else { isDirty |= networkState.Position != PositionInterpolator.GetInterpolatedValue(); isDirty |= networkState.Rotation != RotationInterpolator.GetInterpolatedValue(); - isDirty |= networkState.Scale != m_Transform.lossyScale; + isDirty |= networkState.Scale != ScaleInterpolator.GetInterpolatedValue(); } return isDirty; @@ -154,8 +194,6 @@ private bool IsTransformDirty() return isDirty; } - private double previousTimeSam; - private Vector3 previousPosSam; private void SendNetworkStateToGhosts(double dirtyTime) { m_NetworkState.Value.InLocalSpace = InLocalSpace; @@ -172,10 +210,6 @@ private void SendNetworkStateToGhosts(double dirtyTime) m_NetworkState.Value.Rotation = m_Transform.rotation; m_NetworkState.Value.Scale = m_Transform.lossyScale; } - Debug.DrawLine(m_NetworkState.Value.Position, m_NetworkState.Value.Position + Vector3.up * 100f * (float) (m_NetworkState.Value.SentTime - previousTimeSam), Color.yellow, 10, false); - Debug.Log($"sam asdf distance {Math.Round((m_NetworkState.Value.Position - previousPosSam).magnitude, 2)} tick diff {m_NetworkState.Value.SentTime - previousTimeSam} sam"); - previousTimeSam = m_NetworkState.Value.SentTime; - previousPosSam = m_NetworkState.Value.Position; m_NetworkState.SetDirty(true); } @@ -185,6 +219,7 @@ private void ApplyNetworkStateFromAuthority(NetworkState netState) netState = new NetworkState(netState); netState.Position = PositionInterpolator.GetInterpolatedValue(); netState.Rotation = RotationInterpolator.GetInterpolatedValue(); + netState.Scale = ScaleInterpolator.GetInterpolatedValue(); InLocalSpace = netState.InLocalSpace; if (InLocalSpace) @@ -205,9 +240,6 @@ private void ApplyNetworkStateFromAuthority(NetworkState netState) m_PrevNetworkState = netState; } - - private int oldTick; - private NetworkState debug_previousStateChanged; private void OnNetworkStateChanged(NetworkState oldState, NetworkState newState) { if (!NetworkObject.IsSpawned) @@ -222,22 +254,16 @@ private void OnNetworkStateChanged(NetworkState oldState, NetworkState newState) return; } - // todo check teleport flag + // todo for teleport, check teleport flag // if (newState.Teleporting) // { // PositionInterpolator.Reset(newState.Position, new NetworkTime(NetworkManager.Singleton.ServerTime.TickRate, newState.SentTick)); // } - // PositionInterpolator.AddMeasurement(newState.Position, NetworkManager.Singleton.ServerTime.Time); - - Debug.Log($"distance sam {Math.Round((newState.Position - oldState.Position).magnitude, 2)}"); - Debug.Log($"diff tick sam {(newState.SentTime - oldState.SentTime, 2)}"); - // oldTick = NetworkManager.Singleton.ServerTime.Tick; - // Debug.DrawLine(newState.Position, newState.Position + Vector3.down + Vector3.left, Color.yellow, 10, false); - debug_previousStateChanged = newState; var sentTime = new NetworkTime(NetworkManager.Singleton.ServerTime.TickRate, newState.SentTime); PositionInterpolator.AddMeasurement(newState.Position, sentTime); RotationInterpolator.AddMeasurement(newState.Rotation, sentTime); + ScaleInterpolator.AddMeasurement(newState.Scale, sentTime); } private void UpdateNetVarPerms() @@ -260,28 +286,10 @@ private void UpdateNetVarPerms() private void Awake() { - //debug, remove me - // Time.maximumDeltaTime = 999f; - m_Transform = transform; - var defaultBufferTime = 0.1f; - if (m_PositionInterpolatorFactory == null) - { - PositionInterpolator = new BufferedLinearInterpolatorVector3(new BufferedLinearInterpolatorSettings {InterpolationTime = defaultBufferTime}); - } - else - { - PositionInterpolator = m_PositionInterpolatorFactory.CreateInterpolator(); - } - - if (m_RotationInterpolatorFactory == null) - { - RotationInterpolator = new BufferedLinearInterpolatorQuaternion(new BufferedLinearInterpolatorSettings {InterpolationTime = defaultBufferTime}); - } - else - { - RotationInterpolator = m_RotationInterpolatorFactory.CreateInterpolator(); - } + PositionInterpolator = new BufferedLinearInterpolatorVector3(); + RotationInterpolator = new BufferedLinearInterpolatorQuaternion(); + ScaleInterpolator = new BufferedLinearInterpolatorVector3(); UpdateNetVarPerms(); @@ -291,20 +299,25 @@ private void Awake() m_NetworkState.OnValueChanged += OnNetworkStateChanged; } + public void Start() + { + PositionInterpolator.Start(); + RotationInterpolator.Start(); + ScaleInterpolator.Start(); + } + public override void OnNetworkSpawn() { m_PrevNetworkState = null; - // if (enabled) // todo Luke fix your UX - // { - // NetworkManager.NetworkTickSystem.Tick += NetworkTickUpdate; - // } var currentTime = new NetworkTime(NetworkManager.Singleton.ServerTime.TickRate, m_NetworkState.Value.SentTime); - PositionInterpolator.Reset(m_Transform.position, currentTime); - RotationInterpolator.Reset(m_Transform.rotation, currentTime); + PositionInterpolator.Reset(TransformPosition, currentTime); + RotationInterpolator.Reset(TransformRotation, currentTime); + ScaleInterpolator.Reset(TransformScale, currentTime); PositionInterpolator.OnNetworkSpawn(); RotationInterpolator.OnNetworkSpawn(); + ScaleInterpolator.OnNetworkSpawn(); } private void OnDestroy() @@ -318,27 +331,16 @@ private void FixedUpdate() { return; } - // if (CanUpdateTransform) - // { - // if (IsTransformDirty()) - // { - // // check for time there was a change to the transform - // m_DirtyTime = NetworkManager.LocalTime.Time; - // } - // - // UpdateNetworkState(); - // } - // else - { - if (IsNetworkStateDirty(m_PrevNetworkState)) - { - Debug.LogWarning("A local change without authority detected, revert back to latest network state!"); - ApplyNetworkStateFromAuthority(m_NetworkState.Value); - } - PositionInterpolator.FixedUpdate(NetworkManager.ServerTime.FixedDeltaTime); - RotationInterpolator.FixedUpdate(NetworkManager.ServerTime.FixedDeltaTime); + if (IsNetworkStateDirty(m_PrevNetworkState)) + { + Debug.LogWarning("A local change without authority detected, revert back to latest network state!"); + ApplyNetworkStateFromAuthority(m_NetworkState.Value); } + + PositionInterpolator.FixedUpdate(NetworkManager.ServerTime.FixedDeltaTime); + RotationInterpolator.FixedUpdate(NetworkManager.ServerTime.FixedDeltaTime); + ScaleInterpolator.FixedUpdate(NetworkManager.ServerTime.FixedDeltaTime); } private int debugOldTime = 0; @@ -361,13 +363,9 @@ private void Update() if (!CanUpdateTransform) { - // Debug.Log("gaga "+Math.Round(Time.time - (float)NetworkManager.Singleton.ServerTime.Time, 2)); - - // Debug.Log($"sam {Math.Round(NetworkManager.Singleton.ServerTime.Time - debugOldTime, 2)}"); - // debugOldTime = NetworkManager.Singleton.ServerTime.Time; - PositionInterpolator.Update(Time.deltaTime); RotationInterpolator.Update(Time.deltaTime); + ScaleInterpolator.Update(Time.deltaTime); ApplyNetworkStateFromAuthority(m_NetworkState.Value); } } diff --git a/testproject/Assets/Scenes/ZooSam.unity b/testproject/Assets/Scenes/ZooSam.unity index 08d6103cb5..4e3172792b 100644 --- a/testproject/Assets/Scenes/ZooSam.unity +++ b/testproject/Assets/Scenes/ZooSam.unity @@ -6195,9 +6195,9 @@ MonoBehaviour: MaxConnectAttempts: 10 channels: [] MessageBufferSize: 5120 - SimulatePacketLossChance: 0 - SimulateMinLatency: 0 - SimulateMaxLatency: 0 + SimulatePacketLossChance: 10 + SimulateMinLatency: 70 + SimulateMaxLatency: 130 --- !u!1001 &627808638 PrefabInstance: m_ObjectHideFlags: 0 @@ -7435,9 +7435,6 @@ MonoBehaviour: Authority: 0 InLocalSpace: 0 FixedSendsPerSecond: 30 - m_PositionInterpolatorFactory: {fileID: 11400000, guid: a882403a7bf6247cd881a093a9a3f537, - type: 2} - m_RotationInterpolatorFactory: {fileID: 0} --- !u!65 &678326396 BoxCollider: m_ObjectHideFlags: 0 @@ -20871,42 +20868,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: df4fbe773fc544428171994e08b0483f, type: 3} m_Name: m_EditorClassIdentifier: - FixedSendsPerSecond: 20 - AssumeSyncedSends: 1 - InterpolatePosition: 1 - SnapDistance: 10 - InterpolateServer: 1 - MinMeters: 0.15 - MinDegrees: 1.5 - ExtrapolatePosition: 0 - MaxSendsToExtrapolate: 5 - Channel: - EnableRange: 0 - EnableNonProvokedResendChecks: 0 - DistanceSendrate: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 20 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 500 - value: 20 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 --- !u!65 &1643885208 BoxCollider: m_ObjectHideFlags: 0 diff --git a/testproject/Assets/MoveInCircle.cs b/testproject/Assets/Scripts/MoveInCircle.cs similarity index 100% rename from testproject/Assets/MoveInCircle.cs rename to testproject/Assets/Scripts/MoveInCircle.cs diff --git a/testproject/Assets/MoveInCircle.cs.meta b/testproject/Assets/Scripts/MoveInCircle.cs.meta similarity index 100% rename from testproject/Assets/MoveInCircle.cs.meta rename to testproject/Assets/Scripts/MoveInCircle.cs.meta diff --git a/testproject/Assets/Scripts/NetworkTransformLegacy.cs b/testproject/Assets/Scripts/NetworkTransformLegacy.cs deleted file mode 100644 index e702a99b27..0000000000 --- a/testproject/Assets/Scripts/NetworkTransformLegacy.cs +++ /dev/null @@ -1,375 +0,0 @@ -using System.Linq; -using System.Collections.Generic; -using MLAPI; -using UnityEngine; -using MLAPI.Messaging; - -namespace Sam -{ - /// - /// A prototype component for syncing transforms - /// - [AddComponentMenu("MLAPI/NetworkTransformLegacy")] - public class NetworkTransformLegacy : NetworkBehaviour - { - internal class ClientSendInfo - { - public float LastSent; - public Vector3? LastMissedPosition; - public Quaternion? LastMissedRotation; - } - - /// - /// The base amount of sends per seconds to use when range is disabled - /// - [Range(0, 120)] - public float FixedSendsPerSecond = 20f; - - /// - /// Is the sends per second assumed to be the same across all instances - /// - [Tooltip("This assumes that the SendsPerSecond is synced across clients")] - public bool AssumeSyncedSends = true; - - /// - /// Enable interpolation - /// - [Tooltip("This requires AssumeSyncedSends to be true")] - public bool InterpolatePosition = true; - - /// - /// The distance before snaping to the position - /// - [Tooltip("The transform will snap if the distance is greater than this distance")] - public float SnapDistance = 10f; - - /// - /// Should the server interpolate - /// - public bool InterpolateServer = true; - - /// - /// The min meters to move before a send is sent - /// - public float MinMeters = 0.15f; - - /// - /// The min degrees to rotate before a send it sent - /// - public float MinDegrees = 1.5f; - - /// - /// Enables extrapolation - /// - public bool ExtrapolatePosition = false; - - /// - /// The maximum amount of expected send rates to extrapolate over when awaiting new packets. - /// A higher value will result in continued extrapolation after an object has stopped moving - /// - public float MaxSendsToExtrapolate = 5; - - /// - /// The channel to send the data on - /// - [Tooltip("The channel to send the data on. Uses the default channel if left unspecified")] - public string Channel = null; - - private float m_LerpTime; - private Vector3 m_LerpStartPos; - private Quaternion m_LerpStartRot; - private Vector3 m_LerpEndPos; - private Quaternion m_LerpEndRot; - - private float m_LastSendTime; - private Vector3 m_LastSentPos; - private Quaternion m_LastSentRot; - - private float m_LastReceiveTime; - - /// - /// Enables range based send rate - /// - public bool EnableRange; - - /// - /// Checks for missed sends without provocation. Provocation being a client inside it's normal SendRate - /// - public bool EnableNonProvokedResendChecks; - - /// - /// The curve to use to calculate the send rate - /// - public AnimationCurve DistanceSendrate = AnimationCurve.Constant(0, 500, 20); - - private readonly Dictionary m_ClientSendInfo = new Dictionary(); - - /// - /// The delegate used to check if a move is valid - /// - /// The client id the move is being validated for - /// The previous position - /// The new requested position - /// Returns Whether or not the move is valid - public delegate bool MoveValidationDelegate(ulong clientId, Vector3 oldPos, Vector3 newPos); - - /// - /// If set, moves will only be accepted if the custom delegate returns true - /// - public MoveValidationDelegate IsMoveValidDelegate = null; - - private void OnValidate() - { - if (!AssumeSyncedSends && InterpolatePosition) - { - InterpolatePosition = false; - } - - if (InterpolateServer && !InterpolatePosition) - { - InterpolateServer = false; - } - - if (MinDegrees < 0) - { - MinDegrees = 0; - } - - if (MinMeters < 0) - { - MinMeters = 0; - } - - if (EnableNonProvokedResendChecks && !EnableRange) - { - EnableNonProvokedResendChecks = false; - } - } - - private float GetTimeForLerp(Vector3 pos1, Vector3 pos2) - { - return 1f / DistanceSendrate.Evaluate(Vector3.Distance(pos1, pos2)); - } - - /// - /// Registers message handlers - /// - public override void OnNetworkSpawn() - { - m_LastSentRot = transform.rotation; - m_LastSentPos = transform.position; - - m_LerpStartPos = transform.position; - m_LerpStartRot = transform.rotation; - - m_LerpEndPos = transform.position; - m_LerpEndRot = transform.rotation; - } - - private void Update() - { - if (IsOwner) - { - if (NetworkManager.LocalTime.FixedTime - m_LastSendTime >= (1f / FixedSendsPerSecond) && (Vector3.Distance(transform.position, m_LastSentPos) > MinMeters || Quaternion.Angle(transform.rotation, m_LastSentRot) > MinDegrees)) - { - m_LastSendTime = (float) NetworkManager.LocalTime.FixedTime; - m_LastSentPos = transform.position; - m_LastSentRot = transform.rotation; - - if (IsServer) - { - ApplyTransformClientRpc(transform.position, transform.rotation.eulerAngles, - new ClientRpcParams { Send = new ClientRpcSendParams { TargetClientIds = NetworkManager.ConnectedClientsList.Where(c => c.ClientId != OwnerClientId).Select(c => c.ClientId).ToArray() } }); - } - else - { - SubmitTransformServerRpc(transform.position, transform.rotation.eulerAngles); - } - } - } - else - { - //If we are server and interpolation is turned on for server OR we are not server and interpolation is turned on - if ((IsServer && InterpolateServer && InterpolatePosition) || (!IsServer && InterpolatePosition)) - { - if (Vector3.Distance(transform.position, m_LerpEndPos) > SnapDistance) - { - //Snap, set T to 1 (100% of the lerp) - m_LerpTime = 1f; - } - - float sendDelay = (IsServer || !EnableRange || !AssumeSyncedSends || NetworkManager.ConnectedClients[NetworkManager.LocalClientId].PlayerObject == null) ? (1f / FixedSendsPerSecond) : GetTimeForLerp(transform.position, NetworkManager.ConnectedClients[NetworkManager.LocalClientId].PlayerObject.transform.position); - m_LerpTime += Time.unscaledDeltaTime / sendDelay; - - if (ExtrapolatePosition && Time.unscaledTime - m_LastReceiveTime < sendDelay * MaxSendsToExtrapolate) - { - transform.position = Vector3.LerpUnclamped(m_LerpStartPos, m_LerpEndPos, m_LerpTime); - } - else - { - transform.position = Vector3.Lerp(m_LerpStartPos, m_LerpEndPos, m_LerpTime); - } - - if (ExtrapolatePosition && Time.unscaledTime - m_LastReceiveTime < sendDelay * MaxSendsToExtrapolate) - { - transform.rotation = Quaternion.SlerpUnclamped(m_LerpStartRot, m_LerpEndRot, m_LerpTime); - } - else - { - transform.rotation = Quaternion.Slerp(m_LerpStartRot, m_LerpEndRot, m_LerpTime); - } - } - } - - if (IsServer && EnableRange && EnableNonProvokedResendChecks) - { - CheckForMissedSends(); - } - } - - [ClientRpc] - private void ApplyTransformClientRpc(Vector3 position, Vector3 eulerAngles, ClientRpcParams rpcParams = default) - { - if (enabled) - { - ApplyTransformInternal(position, Quaternion.Euler(eulerAngles)); - } - } - - private void ApplyTransformInternal(Vector3 position, Quaternion rotation) - { - if (!enabled) - { - return; - } - - if (InterpolatePosition && (!IsServer || InterpolateServer)) - { - m_LastReceiveTime = Time.unscaledTime; - m_LerpStartPos = transform.position; - m_LerpStartRot = transform.rotation; - m_LerpEndPos = position; - m_LerpEndRot = rotation; - m_LerpTime = 0; - } - else - { - transform.position = position; - transform.rotation = rotation; - } - } - - [ServerRpc] - private void SubmitTransformServerRpc(Vector3 position, Vector3 eulerAngles, ServerRpcParams rpcParams = default) - { - if (!enabled) - { - return; - } - - if (IsMoveValidDelegate != null && !IsMoveValidDelegate(rpcParams.Receive.SenderClientId, m_LerpEndPos, position)) - { - //Invalid move! - //TODO: Add rubber band (just a message telling them to go back) - return; - } - - if (!IsClient) - { - // Dedicated server - ApplyTransformInternal(position, Quaternion.Euler(eulerAngles)); - } - - if (EnableRange) - { - for (int i = 0; i < NetworkManager.ConnectedClientsList.Count; i++) - { - if (!m_ClientSendInfo.TryGetValue(NetworkManager.ConnectedClientsList[i].ClientId, out ClientSendInfo info)) - { - info = new ClientSendInfo() { LastMissedPosition = null, LastMissedRotation = null, LastSent = 0 }; - m_ClientSendInfo.Add(NetworkManager.Singleton.ConnectedClientsList[i].ClientId, info); - } - - Vector3? receiverPosition = NetworkManager.Singleton.ConnectedClientsList[i].PlayerObject == null ? null : new Vector3?(NetworkManager.Singleton.ConnectedClientsList[i].PlayerObject.transform.position); - Vector3? senderPosition = NetworkManager.Singleton.ConnectedClients[OwnerClientId].PlayerObject == null ? null : new Vector3?(NetworkManager.Singleton.ConnectedClients[OwnerClientId].PlayerObject.transform.position); - - if ((receiverPosition == null || senderPosition == null && NetworkManager.LocalTime.FixedTime - info.LastSent >= (1f / FixedSendsPerSecond)) || NetworkManager.LocalTime.FixedTime - info.LastSent >= GetTimeForLerp(receiverPosition.Value, senderPosition.Value)) - { - info.LastSent = (float) NetworkManager.LocalTime.FixedTime; - info.LastMissedPosition = null; - info.LastMissedRotation = null; - - ApplyTransformClientRpc(position, eulerAngles, - new ClientRpcParams { Send = new ClientRpcSendParams { TargetClientIds = new[] { NetworkManager.ConnectedClientsList[i].ClientId } } }); - } - else - { - info.LastMissedPosition = position; - info.LastMissedRotation = Quaternion.Euler(eulerAngles); - } - } - } - else - { - ApplyTransformClientRpc(position, eulerAngles, - new ClientRpcParams { Send = new ClientRpcSendParams { TargetClientIds = NetworkManager.ConnectedClientsList.Where(c => c.ClientId != OwnerClientId).Select(c => c.ClientId).ToArray() } }); - } - } - - private void CheckForMissedSends() - { - for (int i = 0; i < NetworkManager.ConnectedClientsList.Count; i++) - { - if (!m_ClientSendInfo.ContainsKey(NetworkManager.ConnectedClientsList[i].ClientId)) - { - m_ClientSendInfo.Add(NetworkManager.ConnectedClientsList[i].ClientId, new ClientSendInfo() - { - LastMissedPosition = null, - LastMissedRotation = null, - LastSent = 0 - }); - } - - ClientSendInfo info = m_ClientSendInfo[NetworkManager.ConnectedClientsList[i].ClientId]; - Vector3? receiverPosition = NetworkManager.ConnectedClientsList[i].PlayerObject == null ? null : new Vector3?(NetworkManager.ConnectedClientsList[i].PlayerObject.transform.position); - Vector3? senderPosition = NetworkManager.ConnectedClients[OwnerClientId].PlayerObject == null ? null : new Vector3?(NetworkManager.ConnectedClients[OwnerClientId].PlayerObject.transform.position); - - if ((receiverPosition == null || senderPosition == null && NetworkManager.LocalTime.FixedTime - info.LastSent >= (1f / FixedSendsPerSecond)) || NetworkManager.LocalTime.FixedTime - info.LastSent >= GetTimeForLerp(receiverPosition.Value, senderPosition.Value)) - { - /* why is this??? ->*/ - Vector3? pos = NetworkManager.ConnectedClients[OwnerClientId].PlayerObject == null ? null : new Vector3?(NetworkManager.ConnectedClients[OwnerClientId].PlayerObject.transform.position); - /* why is this??? ->*/ - Vector3? rot = NetworkManager.ConnectedClients[OwnerClientId].PlayerObject == null ? null : new Vector3?(NetworkManager.ConnectedClients[OwnerClientId].PlayerObject.transform.rotation.eulerAngles); - - if (info.LastMissedPosition != null && info.LastMissedRotation != null) - { - info.LastSent = (float) NetworkManager.LocalTime.FixedTime; - - ApplyTransformClientRpc(info.LastMissedPosition.Value, info.LastMissedRotation.Value.eulerAngles, - new ClientRpcParams { Send = new ClientRpcSendParams { TargetClientIds = new[] { NetworkManager.ConnectedClientsList[i].ClientId } } }); - - info.LastMissedPosition = null; - info.LastMissedRotation = null; - } - } - } - } - - /// - /// Teleports the transform to the given position and rotation - /// - /// The position to teleport to - /// The rotation to teleport to - public void Teleport(Vector3 position, Quaternion rotation) - { - if (InterpolateServer && IsServer || IsClient) - { - m_LerpStartPos = position; - m_LerpStartRot = rotation; - m_LerpEndPos = position; - m_LerpEndRot = rotation; - m_LerpTime = 0; - } - } - } -} \ No newline at end of file diff --git a/testproject/Assets/Scripts/NetworkTransformLegacy.cs.meta b/testproject/Assets/Scripts/NetworkTransformLegacy.cs.meta deleted file mode 100644 index d55a2a45cd..0000000000 --- a/testproject/Assets/Scripts/NetworkTransformLegacy.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: df4fbe773fc544428171994e08b0483f -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: From 4a86539b7c3401e69d26b6dc9562a79ba84f7503 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Wed, 11 Aug 2021 15:43:52 -0400 Subject: [PATCH 013/113] renames --- ...erpolatorVector3Factory.cs => BufferedLinearInterpolator.cs} | 0 ...ector3Factory.cs.meta => BufferedLinearInterpolator.cs.meta} | 2 +- ...sitionLinearInterpolatorFactory.cs => SimpleInterpolator.cs} | 2 +- ...arInterpolatorFactory.cs.meta => SimpleInterpolator.cs.meta} | 2 +- 4 files changed, 3 insertions(+), 3 deletions(-) rename com.unity.multiplayer.mlapi/Prototyping/Interpolator/{BufferedLinearInterpolatorVector3Factory.cs => BufferedLinearInterpolator.cs} (100%) rename com.unity.multiplayer.mlapi/Prototyping/Interpolator/{BufferedLinearInterpolatorVector3Factory.cs.meta => BufferedLinearInterpolator.cs.meta} (83%) rename com.unity.multiplayer.mlapi/Prototyping/Interpolator/{PositionLinearInterpolatorFactory.cs => SimpleInterpolator.cs} (95%) rename com.unity.multiplayer.mlapi/Prototyping/Interpolator/{PositionLinearInterpolatorFactory.cs.meta => SimpleInterpolator.cs.meta} (83%) diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3Factory.cs b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolator.cs similarity index 100% rename from com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3Factory.cs rename to com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolator.cs diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3Factory.cs.meta b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolator.cs.meta similarity index 83% rename from com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3Factory.cs.meta rename to com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolator.cs.meta index 957c278840..88cd4890fb 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3Factory.cs.meta +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolator.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 199dd81621cd441c19cc731e8d29a217 +guid: a12ebf95bdb4445d9a16e4b6adadb6aa MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/PositionLinearInterpolatorFactory.cs b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/SimpleInterpolator.cs similarity index 95% rename from com.unity.multiplayer.mlapi/Prototyping/Interpolator/PositionLinearInterpolatorFactory.cs rename to com.unity.multiplayer.mlapi/Prototyping/Interpolator/SimpleInterpolator.cs index a574c87a92..5e5b8768a5 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/PositionLinearInterpolatorFactory.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/SimpleInterpolator.cs @@ -3,7 +3,7 @@ namespace Unity.Netcode { - public class PositionSimpleInterpolator : IInterpolator + public class SimpleInterpolatorVector3 : IInterpolator { private float m_CurrentTime; private Vector3 m_StartVector; diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/PositionLinearInterpolatorFactory.cs.meta b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/SimpleInterpolator.cs.meta similarity index 83% rename from com.unity.multiplayer.mlapi/Prototyping/Interpolator/PositionLinearInterpolatorFactory.cs.meta rename to com.unity.multiplayer.mlapi/Prototyping/Interpolator/SimpleInterpolator.cs.meta index 634ea8c755..7856461e9c 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/PositionLinearInterpolatorFactory.cs.meta +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/SimpleInterpolator.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: d27105c543ddf4083b4918635b19348a +guid: 461703a2c7500460db78a7231310592b MonoImporter: externalObjects: {} serializedVersion: 2 From 2cdbb1b67b1a0b829b3a2d4e5b49a1feba2eb2de Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Wed, 11 Aug 2021 15:58:21 -0400 Subject: [PATCH 014/113] # --- .../Interpolator/BufferedLinearInterpolator.cs | 16 +++++----------- .../Prototyping/NetworkTransform.cs | 11 +++++++++++ 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolator.cs b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolator.cs index 27795572a1..2371839df4 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolator.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolator.cs @@ -41,7 +41,7 @@ public void OnNetworkSpawn() private void TryConsumeFromBuffer() { int nbConsumed = 0; - // sorted so newer (bigger) time values are at the beginning. + // sorted so older (smaller) time values are at the end. for (int i = m_Buffer.Count - 1; i >= 0; i--) { var bufferedValue = m_Buffer[i]; @@ -79,8 +79,6 @@ public T Update(float deltaTime) float t = (float)((renderTime - timeA.Time) / range); m_CurrentUpdatedValue = Interpolate(m_LerpStartValue, m_LerpEndValue, t); - var pos = m_CurrentUpdatedValue is Vector3 value ? value : default; - Debug.DrawLine(pos, pos + Vector3.up, Color.magenta, 10, false); return m_CurrentUpdatedValue; } @@ -90,18 +88,14 @@ public void FixedUpdate(float fixedDeltaTime) public void AddMeasurement(T newMeasurement, NetworkTime sentTime) { - var debugPos = newMeasurement is Vector3 value ? value : default; - Debug.DrawLine(debugPos, debugPos + Vector3.right + Vector3.up, Color.red, 10, false); - - // todo put limit on size, we don't want lag spikes to create 100 entries and have a list that size in memory for ever - if (m_Buffer.Count >= k_BufferSizeLimit) + if (m_Buffer.Count > k_BufferSizeLimit) { - Debug.LogWarning("Going over buffer size limit while adding new interpolation values, interpolation buffering isn't consuming fast enough, removing last value now."); - // todo remove oldest item + Debug.LogWarning("Going over buffer size limit while adding new interpolation values, interpolation buffering isn't consuming fast enough, removing oldest value now."); + m_Buffer.RemoveAt(m_Buffer.Count - 1); } m_Buffer.Add(new BufferedItem {item = newMeasurement, timeSent = sentTime}); - m_Buffer.Sort((item1, item2) => item2.timeSent.Time.CompareTo(item1.timeSent.Time)); // todo test the reverse, this should actually be the other way + m_Buffer.Sort((item1, item2) => item2.timeSent.Time.CompareTo(item1.timeSent.Time)); } public T GetInterpolatedValue() diff --git a/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs b/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs index e0581d14d7..142657e417 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs @@ -306,6 +306,13 @@ public void Start() ScaleInterpolator.Start(); } + public void OnEnable() + { + PositionInterpolator.OnEnable(); + RotationInterpolator.OnEnable(); + ScaleInterpolator.OnEnable(); + } + public override void OnNetworkSpawn() { m_PrevNetworkState = null; @@ -323,6 +330,10 @@ public override void OnNetworkSpawn() private void OnDestroy() { m_NetworkState.OnValueChanged -= OnNetworkStateChanged; + + PositionInterpolator.OnDestroy(); + RotationInterpolator.OnDestroy(); + ScaleInterpolator.OnDestroy(); } private void FixedUpdate() From 07c3d07224e7f817327ca286b5e27d80ffa2246c Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Wed, 11 Aug 2021 19:05:28 -0400 Subject: [PATCH 015/113] # --- .../BufferedLinearInterpolator.cs | 1 - .../BufferedLinearInterpolatorVector3.asset | 15 -- ...fferedLinearInterpolatorVector3.asset.meta | 8 - .../Prototyping/NetworkTransform.cs | 30 ++-- testproject/Assets/Scenes/ZooSam.unity | 153 +----------------- 5 files changed, 19 insertions(+), 188 deletions(-) delete mode 100644 com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3.asset delete mode 100644 com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3.asset.meta diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolator.cs b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolator.cs index 2371839df4..590b91f8e4 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolator.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolator.cs @@ -112,7 +112,6 @@ public void Reset(T value, NetworkTime sentTime) public void OnDestroy() { - throw new System.NotImplementedException(); } public abstract T Interpolate(T start, T end, float time); diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3.asset b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3.asset deleted file mode 100644 index 82227544b1..0000000000 --- a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3.asset +++ /dev/null @@ -1,15 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!114 &11400000 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 199dd81621cd441c19cc731e8d29a217, type: 3} - m_Name: BufferedLinearInterpolatorVector3 - m_EditorClassIdentifier: - InterpolationTime: 0.1 diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3.asset.meta b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3.asset.meta deleted file mode 100644 index e43ac9cd50..0000000000 --- a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolatorVector3.asset.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: a882403a7bf6247cd881a093a9a3f537 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 11400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs b/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs index 142657e417..31a84bf42c 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs @@ -1,5 +1,4 @@ using System; -using Unity.Netcode; using UnityEngine; namespace Unity.Netcode.Prototyping @@ -66,8 +65,8 @@ public void NetworkSerialize(NetworkSerializer serializer) /// The network channel to use send updates /// [Tooltip("The network channel to use send updates")] - private NetworkChannel Channel = NetworkChannel.SyncChannel; - // private NetworkChannel Channel = NetworkChannel.PositionUpdate; + // private NetworkChannel Channel = NetworkChannel.SyncChannel; + private NetworkChannel Channel = NetworkChannel.PositionUpdate; /// /// Sets whether this transform should sync in local space or in world space. @@ -87,7 +86,6 @@ public void NetworkSerialize(NetworkSerializer serializer) protected virtual IInterpolator PositionInterpolator { get; set; } protected virtual IInterpolator RotationInterpolator { get; set; } protected virtual IInterpolator ScaleInterpolator { get; set; } - // public IInterpolator PositionInterpolator = new BufferedLinearInterpolatorVector3(ScriptableObject.CreateInstance()); // todo tmp, use default value instead private Transform m_Transform; // cache the transform component to reduce unnecessary bounce between managed and native @@ -216,28 +214,26 @@ private void SendNetworkStateToGhosts(double dirtyTime) private void ApplyNetworkStateFromAuthority(NetworkState netState) { - netState = new NetworkState(netState); - netState.Position = PositionInterpolator.GetInterpolatedValue(); - netState.Rotation = RotationInterpolator.GetInterpolatedValue(); - netState.Scale = ScaleInterpolator.GetInterpolatedValue(); - InLocalSpace = netState.InLocalSpace; if (InLocalSpace) { - m_Transform.localPosition = netState.Position; - m_Transform.localRotation = netState.Rotation; - m_Transform.localScale = netState.Scale; + m_Transform.localPosition = PositionInterpolator.GetInterpolatedValue(); + m_Transform.localRotation = RotationInterpolator.GetInterpolatedValue(); + m_Transform.localScale = ScaleInterpolator.GetInterpolatedValue(); } else { - m_Transform.position = netState.Position; - m_Transform.rotation = netState.Rotation; + m_Transform.position = PositionInterpolator.GetInterpolatedValue(); + m_Transform.rotation = RotationInterpolator.GetInterpolatedValue(); m_Transform.localScale = Vector3.one; var lossyScale = m_Transform.lossyScale; - m_Transform.localScale = new Vector3(netState.Scale.x / lossyScale.x, netState.Scale.y / lossyScale.y, netState.Scale.z / lossyScale.z); + m_Transform.localScale = new Vector3(ScaleInterpolator.GetInterpolatedValue().x / lossyScale.x, ScaleInterpolator.GetInterpolatedValue().y / lossyScale.y, ScaleInterpolator.GetInterpolatedValue().z / lossyScale.z); } m_PrevNetworkState = netState; + m_PrevNetworkState.Position = PositionInterpolator.GetInterpolatedValue(); + m_PrevNetworkState.Rotation = RotationInterpolator.GetInterpolatedValue(); + m_PrevNetworkState.Scale = ScaleInterpolator.GetInterpolatedValue(); } private void OnNetworkStateChanged(NetworkState oldState, NetworkState newState) @@ -345,7 +341,7 @@ private void FixedUpdate() if (IsNetworkStateDirty(m_PrevNetworkState)) { - Debug.LogWarning("A local change without authority detected, revert back to latest network state!"); + Debug.LogWarning("A local change without authority detected, revert back to latest network state!", this); ApplyNetworkStateFromAuthority(m_NetworkState.Value); } @@ -354,8 +350,6 @@ private void FixedUpdate() ScaleInterpolator.FixedUpdate(NetworkManager.ServerTime.FixedDeltaTime); } - private int debugOldTime = 0; - private void Update() { if (!NetworkObject.IsSpawned) diff --git a/testproject/Assets/Scenes/ZooSam.unity b/testproject/Assets/Scenes/ZooSam.unity index 4e3172792b..6225835beb 100644 --- a/testproject/Assets/Scenes/ZooSam.unity +++ b/testproject/Assets/Scenes/ZooSam.unity @@ -3672,7 +3672,7 @@ Transform: m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 6 + m_RootOrder: 5 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &351881178 GameObject: @@ -6187,6 +6187,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: db28424c2ae12f64da25c9ecccded6b1, type: 3} m_Name: m_EditorClassIdentifier: + m_ChannelsCache: [] Port: 7777 Address: 127.0.0.1 PingInterval: 1 @@ -6198,6 +6199,8 @@ MonoBehaviour: SimulatePacketLossChance: 10 SimulateMinLatency: 70 SimulateMaxLatency: 130 + m_MessageBuffer: [] + m_HostType: 0 --- !u!1001 &627808638 PrefabInstance: m_ObjectHideFlags: 0 @@ -7268,7 +7271,7 @@ Transform: m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 8 + m_RootOrder: 7 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &674940303 GameObject: @@ -7510,7 +7513,7 @@ Transform: m_Children: - {fileID: 702051986} m_Father: {fileID: 0} - m_RootOrder: 5 + m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &680150732 GameObject: @@ -8644,7 +8647,7 @@ Transform: - {fileID: 398540133} - {fileID: 1399839515} m_Father: {fileID: 0} - m_RootOrder: 7 + m_RootOrder: 6 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &731245575 GameObject: @@ -20834,148 +20837,6 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1633292495} m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &1643885206 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1643885211} - - component: {fileID: 1643885210} - - component: {fileID: 1643885209} - - component: {fileID: 1643885208} - - component: {fileID: 1643885207} - - component: {fileID: 1643885212} - - component: {fileID: 1643885213} - m_Layer: 0 - m_Name: NetworkTransformLegacy - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!114 &1643885207 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1643885206} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: df4fbe773fc544428171994e08b0483f, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!65 &1643885208 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1643885206} - 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 &1643885209 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1643885206} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - 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 &1643885210 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1643885206} - m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!4 &1643885211 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1643885206} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -10.29, y: 1.55, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 4 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1643885212 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1643885206} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} - m_Name: - m_EditorClassIdentifier: - GlobalObjectIdHash: 3638589847 - AlwaysReplicateAsRoot: 0 - DontDestroyWithOwner: 0 - AutoObjectParentSync: 1 ---- !u!114 &1643885213 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1643885206} - m_Enabled: 0 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 307c40a41954948e7a36bb6b64b4b9cb, type: 3} - m_Name: - m_EditorClassIdentifier: - m_MoveSpeed: 5 - m_RotationSpeed: 30 - runServerOnly: 0 - runInUpdate: 0 --- !u!1 &1659076779 GameObject: m_ObjectHideFlags: 0 From f6290e0d510f760f0cb9a64423e321a3a584b202 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Fri, 13 Aug 2021 15:42:14 -0400 Subject: [PATCH 016/113] cleanup --- .gitignore | 1 - .../Prototyping/NetworkTransform.cs | 42 +++++++------------ .../Runtime/Core/NetworkManager.cs | 4 +- .../NetworkConfigurationException.cs | 2 +- .../Messaging/InternalMessageHandler.cs | 1 - .../Runtime/Timing/NetworkTimeSystem.cs | 20 ++++++++- .../Runtime/Timing/TimeMultiInstanceTest.cs | 9 ---- testproject/Assets/Scripts/MoveInCircle.cs | 37 +++++++--------- testproject/Packages/manifest.json | 2 - testproject/Packages/packages-lock.json | 14 ------- .../ProjectSettings/EditorBuildSettings.asset | 6 +-- 11 files changed, 58 insertions(+), 80 deletions(-) diff --git a/.gitignore b/.gitignore index 3ea975c7b4..2f5d1d5be4 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,3 @@ .vs .vscode .idea -testproject_clone_0 diff --git a/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs b/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs index 31a84bf42c..f019c14db1 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs @@ -31,19 +31,6 @@ private class NetworkState : INetworkSerializable public double SentTime; - public NetworkState(NetworkState copy) - { - InLocalSpace = copy.InLocalSpace; - Position = copy.Position; - Rotation = copy.Rotation; - Scale = copy.Scale; - SentTime = copy.SentTime; - } - - public NetworkState() - { - } - public void NetworkSerialize(NetworkSerializer serializer) { serializer.Serialize(ref InLocalSpace); @@ -65,7 +52,6 @@ public void NetworkSerialize(NetworkSerializer serializer) /// The network channel to use send updates /// [Tooltip("The network channel to use send updates")] - // private NetworkChannel Channel = NetworkChannel.SyncChannel; private NetworkChannel Channel = NetworkChannel.PositionUpdate; /// @@ -145,7 +131,7 @@ private Vector3 TransformScale Authority == NetworkAuthority.Server && IsServer || Authority == NetworkAuthority.Shared; - private bool IsNetworkStateDirty(NetworkState networkState) + private bool IsGhostStateDirty(NetworkState networkState) { if (networkState == null) { @@ -171,7 +157,8 @@ private bool IsNetworkStateDirty(NetworkState networkState) return isDirty; } - private bool IsTransformDirty() + // Is the non-interpolated authoritative state dirty? + private bool IsAuthoritativeTransformDirty() { bool isDirty = false; var networkState = m_NetworkState.Value; @@ -212,7 +199,7 @@ private void SendNetworkStateToGhosts(double dirtyTime) m_NetworkState.SetDirty(true); } - private void ApplyNetworkStateFromAuthority(NetworkState netState) + private void ApplyInterpolatedStateFromAuthority(NetworkState netState) { InLocalSpace = netState.InLocalSpace; if (InLocalSpace) @@ -339,15 +326,18 @@ private void FixedUpdate() return; } - if (IsNetworkStateDirty(m_PrevNetworkState)) + if (!CanUpdateTransform) { - Debug.LogWarning("A local change without authority detected, revert back to latest network state!", this); - ApplyNetworkStateFromAuthority(m_NetworkState.Value); - } + if (IsGhostStateDirty(m_PrevNetworkState)) + { + Debug.LogWarning("A local change without authority detected, revert back to latest network state!", this); + ApplyInterpolatedStateFromAuthority(m_NetworkState.Value); + } - PositionInterpolator.FixedUpdate(NetworkManager.ServerTime.FixedDeltaTime); - RotationInterpolator.FixedUpdate(NetworkManager.ServerTime.FixedDeltaTime); - ScaleInterpolator.FixedUpdate(NetworkManager.ServerTime.FixedDeltaTime); + PositionInterpolator.FixedUpdate(NetworkManager.ServerTime.FixedDeltaTime); + RotationInterpolator.FixedUpdate(NetworkManager.ServerTime.FixedDeltaTime); + ScaleInterpolator.FixedUpdate(NetworkManager.ServerTime.FixedDeltaTime); + } } private void Update() @@ -359,7 +349,7 @@ private void Update() if (CanUpdateTransform) { - if (IsTransformDirty()) + if (IsAuthoritativeTransformDirty()) { // check for time there was a change to the transform SendNetworkStateToGhosts(NetworkManager.LocalTime.Time); @@ -371,7 +361,7 @@ private void Update() PositionInterpolator.Update(Time.deltaTime); RotationInterpolator.Update(Time.deltaTime); ScaleInterpolator.Update(Time.deltaTime); - ApplyNetworkStateFromAuthority(m_NetworkState.Value); + ApplyInterpolatedStateFromAuthority(m_NetworkState.Value); } } diff --git a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs index 7222fc0612..770b97cc90 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs @@ -41,6 +41,8 @@ public class NetworkManager : MonoBehaviour, INetworkUpdateSystem, IProfilableTr private const double k_TimeSyncFrequency = 1.0d; // sync every second, TODO will be removed once timesync is done via snapshots + private const float k_DefaultBufferSizeSec = 0.05f; + internal MessageQueueContainer MessageQueueContainer { get; private set; } @@ -418,7 +420,7 @@ private void Initialize(bool server) } else { - NetworkTimeSystem = new NetworkTimeSystem(1.0 / NetworkConfig.TickRate, 3.0 / NetworkConfig.TickRate, 0.2); + NetworkTimeSystem = new NetworkTimeSystem(1.0 / NetworkConfig.TickRate, k_DefaultBufferSizeSec, 0.2); } NetworkTickSystem = new NetworkTickSystem(NetworkConfig.TickRate, 0, 0); diff --git a/com.unity.multiplayer.mlapi/Runtime/Exceptions/NetworkConfigurationException.cs b/com.unity.multiplayer.mlapi/Runtime/Exceptions/NetworkConfigurationException.cs index a710ac64e2..3e1efd276b 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Exceptions/NetworkConfigurationException.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Exceptions/NetworkConfigurationException.cs @@ -3,7 +3,7 @@ namespace Unity.Netcode { /// - /// Exception thrown when the operation can only be done on the server + /// Exception thrown when a change to a configuration is wrong /// public class NetworkConfigurationException : Exception { diff --git a/com.unity.multiplayer.mlapi/Runtime/Messaging/InternalMessageHandler.cs b/com.unity.multiplayer.mlapi/Runtime/Messaging/InternalMessageHandler.cs index 8252d65654..59134a528d 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Messaging/InternalMessageHandler.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Messaging/InternalMessageHandler.cs @@ -251,7 +251,6 @@ public void HandleDestroyObjects(ulong clientId, Stream stream) public void HandleTimeSync(ulong clientId, Stream stream) { - // Assert.IsTrue(clientId == NetworkManager.ServerClientId); using (var reader = PooledNetworkReader.Get(stream)) { int tick = reader.ReadInt32Packed(); diff --git a/com.unity.multiplayer.mlapi/Runtime/Timing/NetworkTimeSystem.cs b/com.unity.multiplayer.mlapi/Runtime/Timing/NetworkTimeSystem.cs index 4717730e39..95969b7ca9 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Timing/NetworkTimeSystem.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Timing/NetworkTimeSystem.cs @@ -24,11 +24,29 @@ public class NetworkTimeSystem /// public double LocalBufferSec { get; set; } + private double m_ServerBufferSec; + /// /// Gets or sets the amount of the time in seconds the client should buffer incoming messages from the server. This increases server time. /// A higher value increases latency but makes the game look more smooth in bad networking conditions. + /// This value must be higher than the tick length. /// - public double ServerBufferSec { get; set; } + public double ServerBufferSec + { + get + { + return m_ServerBufferSec; + } + set + { + if (value < 0f || value < 1f / NetworkManager.Singleton.NetworkConfig.TickRate) + { + throw new NetworkConfigurationException("Error setting buffer size, buffer time needs to be bigger than the tick length and bigger than zero"); + } + + m_ServerBufferSec = value; + } + } /// /// Gets or sets a threshold in seconds used to force a hard catchup of network time. diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/Timing/TimeMultiInstanceTest.cs b/com.unity.multiplayer.mlapi/Tests/Runtime/Timing/TimeMultiInstanceTest.cs index 14238c1775..98330b286d 100644 --- a/com.unity.multiplayer.mlapi/Tests/Runtime/Timing/TimeMultiInstanceTest.cs +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/Timing/TimeMultiInstanceTest.cs @@ -39,15 +39,6 @@ private void UpdateTimeStates(NetworkManager[] networkManagers) m_Client2State = new NetworkTimeState(secondClient); } - [UnityTest] - public IEnumerator TestSam() - { - yield return StartSomeClientsAndServerWithPlayersCustom(true, NbClients, 60, 30); - - - - } - [UnityTest] [TestCase(60, 30, ExpectedResult = null)] [TestCase(30, 30, ExpectedResult = null)] diff --git a/testproject/Assets/Scripts/MoveInCircle.cs b/testproject/Assets/Scripts/MoveInCircle.cs index 1af7460ad3..e37f898d52 100644 --- a/testproject/Assets/Scripts/MoveInCircle.cs +++ b/testproject/Assets/Scripts/MoveInCircle.cs @@ -10,40 +10,35 @@ public class MoveInCircle : NetworkBehaviour [SerializeField] private float m_RotationSpeed = 30; - public bool runServerOnly; - public bool runInUpdate; - - private Vector3 debug_oldPosition; - - // public override void OnNetworkSpawn() - // { - // base.OnNetworkSpawn();// - // NetworkManager.NetworkTickSystem.Tick += NetworkTickUpdate; - // } + [SerializeField] + private bool m_RunServerOnly; + [SerializeField] + private bool m_RunInUpdate; - private float lastTime; + private Vector3 m_DebugOldPosition; + private float m_DebugLastTime; void FixedUpdate() { - if (runInUpdate) return; + if (m_RunInUpdate) return; Tick(Time.fixedDeltaTime); } + private void Update() + { + if (!m_RunInUpdate) return; + Tick(Time.deltaTime); + } + void Tick(float deltaTime) { - if (NetworkManager.Singleton.IsServer || !runServerOnly) + if (NetworkManager.Singleton.IsServer || !m_RunServerOnly) { - debug_oldPosition = transform.position; + m_DebugOldPosition = transform.position; transform.position = transform.position + transform.forward * (m_MoveSpeed * deltaTime); // Debug.Log($"ewqqwe {Math.Round((transform.position - debug_oldPosition).magnitude, 2)} time diff {Math.Round(Time.time - lastTime, 2)}"); - lastTime = Time.time; + m_DebugLastTime = Time.time; transform.Rotate(0, m_RotationSpeed * deltaTime, 0); } } - - private void Update() - { - if (!runInUpdate) return; - Tick(Time.deltaTime); - } } diff --git a/testproject/Packages/manifest.json b/testproject/Packages/manifest.json index d05a83f7ce..4bc3118fdb 100644 --- a/testproject/Packages/manifest.json +++ b/testproject/Packages/manifest.json @@ -6,8 +6,6 @@ "com.unity.ide.vscode": "1.2.3", "com.unity.multiplayer.mlapi": "file:../../com.unity.multiplayer.mlapi", "com.unity.multiplayer.transport.utp": "file:../../com.unity.multiplayer.transport.utp", - "com.veriorpies.parrelsync": "https://github.com/VeriorPies/ParrelSync.git?path=/ParrelSync", - "com.mlapi.contrib.transport.litenetlib": "https://github.com/Unity-Technologies/mlapi-community-contributions.git?path=/Transports/com.mlapi.contrib.transport.litenetlib#temp/lnl-develop", "com.unity.package-validation-suite": "0.19.2-preview", "com.unity.test-framework": "1.1.27", "com.unity.test-framework.performance": "2.3.1-preview", diff --git a/testproject/Packages/packages-lock.json b/testproject/Packages/packages-lock.json index 567640d458..bc2860bfca 100644 --- a/testproject/Packages/packages-lock.json +++ b/testproject/Packages/packages-lock.json @@ -1,12 +1,5 @@ { "dependencies": { - "com.mlapi.contrib.transport.litenetlib": { - "version": "https://github.com/Unity-Technologies/mlapi-community-contributions.git?path=/Transports/com.mlapi.contrib.transport.litenetlib#temp/lnl-develop", - "depth": 0, - "source": "git", - "dependencies": {}, - "hash": "46fed6057bc79103e75446eca7b0f69b65ccf16e" - }, "com.unity.burst": { "version": "1.3.2", "depth": 3, @@ -187,13 +180,6 @@ "com.unity.modules.imgui": "1.0.0" } }, - "com.veriorpies.parrelsync": { - "version": "https://github.com/VeriorPies/ParrelSync.git?path=/ParrelSync", - "depth": 0, - "source": "git", - "dependencies": {}, - "hash": "bb3d5067e49e403d8b8ba15c036d313b4dd2c696" - }, "com.unity.modules.ai": { "version": "1.0.0", "depth": 0, diff --git a/testproject/ProjectSettings/EditorBuildSettings.asset b/testproject/ProjectSettings/EditorBuildSettings.asset index c21a729381..03433f2219 100644 --- a/testproject/ProjectSettings/EditorBuildSettings.asset +++ b/testproject/ProjectSettings/EditorBuildSettings.asset @@ -5,12 +5,12 @@ EditorBuildSettings: m_ObjectHideFlags: 0 serializedVersion: 2 m_Scenes: - - enabled: 1 - path: Assets/Scenes/ZooSam.unity - guid: 4683469c9a191411fbda5e426765b2fc - enabled: 1 path: Assets/MainMenu.unity guid: 21c7fd68cda9dd9488fc0cc01f885e39 + - enabled: 1 + path: Assets/Scenes/ZooSam.unity + guid: 4683469c9a191411fbda5e426765b2fc - enabled: 1 path: Assets/Samples/SamplesMenu.unity guid: 037562c9b1a469f498dfb34256ddf86f From c4923495c26be4e55bec9e95e442e29864515263 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Fri, 13 Aug 2021 15:45:05 -0400 Subject: [PATCH 017/113] # --- testproject/Assets/Scenes/ZooSam.unity | 37 ++++---------------------- 1 file changed, 5 insertions(+), 32 deletions(-) diff --git a/testproject/Assets/Scenes/ZooSam.unity b/testproject/Assets/Scenes/ZooSam.unity index 6225835beb..2b162bd325 100644 --- a/testproject/Assets/Scenes/ZooSam.unity +++ b/testproject/Assets/Scenes/ZooSam.unity @@ -6085,7 +6085,6 @@ GameObject: - component: {fileID: 620561612} - component: {fileID: 620561611} - component: {fileID: 620561610} - - component: {fileID: 620561613} m_Layer: 0 m_Name: NetworkManager m_TagString: Untagged @@ -6175,32 +6174,6 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &620561613 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 620561609} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: db28424c2ae12f64da25c9ecccded6b1, type: 3} - m_Name: - m_EditorClassIdentifier: - m_ChannelsCache: [] - Port: 7777 - Address: 127.0.0.1 - PingInterval: 1 - DisconnectTimeout: 5 - ReconnectDelay: 0.5 - MaxConnectAttempts: 10 - channels: [] - MessageBufferSize: 5120 - SimulatePacketLossChance: 10 - SimulateMinLatency: 70 - SimulateMaxLatency: 130 - m_MessageBuffer: [] - m_HostType: 0 --- !u!1001 &627808638 PrefabInstance: m_ObjectHideFlags: 0 @@ -7195,8 +7168,8 @@ MonoBehaviour: m_EditorClassIdentifier: m_MoveSpeed: 5 m_RotationSpeed: 30 - runServerOnly: 0 - runInUpdate: 1 + m_RunServerOnly: 0 + m_RunInUpdate: 0 --- !u!65 &674930890 BoxCollider: m_ObjectHideFlags: 0 @@ -7405,8 +7378,8 @@ MonoBehaviour: m_EditorClassIdentifier: m_MoveSpeed: 5 m_RotationSpeed: 30 - runServerOnly: 1 - runInUpdate: 0 + m_RunServerOnly: 0 + m_RunInUpdate: 0 --- !u!114 &678326394 MonoBehaviour: m_ObjectHideFlags: 0 @@ -7419,7 +7392,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} m_Name: m_EditorClassIdentifier: - GlobalObjectIdHash: 3301752843 + GlobalObjectIdHash: 162145450 AlwaysReplicateAsRoot: 0 DontDestroyWithOwner: 0 AutoObjectParentSync: 1 From 6b6c5cabe1d793354199ced5ce8551ac021913c1 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Fri, 13 Aug 2021 15:52:06 -0400 Subject: [PATCH 018/113] # --- .../Runtime/Core/NetworkManager.cs | 2 +- .../Runtime/Timing/NetworkTimeSystem.cs | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs index 770b97cc90..019512e85f 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs @@ -41,7 +41,7 @@ public class NetworkManager : MonoBehaviour, INetworkUpdateSystem, IProfilableTr private const double k_TimeSyncFrequency = 1.0d; // sync every second, TODO will be removed once timesync is done via snapshots - private const float k_DefaultBufferSizeSec = 0.05f; + private const float k_DefaultBufferSizeSec = 0.05f; // todo talk with UX/Product, find good default value for this internal MessageQueueContainer MessageQueueContainer { get; private set; } diff --git a/com.unity.multiplayer.mlapi/Runtime/Timing/NetworkTimeSystem.cs b/com.unity.multiplayer.mlapi/Runtime/Timing/NetworkTimeSystem.cs index 95969b7ca9..94245f269e 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Timing/NetworkTimeSystem.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Timing/NetworkTimeSystem.cs @@ -1,4 +1,5 @@ using System; +using UnityEngine; namespace Unity.Netcode { @@ -41,7 +42,8 @@ public double ServerBufferSec { if (value < 0f || value < 1f / NetworkManager.Singleton.NetworkConfig.TickRate) { - throw new NetworkConfigurationException("Error setting buffer size, buffer time needs to be bigger than the tick length and bigger than zero"); + Debug.LogError($"Error setting buffer size to {value}, buffer time needs to be bigger than the tick length and bigger than zero. Setting value to minimum buffer size: {MinBufferSizeSec}"); + value = MinBufferSizeSec; } m_ServerBufferSec = value; @@ -66,6 +68,8 @@ public double ServerBufferSec internal double LastSyncedRttSec { get; private set; } + public static double MinBufferSizeSec => 1f / NetworkManager.Singleton.NetworkConfig.TickRate; + public NetworkTimeSystem(double localBufferSec, double serverBufferSec, double hardResetThresholdSec, double adjustmentRatio = 0.01d) { LocalBufferSec = localBufferSec; @@ -81,7 +85,7 @@ public NetworkTimeSystem(double localBufferSec, double serverBufferSec, double h /// The instance. public static NetworkTimeSystem ServerTimeSystem() { - return new NetworkTimeSystem(0, 0, double.MaxValue); + return new NetworkTimeSystem(0, MinBufferSizeSec, double.MaxValue); } /// From 890420e10356f0169ceceec7a267ab47fcc4a9b7 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Fri, 13 Aug 2021 16:24:25 -0400 Subject: [PATCH 019/113] # --- .../BufferedLinearInterpolator.cs | 37 +++++---- testproject/Assets/Materials/Black.mat | 78 +++++++++++++++++++ testproject/Assets/Materials/Black.mat.meta | 8 ++ testproject/Assets/Materials/Brown.mat | 78 +++++++++++++++++++ testproject/Assets/Materials/Brown.mat.meta | 8 ++ testproject/Assets/Materials/Green.mat | 78 +++++++++++++++++++ testproject/Assets/Materials/Green.mat.meta | 8 ++ 7 files changed, 276 insertions(+), 19 deletions(-) create mode 100644 testproject/Assets/Materials/Black.mat create mode 100644 testproject/Assets/Materials/Black.mat.meta create mode 100644 testproject/Assets/Materials/Brown.mat create mode 100644 testproject/Assets/Materials/Brown.mat.meta create mode 100644 testproject/Assets/Materials/Green.mat create mode 100644 testproject/Assets/Materials/Green.mat.meta diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolator.cs b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolator.cs index 590b91f8e4..2b63f41bd6 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolator.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolator.cs @@ -15,13 +15,12 @@ private struct BufferedItem protected virtual double ServerTimeBeingHandledForBuffering => NetworkManager.Singleton.ServerTime.Time; // override this if you want configurable buffering, right now using ServerTick's own global buffering - private T m_LerpStartValue; - private T m_LerpEndValue; + private T m_InterpStartValue; + private T m_CurrentInterpValue; + private T m_InterpEndValue; - private T m_CurrentUpdatedValue; - - private NetworkTime m_CurrentTimeConsumed; - private NetworkTime m_PreviousTimeConsumed; + private NetworkTime m_EndTimeConsumed; + private NetworkTime m_StartTimeConsumed; private readonly List m_Buffer = new List(); private const int k_BufferSizeLimit = 100; @@ -49,12 +48,12 @@ private void TryConsumeFromBuffer() { if (nbConsumed == 0) { - m_PreviousTimeConsumed = m_CurrentTimeConsumed; - m_LerpStartValue = m_LerpEndValue; + m_StartTimeConsumed = m_EndTimeConsumed; + m_InterpStartValue = m_InterpEndValue; } - m_LerpEndValue = bufferedValue.item; - m_CurrentTimeConsumed = bufferedValue.timeSent; + m_InterpEndValue = bufferedValue.item; + m_EndTimeConsumed = bufferedValue.timeSent; m_Buffer.RemoveAt(i); nbConsumed++; } @@ -63,7 +62,7 @@ private void TryConsumeFromBuffer() public T Update(float deltaTime) { - if (!NetworkManager.Singleton.IsConnectedClient) return default; + if (!NetworkManager.Singleton.IsConnectedClient && !NetworkManager.Singleton.IsListening) return default; TryConsumeFromBuffer(); @@ -72,14 +71,14 @@ public T Update(float deltaTime) // | | | | // A render B Server - var timeB = m_CurrentTimeConsumed; - var timeA = m_PreviousTimeConsumed; + var timeB = m_EndTimeConsumed; + var timeA = m_StartTimeConsumed; double range = timeB.Time - timeA.Time; var renderTime = ServerTimeBeingHandledForBuffering - range; float t = (float)((renderTime - timeA.Time) / range); - m_CurrentUpdatedValue = Interpolate(m_LerpStartValue, m_LerpEndValue, t); + m_CurrentInterpValue = Interpolate(m_InterpStartValue, m_InterpEndValue, t); - return m_CurrentUpdatedValue; + return m_CurrentInterpValue; } public void FixedUpdate(float fixedDeltaTime) @@ -100,14 +99,14 @@ public void AddMeasurement(T newMeasurement, NetworkTime sentTime) public T GetInterpolatedValue() { - return m_CurrentUpdatedValue; + return m_CurrentInterpValue; } public void Reset(T value, NetworkTime sentTime) { - m_CurrentUpdatedValue = value; - m_LerpEndValue = value; - m_LerpStartValue = value; + m_CurrentInterpValue = value; + m_InterpEndValue = value; + m_InterpStartValue = value; } public void OnDestroy() diff --git a/testproject/Assets/Materials/Black.mat b/testproject/Assets/Materials/Black.mat new file mode 100644 index 0000000000..73828acf95 --- /dev/null +++ b/testproject/Assets/Materials/Black.mat @@ -0,0 +1,78 @@ +%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: Black + 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_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.028301895, g: 0.028301895, b: 0.028301895, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + m_BuildTextureStacks: [] diff --git a/testproject/Assets/Materials/Black.mat.meta b/testproject/Assets/Materials/Black.mat.meta new file mode 100644 index 0000000000..29f556f8ae --- /dev/null +++ b/testproject/Assets/Materials/Black.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d255f11ce58034f15b98a74b2dce910d +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/testproject/Assets/Materials/Brown.mat b/testproject/Assets/Materials/Brown.mat new file mode 100644 index 0000000000..fdcdd5362c --- /dev/null +++ b/testproject/Assets/Materials/Brown.mat @@ -0,0 +1,78 @@ +%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: Brown + 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_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.6431373, g: 0.43448904, b: 0.2980392, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + m_BuildTextureStacks: [] diff --git a/testproject/Assets/Materials/Brown.mat.meta b/testproject/Assets/Materials/Brown.mat.meta new file mode 100644 index 0000000000..e0a0fe15ac --- /dev/null +++ b/testproject/Assets/Materials/Brown.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d2f6bf650dfcc483794cdacf53f9fe2b +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/testproject/Assets/Materials/Green.mat b/testproject/Assets/Materials/Green.mat new file mode 100644 index 0000000000..fc1ea4585a --- /dev/null +++ b/testproject/Assets/Materials/Green.mat @@ -0,0 +1,78 @@ +%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: Green + 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_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.32823423, g: 0.6415094, b: 0.29957277, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + m_BuildTextureStacks: [] diff --git a/testproject/Assets/Materials/Green.mat.meta b/testproject/Assets/Materials/Green.mat.meta new file mode 100644 index 0000000000..2b88172537 --- /dev/null +++ b/testproject/Assets/Materials/Green.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 16358fcb4e0c94cc8b980fbb17259843 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: From a2b885f9086c687ac5a53fde8d5aaf9e32498b24 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Fri, 13 Aug 2021 20:29:45 -0400 Subject: [PATCH 020/113] adding interface for testing --- .../BufferedLinearInterpolator.cs | 56 ++++++++++++------- .../Prototyping/Interpolator/IInterpolator.cs | 1 - .../Interpolator/NoInterpolationFactory.cs | 5 -- .../Interpolator/SimpleInterpolator.cs | 5 -- .../Prototyping/NetworkTransform.cs | 6 +- .../com.unity.netcode.editortests.asmdef | 3 +- testproject/Assets/Scenes/ZooSam.unity | 28 +++++++++- testproject/Assets/Scripts/MoveInCircle.cs | 6 ++ 8 files changed, 72 insertions(+), 38 deletions(-) diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolator.cs b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolator.cs index 2b63f41bd6..98629297d1 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolator.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolator.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using NUnit.Framework; using UnityEngine; namespace Unity.Netcode @@ -7,13 +8,26 @@ public abstract class BufferedLinearInterpolator : IInterpolator where T : { // public const float InterpolationConfigTimeSec = 0.100f; // todo expose global config, todo use in actual code + public interface IServerTime + { + public double Time { get; } + public int TickRate { get; } + } + + private class ServerTime : IServerTime + { + public double Time => NetworkManager.Singleton.ServerTime.Time; + public int TickRate => NetworkManager.Singleton.ServerTime.TickRate; + } + private struct BufferedItem { public T item; public NetworkTime timeSent; } - protected virtual double ServerTimeBeingHandledForBuffering => NetworkManager.Singleton.ServerTime.Time; // override this if you want configurable buffering, right now using ServerTick's own global buffering + internal IServerTime m_ServerTime = new ServerTime(); + protected virtual double ServerTimeBeingHandledForBuffering => m_ServerTime.Time; // override this if you want configurable buffering, right now using ServerTick's own global buffering private T m_InterpStartValue; private T m_CurrentInterpValue; @@ -25,6 +39,8 @@ private struct BufferedItem private readonly List m_Buffer = new List(); private const int k_BufferSizeLimit = 100; + private int m_LifetimeConsumedCount; + public void Start() { } @@ -44,8 +60,9 @@ private void TryConsumeFromBuffer() for (int i = m_Buffer.Count - 1; i >= 0; i--) { var bufferedValue = m_Buffer[i]; - if (bufferedValue.timeSent.Time <= ServerTimeBeingHandledForBuffering) + if (bufferedValue.timeSent.Time <= ServerTimeBeingHandledForBuffering && renderTime >= m_EndTimeConsumed.Time) { + if (nbConsumed == 0) { m_StartTimeConsumed = m_EndTimeConsumed; @@ -56,14 +73,16 @@ private void TryConsumeFromBuffer() m_EndTimeConsumed = bufferedValue.timeSent; m_Buffer.RemoveAt(i); nbConsumed++; + m_LifetimeConsumedCount++; } } } + private double range => m_EndTimeConsumed.Time - m_StartTimeConsumed.Time; + private double renderTime => ServerTimeBeingHandledForBuffering - range; + public T Update(float deltaTime) { - if (!NetworkManager.Singleton.IsConnectedClient && !NetworkManager.Singleton.IsListening) return default; - TryConsumeFromBuffer(); // Interpolation example to understand the math below @@ -71,12 +90,15 @@ public T Update(float deltaTime) // | | | | // A render B Server - var timeB = m_EndTimeConsumed; - var timeA = m_StartTimeConsumed; - double range = timeB.Time - timeA.Time; - var renderTime = ServerTimeBeingHandledForBuffering - range; - float t = (float)((renderTime - timeA.Time) / range); - m_CurrentInterpValue = Interpolate(m_InterpStartValue, m_InterpEndValue, t); + if (m_LifetimeConsumedCount >= 2) // shouldn't interpolate between default value and first measurement, should only interpolate between real measurements + { + // var timeB = m_EndTimeConsumed; + // var timeA = m_StartTimeConsumed; + // double range = timeB.Time - timeA.Time; + float t = (float) ((renderTime - m_StartTimeConsumed.Time) / range); + Debug.Assert(t >= 0, "t must be bigger or equal than 0"); + m_CurrentInterpValue = Interpolate(m_InterpStartValue, m_InterpEndValue, t); + } return m_CurrentInterpValue; } @@ -93,8 +115,11 @@ public void AddMeasurement(T newMeasurement, NetworkTime sentTime) m_Buffer.RemoveAt(m_Buffer.Count - 1); } - m_Buffer.Add(new BufferedItem {item = newMeasurement, timeSent = sentTime}); - m_Buffer.Sort((item1, item2) => item2.timeSent.Time.CompareTo(item1.timeSent.Time)); + if (sentTime.Time > m_EndTimeConsumed.Time || m_LifetimeConsumedCount == 0) // treat only if value is newer than the one being interpolated to right now + { + m_Buffer.Add(new BufferedItem {item = newMeasurement, timeSent = sentTime}); + m_Buffer.Sort((item1, item2) => item2.timeSent.Time.CompareTo(item1.timeSent.Time)); + } } public T GetInterpolatedValue() @@ -102,13 +127,6 @@ public T GetInterpolatedValue() return m_CurrentInterpValue; } - public void Reset(T value, NetworkTime sentTime) - { - m_CurrentInterpValue = value; - m_InterpEndValue = value; - m_InterpStartValue = value; - } - public void OnDestroy() { } diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/IInterpolator.cs b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/IInterpolator.cs index eaccaa52b6..5d1022287b 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/IInterpolator.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/IInterpolator.cs @@ -11,7 +11,6 @@ public interface IInterpolator public void FixedUpdate(float tickDeltaTime); public void AddMeasurement(T newMeasurement, NetworkTime sentTime); public T GetInterpolatedValue(); - public void Reset(T value, NetworkTime sentTime); public void OnDestroy(); } } diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolationFactory.cs b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolationFactory.cs index b15a338346..5881d00e52 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolationFactory.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolationFactory.cs @@ -40,11 +40,6 @@ public T GetInterpolatedValue() return m_Current; } - public void Reset(T value, NetworkTime sentTick) - { - m_Current = value; - } - public void OnDestroy() { throw new System.NotImplementedException(); diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/SimpleInterpolator.cs b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/SimpleInterpolator.cs index 5e5b8768a5..b82c1a17c6 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/SimpleInterpolator.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/SimpleInterpolator.cs @@ -47,11 +47,6 @@ public Vector3 GetInterpolatedValue() return m_UpdatedVector; } - public void Reset(Vector3 value, NetworkTime sentTick) - { - m_UpdatedVector = value; - } - public void OnDestroy() { throw new NotImplementedException(); diff --git a/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs b/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs index f019c14db1..3395a44aa5 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs @@ -301,9 +301,6 @@ public override void OnNetworkSpawn() m_PrevNetworkState = null; var currentTime = new NetworkTime(NetworkManager.Singleton.ServerTime.TickRate, m_NetworkState.Value.SentTime); - PositionInterpolator.Reset(TransformPosition, currentTime); - RotationInterpolator.Reset(TransformRotation, currentTime); - ScaleInterpolator.Reset(TransformScale, currentTime); PositionInterpolator.OnNetworkSpawn(); RotationInterpolator.OnNetworkSpawn(); @@ -355,8 +352,7 @@ private void Update() SendNetworkStateToGhosts(NetworkManager.LocalTime.Time); } } - - if (!CanUpdateTransform) + else if (NetworkManager.Singleton.IsConnectedClient || NetworkManager.Singleton.IsListening) { PositionInterpolator.Update(Time.deltaTime); RotationInterpolator.Update(Time.deltaTime); diff --git a/com.unity.multiplayer.mlapi/Tests/Editor/com.unity.netcode.editortests.asmdef b/com.unity.multiplayer.mlapi/Tests/Editor/com.unity.netcode.editortests.asmdef index 35dcb1ce8d..42ade9ce52 100644 --- a/com.unity.multiplayer.mlapi/Tests/Editor/com.unity.netcode.editortests.asmdef +++ b/com.unity.multiplayer.mlapi/Tests/Editor/com.unity.netcode.editortests.asmdef @@ -3,7 +3,8 @@ "rootNamespace": "Unity.Netcode.EditorTests", "references": [ "Unity.Netcode.Runtime", - "Unity.Netcode.Editor" + "Unity.Netcode.Editor", + "Unity.Netcode.Prototyping" ], "optionalUnityReferences": [ "TestAssemblies" diff --git a/testproject/Assets/Scenes/ZooSam.unity b/testproject/Assets/Scenes/ZooSam.unity index 2b162bd325..4232f71ae3 100644 --- a/testproject/Assets/Scenes/ZooSam.unity +++ b/testproject/Assets/Scenes/ZooSam.unity @@ -6085,6 +6085,7 @@ GameObject: - component: {fileID: 620561612} - component: {fileID: 620561611} - component: {fileID: 620561610} + - component: {fileID: 620561613} m_Layer: 0 m_Name: NetworkManager m_TagString: Untagged @@ -6134,7 +6135,7 @@ MonoBehaviour: LogLevel: 1 NetworkConfig: ProtocolVersion: 0 - NetworkTransport: {fileID: 620561610} + NetworkTransport: {fileID: 620561613} RegisteredScenes: - SampleScene - ZooSam @@ -6174,6 +6175,29 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &620561613 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 620561609} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: db28424c2ae12f64da25c9ecccded6b1, type: 3} + m_Name: + m_EditorClassIdentifier: + Port: 7777 + Address: 127.0.0.1 + PingInterval: 1 + DisconnectTimeout: 5 + ReconnectDelay: 0.5 + MaxConnectAttempts: 10 + channels: [] + MessageBufferSize: 5120 + SimulatePacketLossChance: 10 + SimulateMinLatency: 70 + SimulateMaxLatency: 130 --- !u!1001 &627808638 PrefabInstance: m_ObjectHideFlags: 0 @@ -7392,7 +7416,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} m_Name: m_EditorClassIdentifier: - GlobalObjectIdHash: 162145450 + GlobalObjectIdHash: 3301752843 AlwaysReplicateAsRoot: 0 DontDestroyWithOwner: 0 AutoObjectParentSync: 1 diff --git a/testproject/Assets/Scripts/MoveInCircle.cs b/testproject/Assets/Scripts/MoveInCircle.cs index e37f898d52..6f809325da 100644 --- a/testproject/Assets/Scripts/MoveInCircle.cs +++ b/testproject/Assets/Scripts/MoveInCircle.cs @@ -18,6 +18,12 @@ public class MoveInCircle : NetworkBehaviour private Vector3 m_DebugOldPosition; private float m_DebugLastTime; + public override void OnNetworkSpawn() + { + base.OnNetworkSpawn(); + NetworkManager.Singleton.NetworkTimeSystem.ServerBufferSec = 0.15f; + } + void FixedUpdate() { if (m_RunInUpdate) return; From d5936cc6eec62f6eeb76dd1211b4f625ea2bf929 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Sat, 14 Aug 2021 19:19:09 -0400 Subject: [PATCH 021/113] smooth --- .../BufferedLinearInterpolator.cs | 21 ++++++++++++------- testproject/Assets/Scenes/ZooSam.unity | 8 +++---- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolator.cs b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolator.cs index 98629297d1..93007c4562 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolator.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolator.cs @@ -8,15 +8,17 @@ public abstract class BufferedLinearInterpolator : IInterpolator where T : { // public const float InterpolationConfigTimeSec = 0.100f; // todo expose global config, todo use in actual code - public interface IServerTime + public interface IInterpolatorTime { - public double Time { get; } + public double ServerTime { get; } + public double LocalTime { get; } public int TickRate { get; } } - private class ServerTime : IServerTime + private class InterpolatorTime : IInterpolatorTime { - public double Time => NetworkManager.Singleton.ServerTime.Time; + public double ServerTime => NetworkManager.Singleton.ServerTime.Time; + public double LocalTime => NetworkManager.Singleton.LocalTime.Time; public int TickRate => NetworkManager.Singleton.ServerTime.TickRate; } @@ -26,8 +28,8 @@ private struct BufferedItem public NetworkTime timeSent; } - internal IServerTime m_ServerTime = new ServerTime(); - protected virtual double ServerTimeBeingHandledForBuffering => m_ServerTime.Time; // override this if you want configurable buffering, right now using ServerTick's own global buffering + internal IInterpolatorTime interpolatorTime = new InterpolatorTime(); + protected virtual double ServerTimeBeingHandledForBuffering => interpolatorTime.ServerTime; // override this if you want configurable buffering, right now using ServerTick's own global buffering private T m_InterpStartValue; private T m_CurrentInterpValue; @@ -79,7 +81,12 @@ private void TryConsumeFromBuffer() } private double range => m_EndTimeConsumed.Time - m_StartTimeConsumed.Time; - private double renderTime => ServerTimeBeingHandledForBuffering - range; + private double renderTime => ServerTimeBeingHandledForBuffering - 1f / interpolatorTime.TickRate; //ServerTimeBeingHandledForBuffering - range; + // private double renderTime => ServerTimeBeingHandledForBuffering - range; + + // buffer=4 + // t=100 101 101.2 101.5 105.2 + // A B S C RS public T Update(float deltaTime) { diff --git a/testproject/Assets/Scenes/ZooSam.unity b/testproject/Assets/Scenes/ZooSam.unity index 4232f71ae3..bf271492e6 100644 --- a/testproject/Assets/Scenes/ZooSam.unity +++ b/testproject/Assets/Scenes/ZooSam.unity @@ -6195,9 +6195,9 @@ MonoBehaviour: MaxConnectAttempts: 10 channels: [] MessageBufferSize: 5120 - SimulatePacketLossChance: 10 - SimulateMinLatency: 70 - SimulateMaxLatency: 130 + SimulatePacketLossChance: 0 + SimulateMinLatency: 95 + SimulateMaxLatency: 105 --- !u!1001 &627808638 PrefabInstance: m_ObjectHideFlags: 0 @@ -7403,7 +7403,7 @@ MonoBehaviour: m_MoveSpeed: 5 m_RotationSpeed: 30 m_RunServerOnly: 0 - m_RunInUpdate: 0 + m_RunInUpdate: 1 --- !u!114 &678326394 MonoBehaviour: m_ObjectHideFlags: 0 From 3817962e7fce8e5a74a9e864bc7d251767be5c38 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Tue, 17 Aug 2021 14:16:09 -0400 Subject: [PATCH 022/113] Adding basis for tests --- .../BufferedLinearInterpolator.cs | 11 +- .../Prototyping/NetworkTransform.cs | 5 +- .../Tests/Editor/InterpolatorTests.cs | 184 ++++++++++++++++++ .../Tests/Editor/InterpolatorTests.cs.meta | 3 + testproject/Assets/Scenes/ZooSam.unity | 4 +- 5 files changed, 200 insertions(+), 7 deletions(-) create mode 100644 com.unity.multiplayer.mlapi/Tests/Editor/InterpolatorTests.cs create mode 100644 com.unity.multiplayer.mlapi/Tests/Editor/InterpolatorTests.cs.meta diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolator.cs b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolator.cs index 93007c4562..d09d37bf90 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolator.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolator.cs @@ -4,20 +4,25 @@ namespace Unity.Netcode { + /// + /// Solves for jittered incoming values + /// Doesn't solve for message loss + /// + /// public abstract class BufferedLinearInterpolator : IInterpolator where T : struct { // public const float InterpolationConfigTimeSec = 0.100f; // todo expose global config, todo use in actual code public interface IInterpolatorTime { - public double ServerTime { get; } + public double BufferedServerTime { get; } public double LocalTime { get; } public int TickRate { get; } } private class InterpolatorTime : IInterpolatorTime { - public double ServerTime => NetworkManager.Singleton.ServerTime.Time; + public double BufferedServerTime => NetworkManager.Singleton.ServerTime.Time; public double LocalTime => NetworkManager.Singleton.LocalTime.Time; public int TickRate => NetworkManager.Singleton.ServerTime.TickRate; } @@ -29,7 +34,7 @@ private struct BufferedItem } internal IInterpolatorTime interpolatorTime = new InterpolatorTime(); - protected virtual double ServerTimeBeingHandledForBuffering => interpolatorTime.ServerTime; // override this if you want configurable buffering, right now using ServerTick's own global buffering + protected virtual double ServerTimeBeingHandledForBuffering => interpolatorTime.BufferedServerTime; // override this if you want configurable buffering, right now using ServerTick's own global buffering private T m_InterpStartValue; private T m_CurrentInterpValue; diff --git a/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs b/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs index 3395a44aa5..2be4a5235c 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs @@ -179,7 +179,7 @@ private bool IsAuthoritativeTransformDirty() return isDirty; } - private void SendNetworkStateToGhosts(double dirtyTime) + private void SetNetworkStateDirtyToGhosts(double dirtyTime) { m_NetworkState.Value.InLocalSpace = InLocalSpace; m_NetworkState.Value.SentTime = dirtyTime; @@ -349,7 +349,8 @@ private void Update() if (IsAuthoritativeTransformDirty()) { // check for time there was a change to the transform - SendNetworkStateToGhosts(NetworkManager.LocalTime.Time); + // this needs to be done in Update to catch that time change as soon as it happens. + SetNetworkStateDirtyToGhosts(NetworkManager.LocalTime.Time); } } else if (NetworkManager.Singleton.IsConnectedClient || NetworkManager.Singleton.IsListening) diff --git a/com.unity.multiplayer.mlapi/Tests/Editor/InterpolatorTests.cs b/com.unity.multiplayer.mlapi/Tests/Editor/InterpolatorTests.cs new file mode 100644 index 0000000000..fd807f2ea7 --- /dev/null +++ b/com.unity.multiplayer.mlapi/Tests/Editor/InterpolatorTests.cs @@ -0,0 +1,184 @@ +using NUnit.Framework; + +namespace Unity.Netcode.EditorTests +{ + public class BufferedInterpolatorTests + { + private const float k_Precision = 0.00000001f; + + private class MockInterpolatorTime : BufferedLinearInterpolator.IInterpolatorTime + { + public double BufferedServerTime { get; set; } + public double LocalTime { get; } + public int TickRate { get; set; } + + public MockInterpolatorTime(double serverTime, int tickRate) + { + BufferedServerTime = serverTime; + TickRate = tickRate; + LocalTime = serverTime; // todo + } + } + + /* + * TODO + * test normal interpolation + * test with some jitter + * test with high jitter + * test with too high jitter + * test with packet loss + * test with out of order because of network measurements + * test with negative time should fail + * check https://github.com/vis2k/Mirror/blob/02cc3de7b8889f477118e20379b584eaf8bd43b6/Assets/Mirror/Tests/Editor/SnapshotInterpolationTests.cs + * for examples of tests + * Test every single public API + */ + + [Test] + public void NormalUsage() + { + // Testing float instead of Vector3. The only difference with Vector3 is the lerp method used. + const int mockTickRate = 1; + float deltaTick = 1f / mockTickRate; + NetworkTime T(float time) + { + return new NetworkTime(mockTickRate, timeSec: time); + } + + var interpolator = new BufferedLinearInterpolatorFloat(); + var mockBufferedTime = new MockInterpolatorTime(0, mockTickRate); + interpolator.interpolatorTime = mockBufferedTime; + + Assert.That(interpolator.GetInterpolatedValue(), Is.EqualTo(0f)); + + interpolator.AddMeasurement(0f, new NetworkTime(mockTickRate, 1.0)); + interpolator.AddMeasurement(1f, new NetworkTime(mockTickRate, 2.0)); + + // too small update, nothing happens, doesn't consume from buffer yet + float deltaTime = 0.01f; + mockBufferedTime.BufferedServerTime = 0.01f; + interpolator.Update(deltaTime); + Assert.That(interpolator.GetInterpolatedValue(), Is.EqualTo(0f)); + + // consume first measurement, still can't interpolate with just one tick consumed + mockBufferedTime.BufferedServerTime = 1.01f; + interpolator.Update(1.0f); + Assert.That(interpolator.GetInterpolatedValue(), Is.EqualTo(0f)); + + // consume second measurement, start to interpolate + mockBufferedTime.BufferedServerTime = 2.01f; + var valueFromUpdate = interpolator.Update(1.0f); + Assert.That(interpolator.GetInterpolatedValue(), Is.EqualTo(0.01f).Within(k_Precision)); + Assert.That(interpolator.GetInterpolatedValue(), Is.EqualTo(0.01f).Within(k_Precision)); // test a second time, to make sure the get doesn't update the value + Assert.That(valueFromUpdate, Is.EqualTo(interpolator.GetInterpolatedValue()).Within(k_Precision)); + + // continue interpolation + mockBufferedTime.BufferedServerTime = 2.5f; + interpolator.Update(2.5f - 2.01f); + Assert.That(interpolator.GetInterpolatedValue(), Is.EqualTo(0.5f).Within(k_Precision)); + // check when reaching end + mockBufferedTime.BufferedServerTime = 3f; + interpolator.Update(0.5f); + Assert.That(interpolator.GetInterpolatedValue(), Is.EqualTo(1f).Within(k_Precision)); + } + + /// + /// Out of order or 'ACB' problem + /// Given two measurements have already arrived A and C, if a new measurement B arrives, the interpolation shouldn't go to B, but continue + /// to C. + /// Adding B should be ignored if interpolation is already interpolating between A and C + /// + [Test] + public void OutOfOrderShouldStillWork() + { + const int mockTickRate = 1; + float deltaTick = 1f / mockTickRate; + NetworkTime T(float time) + { + return new NetworkTime(mockTickRate, timeSec: time); + } + + var interpolator = new BufferedLinearInterpolatorFloat(); + var mockBufferedTime = new MockInterpolatorTime(0, mockTickRate); + interpolator.interpolatorTime = mockBufferedTime; + + interpolator.AddMeasurement(0, T(0f)); + interpolator.AddMeasurement(2, T(2f)); + + mockBufferedTime.BufferedServerTime = 1.5; + interpolator.Update(1.5f); + Assert.That(interpolator.GetInterpolatedValue(), Is.EqualTo(0f).Within(k_Precision)); + + mockBufferedTime.BufferedServerTime = 2f; + interpolator.Update(0.5f); + Assert.That(interpolator.GetInterpolatedValue(), Is.EqualTo(0f).Within(k_Precision)); + + mockBufferedTime.BufferedServerTime = 2.5; + interpolator.Update(0.5f); + Assert.That(interpolator.GetInterpolatedValue(), Is.EqualTo(0.5f).Within(k_Precision)); + + mockBufferedTime.BufferedServerTime = 3.5; + interpolator.Update(1f); + Assert.That(interpolator.GetInterpolatedValue(), Is.EqualTo(1.5f).Within(k_Precision)); + + // makes sure that interpolation still continues in right direction + interpolator.AddMeasurement(1, T(1f)); + mockBufferedTime.BufferedServerTime = 4; + interpolator.Update(0.5f); + Assert.That(interpolator.GetInterpolatedValue(), Is.EqualTo(2f).Within(k_Precision)); + } + + [Test] + public void MessageLoss() + { + const int mockTickRate = 1; + float deltaTick = 1f / mockTickRate; + + var interpolator = new BufferedLinearInterpolatorFloat(); + var mockBufferedTime = new MockInterpolatorTime(0, mockTickRate); + interpolator.interpolatorTime = mockBufferedTime; + + NetworkTime T(float time) + { + return new NetworkTime(mockTickRate, timeSec: time); + } + + interpolator.AddMeasurement(1f, T(1f)); + interpolator.AddMeasurement(2f, T(2f)); + // message time=3 was lost + interpolator.AddMeasurement(4f, T(4f)); + interpolator.AddMeasurement(5f, T(5f)); + + mockBufferedTime.BufferedServerTime = 2f; + interpolator.Update(2f); + Assert.That(interpolator.GetInterpolatedValue(), Is.EqualTo(1f)); + + mockBufferedTime.BufferedServerTime = 2.5f; + interpolator.Update(0.5f); + Assert.That(interpolator.GetInterpolatedValue(), Is.EqualTo(1.5f)); + + mockBufferedTime.BufferedServerTime = 3f; + interpolator.Update(0.5f); + Assert.That(interpolator.GetInterpolatedValue(), Is.EqualTo(2f)); + + // pausing until buffer reaches next value in buffer, should have been 2.5f, pausing to last value 2f + mockBufferedTime.BufferedServerTime = 3.5f; + interpolator.Update(0.5f); + Assert.That(interpolator.GetInterpolatedValue(), Is.EqualTo(2f)); + + // next value skips to where it was supposed to be once buffer time is showing the next value + mockBufferedTime.BufferedServerTime = 4f; + interpolator.Update(0.5f); + Assert.That(interpolator.GetInterpolatedValue(), Is.EqualTo(3f)); + + // interpolation continues as expected + mockBufferedTime.BufferedServerTime = 4.5f; + interpolator.Update(0.5f); + Assert.That(interpolator.GetInterpolatedValue(), Is.EqualTo(3.5f)); + + mockBufferedTime.BufferedServerTime = 5f; + interpolator.Update(0.5f); + Assert.That(interpolator.GetInterpolatedValue(), Is.EqualTo(4f)); + } + } +} \ No newline at end of file diff --git a/com.unity.multiplayer.mlapi/Tests/Editor/InterpolatorTests.cs.meta b/com.unity.multiplayer.mlapi/Tests/Editor/InterpolatorTests.cs.meta new file mode 100644 index 0000000000..57c242b869 --- /dev/null +++ b/com.unity.multiplayer.mlapi/Tests/Editor/InterpolatorTests.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ab8e37e768b14b4fa3b7dfc8948813a5 +timeCreated: 1628885202 \ No newline at end of file diff --git a/testproject/Assets/Scenes/ZooSam.unity b/testproject/Assets/Scenes/ZooSam.unity index bf271492e6..60d8a94c3e 100644 --- a/testproject/Assets/Scenes/ZooSam.unity +++ b/testproject/Assets/Scenes/ZooSam.unity @@ -6196,8 +6196,8 @@ MonoBehaviour: channels: [] MessageBufferSize: 5120 SimulatePacketLossChance: 0 - SimulateMinLatency: 95 - SimulateMaxLatency: 105 + SimulateMinLatency: 70 + SimulateMaxLatency: 130 --- !u!1001 &627808638 PrefabInstance: m_ObjectHideFlags: 0 From 7ca5cedcc0ab88438ce512da35d39f636acfe993 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Tue, 17 Aug 2021 14:24:29 -0400 Subject: [PATCH 023/113] # --- .../BufferedLinearInterpolator.cs | 21 ++++++------------- ...erpolationFactory.cs => NoInterpolator.cs} | 2 +- ...Factory.cs.meta => NoInterpolator.cs.meta} | 2 +- 3 files changed, 8 insertions(+), 17 deletions(-) rename com.unity.multiplayer.mlapi/Prototyping/Interpolator/{NoInterpolationFactory.cs => NoInterpolator.cs} (93%) rename com.unity.multiplayer.mlapi/Prototyping/Interpolator/{NoInterpolationFactory.cs.meta => NoInterpolator.cs.meta} (83%) diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolator.cs b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolator.cs index d09d37bf90..b755ecd4b0 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolator.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolator.cs @@ -13,6 +13,7 @@ public abstract class BufferedLinearInterpolator : IInterpolator where T : { // public const float InterpolationConfigTimeSec = 0.100f; // todo expose global config, todo use in actual code + // interface for mock testing, abstracting away external systems public interface IInterpolatorTime { public double BufferedServerTime { get; } @@ -35,6 +36,7 @@ private struct BufferedItem internal IInterpolatorTime interpolatorTime = new InterpolatorTime(); protected virtual double ServerTimeBeingHandledForBuffering => interpolatorTime.BufferedServerTime; // override this if you want configurable buffering, right now using ServerTick's own global buffering + private double RenderTime => ServerTimeBeingHandledForBuffering - 1f / interpolatorTime.TickRate; private T m_InterpStartValue; private T m_CurrentInterpValue; @@ -63,13 +65,12 @@ public void OnNetworkSpawn() private void TryConsumeFromBuffer() { int nbConsumed = 0; - // sorted so older (smaller) time values are at the end. + // buffer is sorted so older (smaller) time values are at the end. for (int i = m_Buffer.Count - 1; i >= 0; i--) { var bufferedValue = m_Buffer[i]; - if (bufferedValue.timeSent.Time <= ServerTimeBeingHandledForBuffering && renderTime >= m_EndTimeConsumed.Time) + if (bufferedValue.timeSent.Time <= ServerTimeBeingHandledForBuffering && RenderTime >= m_EndTimeConsumed.Time) { - if (nbConsumed == 0) { m_StartTimeConsumed = m_EndTimeConsumed; @@ -85,14 +86,6 @@ private void TryConsumeFromBuffer() } } - private double range => m_EndTimeConsumed.Time - m_StartTimeConsumed.Time; - private double renderTime => ServerTimeBeingHandledForBuffering - 1f / interpolatorTime.TickRate; //ServerTimeBeingHandledForBuffering - range; - // private double renderTime => ServerTimeBeingHandledForBuffering - range; - - // buffer=4 - // t=100 101 101.2 101.5 105.2 - // A B S C RS - public T Update(float deltaTime) { TryConsumeFromBuffer(); @@ -104,10 +97,8 @@ public T Update(float deltaTime) if (m_LifetimeConsumedCount >= 2) // shouldn't interpolate between default value and first measurement, should only interpolate between real measurements { - // var timeB = m_EndTimeConsumed; - // var timeA = m_StartTimeConsumed; - // double range = timeB.Time - timeA.Time; - float t = (float) ((renderTime - m_StartTimeConsumed.Time) / range); + double range = m_EndTimeConsumed.Time - m_StartTimeConsumed.Time; + float t = (float) ((RenderTime - m_StartTimeConsumed.Time) / range); Debug.Assert(t >= 0, "t must be bigger or equal than 0"); m_CurrentInterpValue = Interpolate(m_InterpStartValue, m_InterpEndValue, t); } diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolationFactory.cs b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolator.cs similarity index 93% rename from com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolationFactory.cs rename to com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolator.cs index 5881d00e52..f6b4fd2f08 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolationFactory.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolator.cs @@ -1,6 +1,6 @@ namespace Unity.Netcode { - public class NoInterpolation : IInterpolator + public class NoInterpolator : IInterpolator { private T m_Current; diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolationFactory.cs.meta b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolator.cs.meta similarity index 83% rename from com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolationFactory.cs.meta rename to com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolator.cs.meta index 46b8fdc1d8..b5c15e25de 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolationFactory.cs.meta +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolator.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 6fd1b15ec60324368a3c724e031254f4 +guid: 9f4a8ff3425ce44f1abd995d1a4f88cb MonoImporter: externalObjects: {} serializedVersion: 2 From e9ee9fd41156741fa8ae87fd53703cf8aef601ca Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Tue, 17 Aug 2021 14:27:38 -0400 Subject: [PATCH 024/113] # --- .../Prototyping/Interpolator/NoInterpolator.cs | 1 - .../Prototyping/Interpolator/SimpleInterpolator.cs | 1 - 2 files changed, 2 deletions(-) diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolator.cs b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolator.cs index f6b4fd2f08..4ed406c55e 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolator.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolator.cs @@ -42,7 +42,6 @@ public T GetInterpolatedValue() public void OnDestroy() { - throw new System.NotImplementedException(); } } } \ No newline at end of file diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/SimpleInterpolator.cs b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/SimpleInterpolator.cs index b82c1a17c6..6872c116d5 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/SimpleInterpolator.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/SimpleInterpolator.cs @@ -49,7 +49,6 @@ public Vector3 GetInterpolatedValue() public void OnDestroy() { - throw new NotImplementedException(); } } } \ No newline at end of file From c3cc8b9ff60fe09f95092628dc70493b893f591d Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Tue, 17 Aug 2021 15:51:47 -0400 Subject: [PATCH 025/113] # --- .../BufferedLinearInterpolator.cs | 26 +++- .../Tests/Editor/InterpolatorTests.cs | 117 +++++++++++++++++- 2 files changed, 131 insertions(+), 12 deletions(-) diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolator.cs b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolator.cs index b755ecd4b0..55f620914e 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolator.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolator.cs @@ -64,23 +64,28 @@ public void OnNetworkSpawn() private void TryConsumeFromBuffer() { - int nbConsumed = 0; + int consumedCount = 0; // buffer is sorted so older (smaller) time values are at the end. for (int i = m_Buffer.Count - 1; i >= 0; i--) { var bufferedValue = m_Buffer[i]; if (bufferedValue.timeSent.Time <= ServerTimeBeingHandledForBuffering && RenderTime >= m_EndTimeConsumed.Time) { - if (nbConsumed == 0) + if (m_LifetimeConsumedCount == 0) + { + m_StartTimeConsumed = bufferedValue.timeSent; + m_InterpStartValue = bufferedValue.item; + } + else if (consumedCount == 0) { m_StartTimeConsumed = m_EndTimeConsumed; m_InterpStartValue = m_InterpEndValue; } - m_InterpEndValue = bufferedValue.item; m_EndTimeConsumed = bufferedValue.timeSent; + m_InterpEndValue = bufferedValue.item; m_Buffer.RemoveAt(i); - nbConsumed++; + consumedCount++; m_LifetimeConsumedCount++; } } @@ -95,10 +100,19 @@ public T Update(float deltaTime) // | | | | // A render B Server - if (m_LifetimeConsumedCount >= 2) // shouldn't interpolate between default value and first measurement, should only interpolate between real measurements + if (m_LifetimeConsumedCount >= 1) // shouldn't interpolate between default values, let's wait to receive data first, should only interpolate between real measurements { double range = m_EndTimeConsumed.Time - m_StartTimeConsumed.Time; - float t = (float) ((RenderTime - m_StartTimeConsumed.Time) / range); + float t; + if (range == 0) + { + t = 1; + } + else + { + t = (float) ((RenderTime - m_StartTimeConsumed.Time) / range); + } + Debug.Assert(t >= 0, "t must be bigger or equal than 0"); m_CurrentInterpValue = Interpolate(m_InterpStartValue, m_InterpEndValue, t); } diff --git a/com.unity.multiplayer.mlapi/Tests/Editor/InterpolatorTests.cs b/com.unity.multiplayer.mlapi/Tests/Editor/InterpolatorTests.cs index fd807f2ea7..6302368a87 100644 --- a/com.unity.multiplayer.mlapi/Tests/Editor/InterpolatorTests.cs +++ b/com.unity.multiplayer.mlapi/Tests/Editor/InterpolatorTests.cs @@ -111,19 +111,16 @@ NetworkTime T(float time) mockBufferedTime.BufferedServerTime = 2f; interpolator.Update(0.5f); - Assert.That(interpolator.GetInterpolatedValue(), Is.EqualTo(0f).Within(k_Precision)); + Assert.That(interpolator.GetInterpolatedValue(), Is.EqualTo(1f).Within(k_Precision)); mockBufferedTime.BufferedServerTime = 2.5; interpolator.Update(0.5f); - Assert.That(interpolator.GetInterpolatedValue(), Is.EqualTo(0.5f).Within(k_Precision)); - - mockBufferedTime.BufferedServerTime = 3.5; - interpolator.Update(1f); Assert.That(interpolator.GetInterpolatedValue(), Is.EqualTo(1.5f).Within(k_Precision)); // makes sure that interpolation still continues in right direction interpolator.AddMeasurement(1, T(1f)); - mockBufferedTime.BufferedServerTime = 4; + + mockBufferedTime.BufferedServerTime = 3f; interpolator.Update(0.5f); Assert.That(interpolator.GetInterpolatedValue(), Is.EqualTo(2f).Within(k_Precision)); } @@ -180,5 +177,113 @@ NetworkTime T(float time) interpolator.Update(0.5f); Assert.That(interpolator.GetInterpolatedValue(), Is.EqualTo(4f)); } + + [Test] + public void AddFirstMeasurement() + { + const int mockTickRate = 1; + float deltaTick = 1f / mockTickRate; + + var interpolator = new BufferedLinearInterpolatorFloat(); + var mockBufferedTime = new MockInterpolatorTime(0, mockTickRate); + interpolator.interpolatorTime = mockBufferedTime; + + NetworkTime T(float time) + { + return new NetworkTime(mockTickRate, timeSec: time); + } + + interpolator.AddMeasurement(2f, T(1f)); + interpolator.AddMeasurement(3f, T(2f)); + mockBufferedTime.BufferedServerTime = 1f; + var interpolatedValue = interpolator.Update(1f); + // when consuming only one measurement and it's the first one consumed, teleport to it + Assert.That(interpolatedValue, Is.EqualTo(2f)); + + // then interpolation should work as usual + mockBufferedTime.BufferedServerTime = 2f; + interpolatedValue = interpolator.Update(1f); + Assert.That(interpolatedValue, Is.EqualTo(2f)); + + mockBufferedTime.BufferedServerTime = 2.5f; + interpolatedValue = interpolator.Update(0.5f); + Assert.That(interpolatedValue, Is.EqualTo(2.5f)); + + mockBufferedTime.BufferedServerTime = 3f; + interpolatedValue = interpolator.Update(0.5f); + Assert.That(interpolatedValue, Is.EqualTo(3f)); + } + + [Test] + public void JumpToEachValueIfDeltaTimeTooBig() + { + const int mockTickRate = 1; + float deltaTick = 1f / mockTickRate; + + var interpolator = new BufferedLinearInterpolatorFloat(); + var mockBufferedTime = new MockInterpolatorTime(0, mockTickRate); + interpolator.interpolatorTime = mockBufferedTime; + + NetworkTime T(float time) + { + return new NetworkTime(mockTickRate, timeSec: time); + } + + interpolator.AddMeasurement(2f, T(1f)); + interpolator.AddMeasurement(3f, T(2f)); + mockBufferedTime.BufferedServerTime = 1f; + var interpolatedValue = interpolator.Update(1f); + Assert.That(interpolatedValue, Is.EqualTo(2f)); + + // big deltaTime, jumping to latest value + mockBufferedTime.BufferedServerTime = 10f; + interpolatedValue = interpolator.Update(8f); + Assert.That(interpolatedValue, Is.EqualTo(3)); + } + + [Test] + public void JumpToLastValueFromStart() + { + const int mockTickRate = 1; + float deltaTick = 1f / mockTickRate; + + var interpolator = new BufferedLinearInterpolatorFloat(); + var mockBufferedTime = new MockInterpolatorTime(0, mockTickRate); + interpolator.interpolatorTime = mockBufferedTime; + + NetworkTime T(float time) + { + return new NetworkTime(mockTickRate, timeSec: time); + } + + interpolator.AddMeasurement(1f, T(1f)); + interpolator.AddMeasurement(2f, T(2f)); + interpolator.AddMeasurement(3f, T(3f)); + + mockBufferedTime.BufferedServerTime = 10f; + var interpolatedValue = interpolator.Update(10f); + Assert.That(interpolatedValue, Is.EqualTo(3f)); + + // interpolation continues as normal + interpolator.AddMeasurement(11f, T(11f)); + mockBufferedTime.BufferedServerTime = 10.5f; + interpolatedValue = interpolator.Update(0.5f); + Assert.That(interpolatedValue, Is.EqualTo(3f)); + mockBufferedTime.BufferedServerTime = 11f; + interpolatedValue = interpolator.Update(0.5f); + Assert.That(interpolatedValue, Is.EqualTo(10f)); + mockBufferedTime.BufferedServerTime = 11.5f; + interpolatedValue = interpolator.Update(0.5f); + Assert.That(interpolatedValue, Is.EqualTo(10.5f)); + mockBufferedTime.BufferedServerTime = 12f; + interpolatedValue = interpolator.Update(0.5f); + Assert.That(interpolatedValue, Is.EqualTo(11f)); + } + + [Test] + public void TestBufferSizeLimit() + { + + } } } \ No newline at end of file From e2b85c18379ff6a5726868705af23a9a7839c5cc Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Tue, 17 Aug 2021 15:56:18 -0400 Subject: [PATCH 026/113] cleanup --- .../Tests/Editor/InterpolatorTests.cs | 76 ++++++------------- 1 file changed, 23 insertions(+), 53 deletions(-) diff --git a/com.unity.multiplayer.mlapi/Tests/Editor/InterpolatorTests.cs b/com.unity.multiplayer.mlapi/Tests/Editor/InterpolatorTests.cs index 6302368a87..31cc1398c5 100644 --- a/com.unity.multiplayer.mlapi/Tests/Editor/InterpolatorTests.cs +++ b/com.unity.multiplayer.mlapi/Tests/Editor/InterpolatorTests.cs @@ -20,6 +20,12 @@ public MockInterpolatorTime(double serverTime, int tickRate) } } + const int k_MockTickRate = 1; + NetworkTime T(float time, int tickRate = k_MockTickRate) + { + return new NetworkTime(tickRate, timeSec: time); + } + /* * TODO * test normal interpolation @@ -38,21 +44,15 @@ public MockInterpolatorTime(double serverTime, int tickRate) public void NormalUsage() { // Testing float instead of Vector3. The only difference with Vector3 is the lerp method used. - const int mockTickRate = 1; - float deltaTick = 1f / mockTickRate; - NetworkTime T(float time) - { - return new NetworkTime(mockTickRate, timeSec: time); - } var interpolator = new BufferedLinearInterpolatorFloat(); - var mockBufferedTime = new MockInterpolatorTime(0, mockTickRate); + var mockBufferedTime = new MockInterpolatorTime(0, k_MockTickRate); interpolator.interpolatorTime = mockBufferedTime; Assert.That(interpolator.GetInterpolatedValue(), Is.EqualTo(0f)); - interpolator.AddMeasurement(0f, new NetworkTime(mockTickRate, 1.0)); - interpolator.AddMeasurement(1f, new NetworkTime(mockTickRate, 2.0)); + interpolator.AddMeasurement(0f, T(1.0f)); + interpolator.AddMeasurement(1f, T(2.0f)); // too small update, nothing happens, doesn't consume from buffer yet float deltaTime = 0.01f; @@ -91,15 +91,8 @@ NetworkTime T(float time) [Test] public void OutOfOrderShouldStillWork() { - const int mockTickRate = 1; - float deltaTick = 1f / mockTickRate; - NetworkTime T(float time) - { - return new NetworkTime(mockTickRate, timeSec: time); - } - var interpolator = new BufferedLinearInterpolatorFloat(); - var mockBufferedTime = new MockInterpolatorTime(0, mockTickRate); + var mockBufferedTime = new MockInterpolatorTime(0, k_MockTickRate); interpolator.interpolatorTime = mockBufferedTime; interpolator.AddMeasurement(0, T(0f)); @@ -128,18 +121,10 @@ NetworkTime T(float time) [Test] public void MessageLoss() { - const int mockTickRate = 1; - float deltaTick = 1f / mockTickRate; - var interpolator = new BufferedLinearInterpolatorFloat(); - var mockBufferedTime = new MockInterpolatorTime(0, mockTickRate); + var mockBufferedTime = new MockInterpolatorTime(0, k_MockTickRate); interpolator.interpolatorTime = mockBufferedTime; - NetworkTime T(float time) - { - return new NetworkTime(mockTickRate, timeSec: time); - } - interpolator.AddMeasurement(1f, T(1f)); interpolator.AddMeasurement(2f, T(2f)); // message time=3 was lost @@ -181,18 +166,10 @@ NetworkTime T(float time) [Test] public void AddFirstMeasurement() { - const int mockTickRate = 1; - float deltaTick = 1f / mockTickRate; - var interpolator = new BufferedLinearInterpolatorFloat(); - var mockBufferedTime = new MockInterpolatorTime(0, mockTickRate); + var mockBufferedTime = new MockInterpolatorTime(0, k_MockTickRate); interpolator.interpolatorTime = mockBufferedTime; - NetworkTime T(float time) - { - return new NetworkTime(mockTickRate, timeSec: time); - } - interpolator.AddMeasurement(2f, T(1f)); interpolator.AddMeasurement(3f, T(2f)); mockBufferedTime.BufferedServerTime = 1f; @@ -217,18 +194,10 @@ NetworkTime T(float time) [Test] public void JumpToEachValueIfDeltaTimeTooBig() { - const int mockTickRate = 1; - float deltaTick = 1f / mockTickRate; - var interpolator = new BufferedLinearInterpolatorFloat(); - var mockBufferedTime = new MockInterpolatorTime(0, mockTickRate); + var mockBufferedTime = new MockInterpolatorTime(0, k_MockTickRate); interpolator.interpolatorTime = mockBufferedTime; - NetworkTime T(float time) - { - return new NetworkTime(mockTickRate, timeSec: time); - } - interpolator.AddMeasurement(2f, T(1f)); interpolator.AddMeasurement(3f, T(2f)); mockBufferedTime.BufferedServerTime = 1f; @@ -244,18 +213,10 @@ NetworkTime T(float time) [Test] public void JumpToLastValueFromStart() { - const int mockTickRate = 1; - float deltaTick = 1f / mockTickRate; - var interpolator = new BufferedLinearInterpolatorFloat(); - var mockBufferedTime = new MockInterpolatorTime(0, mockTickRate); + var mockBufferedTime = new MockInterpolatorTime(0, k_MockTickRate); interpolator.interpolatorTime = mockBufferedTime; - NetworkTime T(float time) - { - return new NetworkTime(mockTickRate, timeSec: time); - } - interpolator.AddMeasurement(1f, T(1f)); interpolator.AddMeasurement(2f, T(2f)); interpolator.AddMeasurement(3f, T(3f)); @@ -283,7 +244,16 @@ NetworkTime T(float time) [Test] public void TestBufferSizeLimit() { + float deltaTick = 1f / k_MockTickRate; + var interpolator = new BufferedLinearInterpolatorFloat(); + var mockBufferedTime = new MockInterpolatorTime(0, k_MockTickRate); + interpolator.interpolatorTime = mockBufferedTime; + + for (int i = 0; i < 101; i++) + { + interpolator.AddMeasurement(i, T(i)); + } } } } \ No newline at end of file From 9fb4e302f7228e65af2a4b38bc4262db20c60ca2 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Tue, 17 Aug 2021 16:40:37 -0400 Subject: [PATCH 027/113] # --- .../BufferedLinearInterpolator.cs | 9 ++++- .../Tests/Editor/InterpolatorTests.cs | 36 +++++++++++++++++-- 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolator.cs b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolator.cs index 55f620914e..f5f1f89542 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolator.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolator.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using NUnit.Framework; using UnityEngine; @@ -69,6 +70,7 @@ private void TryConsumeFromBuffer() for (int i = m_Buffer.Count - 1; i >= 0; i--) { var bufferedValue = m_Buffer[i]; + // check render time so we only try to consume one value at once if (bufferedValue.timeSent.Time <= ServerTimeBeingHandledForBuffering && RenderTime >= m_EndTimeConsumed.Time) { if (m_LifetimeConsumedCount == 0) @@ -95,6 +97,11 @@ public T Update(float deltaTime) { TryConsumeFromBuffer(); + if (m_LifetimeConsumedCount == 0 && m_Buffer.Count == 0) + { + throw new InvalidOperationException("trying to update interpolator when no data has been added to it yet"); + } + // Interpolation example to understand the math below // 4 4.5 6 6.5 // | | | | @@ -126,7 +133,7 @@ public void FixedUpdate(float fixedDeltaTime) public void AddMeasurement(T newMeasurement, NetworkTime sentTime) { - if (m_Buffer.Count > k_BufferSizeLimit) + if (m_Buffer.Count >= k_BufferSizeLimit) { Debug.LogWarning("Going over buffer size limit while adding new interpolation values, interpolation buffering isn't consuming fast enough, removing oldest value now."); m_Buffer.RemoveAt(m_Buffer.Count - 1); diff --git a/com.unity.multiplayer.mlapi/Tests/Editor/InterpolatorTests.cs b/com.unity.multiplayer.mlapi/Tests/Editor/InterpolatorTests.cs index 31cc1398c5..1247c859f8 100644 --- a/com.unity.multiplayer.mlapi/Tests/Editor/InterpolatorTests.cs +++ b/com.unity.multiplayer.mlapi/Tests/Editor/InterpolatorTests.cs @@ -1,3 +1,4 @@ +using System; using NUnit.Framework; namespace Unity.Netcode.EditorTests @@ -244,16 +245,45 @@ public void JumpToLastValueFromStart() [Test] public void TestBufferSizeLimit() { - float deltaTick = 1f / k_MockTickRate; - var interpolator = new BufferedLinearInterpolatorFloat(); var mockBufferedTime = new MockInterpolatorTime(0, k_MockTickRate); interpolator.interpolatorTime = mockBufferedTime; - for (int i = 0; i < 101; i++) + // set first value + interpolator.AddMeasurement(-1f, T(1f)); + mockBufferedTime.BufferedServerTime = 1f; + interpolator.Update(1f); + + // max + 1 + interpolator.AddMeasurement(2, T(2)); // this value should disappear + for (int i = 3; i < 103; i++) { interpolator.AddMeasurement(i, T(i)); } + + // make sure the first value isn't there anymore and that we're already using the second value + // the following shouldn't happen in real life, since the server time should catchup to the real time and not stay behind like this + mockBufferedTime.BufferedServerTime = 2f; + // if there was no buffer limit, we'd still be consuming the first "1" value + var interpolatedValue = interpolator.Update(1f); + // but now, we're still at the initial -1f + Assert.That(interpolatedValue, Is.EqualTo(-1f)); + + // interpolation continues as expected, interpolating between -1 and 3 + mockBufferedTime.BufferedServerTime = 3f; + interpolatedValue = interpolator.Update(1f); + Assert.That(interpolatedValue, Is.EqualTo(1f)); + } + + [Test] + public void TestUpdatingInterpolatorWithNoData() + { + var interpolator = new BufferedLinearInterpolatorFloat(); + var mockBufferedTime = new MockInterpolatorTime(0, k_MockTickRate); + interpolator.interpolatorTime = mockBufferedTime; + + // invalid case, this is undefined behaviour + Assert.Throws(() => interpolator.Update(1f)); } } } \ No newline at end of file From 796ab67004955973f64baf8a9cf135707c871d99 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Tue, 17 Aug 2021 16:48:25 -0400 Subject: [PATCH 028/113] # --- .../Tests/Editor/InterpolatorTests.cs | 30 +++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/com.unity.multiplayer.mlapi/Tests/Editor/InterpolatorTests.cs b/com.unity.multiplayer.mlapi/Tests/Editor/InterpolatorTests.cs index 1247c859f8..ea18a14f19 100644 --- a/com.unity.multiplayer.mlapi/Tests/Editor/InterpolatorTests.cs +++ b/com.unity.multiplayer.mlapi/Tests/Editor/InterpolatorTests.cs @@ -33,8 +33,6 @@ NetworkTime T(float time, int tickRate = k_MockTickRate) * test with some jitter * test with high jitter * test with too high jitter - * test with packet loss - * test with out of order because of network measurements * test with negative time should fail * check https://github.com/vis2k/Mirror/blob/02cc3de7b8889f477118e20379b584eaf8bd43b6/Assets/Mirror/Tests/Editor/SnapshotInterpolationTests.cs * for examples of tests @@ -285,5 +283,33 @@ public void TestUpdatingInterpolatorWithNoData() // invalid case, this is undefined behaviour Assert.Throws(() => interpolator.Update(1f)); } + + [Test] + public void TestDuplicatedValues() + { + var interpolator = new BufferedLinearInterpolatorFloat(); + var mockBufferedTime = new MockInterpolatorTime(0, k_MockTickRate); + interpolator.interpolatorTime = mockBufferedTime; + + interpolator.AddMeasurement(1f, T(1f)); + interpolator.AddMeasurement(2f, T(2f)); + interpolator.AddMeasurement(2f, T(2f)); + + mockBufferedTime.BufferedServerTime = 2f; + var interp = interpolator.Update(1f); + Assert.That(interp, Is.EqualTo(1f)); + mockBufferedTime.BufferedServerTime = 2.5f; + interp = interpolator.Update(0.5f); + Assert.That(interp, Is.EqualTo(1.5f)); + mockBufferedTime.BufferedServerTime = 3f; + interp = interpolator.Update(0.5f); + Assert.That(interp, Is.EqualTo(2f)); + mockBufferedTime.BufferedServerTime = 3.5f; + interp = interpolator.Update(0.5f); + Assert.That(interp, Is.EqualTo(2f)); + mockBufferedTime.BufferedServerTime = 4f; + interp = interpolator.Update(0.5f); + Assert.That(interp, Is.EqualTo(2f)); + } } } \ No newline at end of file From ebdc1fdca874d864e892c11207c5dabc7da884cf Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Tue, 17 Aug 2021 18:02:47 -0400 Subject: [PATCH 029/113] # --- .../Interpolator/BufferedLinearInterpolator.cs | 11 ++++++++++- .../Prototyping/NetworkTransform.cs | 8 ++++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolator.cs b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolator.cs index f5f1f89542..2309792dbb 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolator.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolator.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using NUnit.Framework; using UnityEngine; namespace Unity.Netcode @@ -164,6 +163,11 @@ public override Vector3 Interpolate(Vector3 start, Vector3 end, float time) { return Vector3.Lerp(start, end, time); } + + public BufferedLinearInterpolatorVector3(Vector3 startValue) + { + AddMeasurement(startValue, new NetworkTime(0, 0.0)); + } } public class BufferedLinearInterpolatorQuaternion : BufferedLinearInterpolator @@ -172,6 +176,11 @@ public override Quaternion Interpolate(Quaternion start, Quaternion end, float t { return Quaternion.Slerp(start, end, time); } + + public BufferedLinearInterpolatorQuaternion(Quaternion startValue) + { + AddMeasurement(startValue, new NetworkTime(0, 0.0)); + } } public class BufferedLinearInterpolatorFloat : BufferedLinearInterpolator diff --git a/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs b/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs index 2be4a5235c..f0427b69e6 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs @@ -7,7 +7,7 @@ namespace Unity.Netcode.Prototyping /// A prototype component for syncing transforms /// [AddComponentMenu("Netcode/" + nameof(NetworkTransform))] - [DefaultExecutionOrder(1000000)] + [DefaultExecutionOrder(1000000)] // this is needed to catch the update time after the transform was updated by user scripts public class NetworkTransform : NetworkBehaviour { /// @@ -270,9 +270,9 @@ private void UpdateNetVarPerms() private void Awake() { m_Transform = transform; - PositionInterpolator = new BufferedLinearInterpolatorVector3(); - RotationInterpolator = new BufferedLinearInterpolatorQuaternion(); - ScaleInterpolator = new BufferedLinearInterpolatorVector3(); + PositionInterpolator = new BufferedLinearInterpolatorVector3(TransformPosition); + RotationInterpolator = new BufferedLinearInterpolatorQuaternion(TransformRotation); + ScaleInterpolator = new BufferedLinearInterpolatorVector3(TransformScale); UpdateNetVarPerms(); From 2efc972864d041e50c080b34513c38c4c8aae09d Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Thu, 19 Aug 2021 21:22:56 -0400 Subject: [PATCH 030/113] fix, server can have 0 buffer --- .../Runtime/Timing/NetworkTimeSystem.cs | 24 +++---------------- 1 file changed, 3 insertions(+), 21 deletions(-) diff --git a/com.unity.multiplayer.mlapi/Runtime/Timing/NetworkTimeSystem.cs b/com.unity.multiplayer.mlapi/Runtime/Timing/NetworkTimeSystem.cs index 94245f269e..e7a7e80f60 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Timing/NetworkTimeSystem.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Timing/NetworkTimeSystem.cs @@ -30,25 +30,9 @@ public class NetworkTimeSystem /// /// Gets or sets the amount of the time in seconds the client should buffer incoming messages from the server. This increases server time. /// A higher value increases latency but makes the game look more smooth in bad networking conditions. - /// This value must be higher than the tick length. + /// This value must be higher than the tick length client side. /// - public double ServerBufferSec - { - get - { - return m_ServerBufferSec; - } - set - { - if (value < 0f || value < 1f / NetworkManager.Singleton.NetworkConfig.TickRate) - { - Debug.LogError($"Error setting buffer size to {value}, buffer time needs to be bigger than the tick length and bigger than zero. Setting value to minimum buffer size: {MinBufferSizeSec}"); - value = MinBufferSizeSec; - } - - m_ServerBufferSec = value; - } - } + public double ServerBufferSec { get; set; } /// /// Gets or sets a threshold in seconds used to force a hard catchup of network time. @@ -68,8 +52,6 @@ public double ServerBufferSec internal double LastSyncedRttSec { get; private set; } - public static double MinBufferSizeSec => 1f / NetworkManager.Singleton.NetworkConfig.TickRate; - public NetworkTimeSystem(double localBufferSec, double serverBufferSec, double hardResetThresholdSec, double adjustmentRatio = 0.01d) { LocalBufferSec = localBufferSec; @@ -85,7 +67,7 @@ public NetworkTimeSystem(double localBufferSec, double serverBufferSec, double h /// The instance. public static NetworkTimeSystem ServerTimeSystem() { - return new NetworkTimeSystem(0, MinBufferSizeSec, double.MaxValue); + return new NetworkTimeSystem(0, 0, double.MaxValue); } /// From ce03d581ef71c82f67a666819c819cda8635162e Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Mon, 23 Aug 2021 11:31:59 -0400 Subject: [PATCH 031/113] test fixes --- .../Prototyping/NetworkTransform.cs | 6 +++--- .../Tests/Runtime/NetworkTransformTests.cs | 12 ++++++++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs b/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs index f0427b69e6..32b78c75f8 100644 --- a/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs +++ b/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs @@ -69,9 +69,9 @@ public void NetworkSerialize(NetworkSerializer serializer) [SerializeField, Range(0, 120), Tooltip("The base amount of sends per seconds to use when range is disabled")] public float FixedSendsPerSecond = 30f; - protected virtual IInterpolator PositionInterpolator { get; set; } - protected virtual IInterpolator RotationInterpolator { get; set; } - protected virtual IInterpolator ScaleInterpolator { get; set; } + public virtual IInterpolator PositionInterpolator { get; set; } + public virtual IInterpolator RotationInterpolator { get; set; } + public virtual IInterpolator ScaleInterpolator { get; set; } private Transform m_Transform; // cache the transform component to reduce unnecessary bounce between managed and native diff --git a/com.unity.multiplayer.mlapi/Tests/Runtime/NetworkTransformTests.cs b/com.unity.multiplayer.mlapi/Tests/Runtime/NetworkTransformTests.cs index 60960d57a1..ba19f9629c 100644 --- a/com.unity.multiplayer.mlapi/Tests/Runtime/NetworkTransformTests.cs +++ b/com.unity.multiplayer.mlapi/Tests/Runtime/NetworkTransformTests.cs @@ -56,9 +56,15 @@ public IEnumerator TestAuthoritativeTransformChangeOneAtATime(bool testLocalTran var networkTransform = (authorityToTest == NetworkAuthority.Client ? m_ClientSideClientPlayer : m_ServerSideClientPlayer).GetComponent(); networkTransform.SetAuthority(authorityToTest); + networkTransform.PositionInterpolator = new NoInterpolator(); + networkTransform.RotationInterpolator = new NoInterpolator(); + networkTransform.ScaleInterpolator = new NoInterpolator(); var otherSideNetworkTransform = (authorityToTest == NetworkAuthority.Client ? m_ServerSideClientPlayer : m_ClientSideClientPlayer).GetComponent(); otherSideNetworkTransform.SetAuthority(authorityToTest); + otherSideNetworkTransform.PositionInterpolator = new NoInterpolator(); + otherSideNetworkTransform.RotationInterpolator = new NoInterpolator(); + otherSideNetworkTransform.ScaleInterpolator = new NoInterpolator(); static bool HasAuthorityFunc(NetworkTransform transform) { @@ -128,9 +134,15 @@ public IEnumerator TestCantChangeTransformFromOtherSideAuthority(NetworkAuthorit // test server can't change client authoritative transform var networkTransform = (authorityToTest == NetworkAuthority.Client ? m_ClientSideClientPlayer : m_ServerSideClientPlayer).GetComponent(); networkTransform.SetAuthority(authorityToTest); + networkTransform.PositionInterpolator = new NoInterpolator(); + networkTransform.RotationInterpolator = new NoInterpolator(); + networkTransform.ScaleInterpolator = new NoInterpolator(); var otherSideNetworkTransform = (authorityToTest == NetworkAuthority.Client ? m_ServerSideClientPlayer : m_ClientSideClientPlayer).GetComponent(); otherSideNetworkTransform.SetAuthority(authorityToTest); + otherSideNetworkTransform.PositionInterpolator = new NoInterpolator(); + otherSideNetworkTransform.RotationInterpolator = new NoInterpolator(); + otherSideNetworkTransform.ScaleInterpolator = new NoInterpolator(); Assert.AreEqual(Vector3.zero, otherSideNetworkTransform.transform.position, "other side pos should be zero at first"); // sanity check otherSideNetworkTransform.transform.position = new Vector3(4, 5, 6); From ad5d9ac59100983d9a32f451859bb0356e8e226c Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Mon, 23 Aug 2021 12:05:23 -0400 Subject: [PATCH 032/113] moving things to right place for future merge --- .../Prototyping/Interpolator.meta | 0 .../Prototyping/Interpolator/BufferedLinearInterpolator.cs | 0 .../Prototyping/Interpolator/BufferedLinearInterpolator.cs.meta | 0 .../Prototyping/Interpolator/IInterpolator.cs | 0 .../Prototyping/Interpolator/IInterpolator.cs.meta | 0 .../Prototyping/Interpolator/NoInterpolator.cs | 0 .../Prototyping/Interpolator/NoInterpolator.cs.meta | 0 .../Prototyping/Interpolator/SimpleInterpolator.cs | 0 .../Prototyping/Interpolator/SimpleInterpolator.cs.meta | 0 .../Prototyping/NetworkTransform.cs | 0 10 files changed, 0 insertions(+), 0 deletions(-) rename {com.unity.multiplayer.mlapi => com.unity.netcode.gameobjects}/Prototyping/Interpolator.meta (100%) rename {com.unity.multiplayer.mlapi => com.unity.netcode.gameobjects}/Prototyping/Interpolator/BufferedLinearInterpolator.cs (100%) rename {com.unity.multiplayer.mlapi => com.unity.netcode.gameobjects}/Prototyping/Interpolator/BufferedLinearInterpolator.cs.meta (100%) rename {com.unity.multiplayer.mlapi => com.unity.netcode.gameobjects}/Prototyping/Interpolator/IInterpolator.cs (100%) rename {com.unity.multiplayer.mlapi => com.unity.netcode.gameobjects}/Prototyping/Interpolator/IInterpolator.cs.meta (100%) rename {com.unity.multiplayer.mlapi => com.unity.netcode.gameobjects}/Prototyping/Interpolator/NoInterpolator.cs (100%) rename {com.unity.multiplayer.mlapi => com.unity.netcode.gameobjects}/Prototyping/Interpolator/NoInterpolator.cs.meta (100%) rename {com.unity.multiplayer.mlapi => com.unity.netcode.gameobjects}/Prototyping/Interpolator/SimpleInterpolator.cs (100%) rename {com.unity.multiplayer.mlapi => com.unity.netcode.gameobjects}/Prototyping/Interpolator/SimpleInterpolator.cs.meta (100%) rename {com.unity.multiplayer.mlapi => com.unity.netcode.gameobjects}/Prototyping/NetworkTransform.cs (100%) diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator.meta b/com.unity.netcode.gameobjects/Prototyping/Interpolator.meta similarity index 100% rename from com.unity.multiplayer.mlapi/Prototyping/Interpolator.meta rename to com.unity.netcode.gameobjects/Prototyping/Interpolator.meta diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolator.cs b/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs similarity index 100% rename from com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolator.cs rename to com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolator.cs.meta b/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs.meta similarity index 100% rename from com.unity.multiplayer.mlapi/Prototyping/Interpolator/BufferedLinearInterpolator.cs.meta rename to com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs.meta diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/IInterpolator.cs b/com.unity.netcode.gameobjects/Prototyping/Interpolator/IInterpolator.cs similarity index 100% rename from com.unity.multiplayer.mlapi/Prototyping/Interpolator/IInterpolator.cs rename to com.unity.netcode.gameobjects/Prototyping/Interpolator/IInterpolator.cs diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/IInterpolator.cs.meta b/com.unity.netcode.gameobjects/Prototyping/Interpolator/IInterpolator.cs.meta similarity index 100% rename from com.unity.multiplayer.mlapi/Prototyping/Interpolator/IInterpolator.cs.meta rename to com.unity.netcode.gameobjects/Prototyping/Interpolator/IInterpolator.cs.meta diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolator.cs b/com.unity.netcode.gameobjects/Prototyping/Interpolator/NoInterpolator.cs similarity index 100% rename from com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolator.cs rename to com.unity.netcode.gameobjects/Prototyping/Interpolator/NoInterpolator.cs diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolator.cs.meta b/com.unity.netcode.gameobjects/Prototyping/Interpolator/NoInterpolator.cs.meta similarity index 100% rename from com.unity.multiplayer.mlapi/Prototyping/Interpolator/NoInterpolator.cs.meta rename to com.unity.netcode.gameobjects/Prototyping/Interpolator/NoInterpolator.cs.meta diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/SimpleInterpolator.cs b/com.unity.netcode.gameobjects/Prototyping/Interpolator/SimpleInterpolator.cs similarity index 100% rename from com.unity.multiplayer.mlapi/Prototyping/Interpolator/SimpleInterpolator.cs rename to com.unity.netcode.gameobjects/Prototyping/Interpolator/SimpleInterpolator.cs diff --git a/com.unity.multiplayer.mlapi/Prototyping/Interpolator/SimpleInterpolator.cs.meta b/com.unity.netcode.gameobjects/Prototyping/Interpolator/SimpleInterpolator.cs.meta similarity index 100% rename from com.unity.multiplayer.mlapi/Prototyping/Interpolator/SimpleInterpolator.cs.meta rename to com.unity.netcode.gameobjects/Prototyping/Interpolator/SimpleInterpolator.cs.meta diff --git a/com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs b/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs similarity index 100% rename from com.unity.multiplayer.mlapi/Prototyping/NetworkTransform.cs rename to com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs From 43ef52481a0de51ea4c44e91b1ca1398192ee58c Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Mon, 23 Aug 2021 15:06:56 -0400 Subject: [PATCH 033/113] moving tests too --- .../Tests/Editor/InterpolatorTests.cs | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {com.unity.multiplayer.mlapi => com.unity.netcode.gameobjects}/Tests/Editor/InterpolatorTests.cs (100%) diff --git a/com.unity.multiplayer.mlapi/Tests/Editor/InterpolatorTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/InterpolatorTests.cs similarity index 100% rename from com.unity.multiplayer.mlapi/Tests/Editor/InterpolatorTests.cs rename to com.unity.netcode.gameobjects/Tests/Editor/InterpolatorTests.cs From f3d14f9c214b1e7c4e1a5258e0ad66e07f69b10d Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Mon, 23 Aug 2021 16:42:09 -0400 Subject: [PATCH 034/113] fix --- .../BufferedLinearInterpolator.cs | 34 +- .../Prototyping/NetworkTransform.cs | 359 +++++++++++------- .../NetworkTransformStateTests.cs | 102 ++--- testproject/Assets/Scenes/ZooSam.unity | 21 +- 4 files changed, 288 insertions(+), 228 deletions(-) diff --git a/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs b/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs index 2309792dbb..a78f161de0 100644 --- a/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs +++ b/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs @@ -50,6 +50,10 @@ private struct BufferedItem private int m_LifetimeConsumedCount; + public BufferedLinearInterpolator() + { + } + public void Start() { } @@ -157,37 +161,15 @@ public void OnDestroy() public abstract T Interpolate(T start, T end, float time); } - public class BufferedLinearInterpolatorVector3 : BufferedLinearInterpolator - { - public override Vector3 Interpolate(Vector3 start, Vector3 end, float time) - { - return Vector3.Lerp(start, end, time); - } - - public BufferedLinearInterpolatorVector3(Vector3 startValue) - { - AddMeasurement(startValue, new NetworkTime(0, 0.0)); - } - } - - public class BufferedLinearInterpolatorQuaternion : BufferedLinearInterpolator - { - public override Quaternion Interpolate(Quaternion start, Quaternion end, float time) - { - return Quaternion.Slerp(start, end, time); - } - - public BufferedLinearInterpolatorQuaternion(Quaternion startValue) - { - AddMeasurement(startValue, new NetworkTime(0, 0.0)); - } - } - public class BufferedLinearInterpolatorFloat : BufferedLinearInterpolator { public override float Interpolate(float start, float end, float time) { return Mathf.Lerp(start, end, time); } + + public BufferedLinearInterpolatorFloat() + { + } } } \ No newline at end of file diff --git a/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs b/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs index 3191add242..fdf731f621 100644 --- a/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs @@ -1,4 +1,6 @@ using System; +using System.Collections; +using System.Collections.Generic; using UnityEngine; namespace Unity.Netcode.Prototyping @@ -82,7 +84,49 @@ public bool HasScaleZ public float PositionX, PositionY, PositionZ; public float RotAngleX, RotAngleY, RotAngleZ; public float ScaleX, ScaleY, ScaleZ; - public double SentTime; + public double SentTime; + + public Vector3 Position + { + get + { + return new Vector3(PositionX, PositionY, PositionZ); + } + set + { + PositionX = value.x; + PositionY = value.y; + PositionZ = value.z; + } + } + + public Vector3 Rotation + { + get + { + return new Vector3(RotAngleX, RotAngleY, RotAngleZ); + } + set + { + RotAngleX = value.x; + RotAngleY = value.y; + RotAngleZ = value.z; + } + } + + public Vector3 Scale + { + get + { + return new Vector3(ScaleX, ScaleY, ScaleZ); + } + set + { + ScaleX = value.x; + ScaleY = value.y; + ScaleZ = value.z; + } + } public void NetworkSerialize(NetworkSerializer serializer) { @@ -158,9 +202,52 @@ public void NetworkSerialize(NetworkSerializer serializer) [SerializeField, Range(0, 120), Tooltip("The base amount of sends per seconds to use when range is disabled")] public float FixedSendsPerSecond = 30f; - public virtual IInterpolator PositionInterpolator { get; set; } - public virtual IInterpolator RotationInterpolator { get; set; } - public virtual IInterpolator ScaleInterpolator { get; set; } + public virtual IInterpolator PositionXInterpolator { get; set; } + public virtual IInterpolator PositionYInterpolator { get; set; } + public virtual IInterpolator PositionZInterpolator { get; set; } + + public virtual IInterpolator RotationXInterpolator { get; set; } + public virtual IInterpolator RotationYInterpolator { get; set; } + public virtual IInterpolator RotationZInterpolator { get; set; } + public virtual IInterpolator ScaleXInterpolator { get; set; } + public virtual IInterpolator ScaleYInterpolator { get; set; } + public virtual IInterpolator ScaleZInterpolator { get; set; } + + public void SetInterpolator() where T : IInterpolator, new() + { + var tickRate = NetworkManager.Singleton.NetworkConfig.TickRate; + PositionXInterpolator = new T(); + PositionXInterpolator.AddMeasurement(TransformPosition.x, new NetworkTime(tickRate, 0.0)); + PositionYInterpolator = new T(); + PositionYInterpolator.AddMeasurement(TransformPosition.y, new NetworkTime(tickRate, 0.0)); + PositionZInterpolator = new T(); + PositionZInterpolator.AddMeasurement(TransformPosition.z, new NetworkTime(tickRate, 0.0)); + RotationXInterpolator = new T(); + RotationXInterpolator.AddMeasurement(TransformRotation.eulerAngles.x, new NetworkTime(tickRate, 0.0)); + RotationYInterpolator = new T(); + RotationYInterpolator.AddMeasurement(TransformRotation.eulerAngles.y, new NetworkTime(tickRate, 0.0)); + RotationZInterpolator = new T(); + RotationZInterpolator.AddMeasurement(TransformRotation.eulerAngles.z, new NetworkTime(tickRate, 0.0)); + ScaleXInterpolator = new T(); + ScaleXInterpolator.AddMeasurement(TransformScale.x, new NetworkTime(tickRate, 0.0)); + ScaleYInterpolator = new T(); + ScaleYInterpolator.AddMeasurement(TransformScale.y, new NetworkTime(tickRate, 0.0)); + ScaleZInterpolator = new T(); + ScaleZInterpolator.AddMeasurement(TransformScale.z, new NetworkTime(tickRate, 0.0)); + } + + public IEnumerable> AllInterpolators() + { + yield return PositionXInterpolator; + yield return PositionYInterpolator; + yield return PositionZInterpolator; + yield return RotationXInterpolator; + yield return RotationYInterpolator; + yield return RotationZInterpolator; + yield return ScaleXInterpolator; + yield return ScaleYInterpolator; + yield return ScaleZInterpolator; + } private Transform m_Transform; // cache the transform component to reduce unnecessary bounce between managed and native @@ -214,7 +301,7 @@ private Vector3 TransformScale // updates `NetworkState` properties if they need to and returns a `bool` indicating whether or not there was any changes made // returned boolean would be useful to change encapsulating `NetworkVariable`'s dirty state, e.g. ReplNetworkState.SetDirty(isDirty); - internal bool UpdateNetworkState(ref NetworkState networkState) + internal bool UpdateNetworkStateCheckDirty(ref NetworkState networkState, double dirtyTime) { var position = InLocalSpace ? m_Transform.localPosition : m_Transform.position; var rotAngles = InLocalSpace ? m_Transform.localEulerAngles : m_Transform.eulerAngles; @@ -309,90 +396,109 @@ internal bool UpdateNetworkState(ref NetworkState networkState) isDirty |= true; } + if (isDirty) + { + networkState.SentTime = dirtyTime; + } + return isDirty; } - // TODO: temporary! the function body below probably needs to be rewritten later with interpolation in mind - internal void ApplyNetworkState(NetworkState networkState) + internal void ApplyNetworkStateFromAuthority(NetworkState networkState) { PrevNetworkState = networkState; - var position = InLocalSpace ? m_Transform.localPosition : m_Transform.position; - var rotAngles = InLocalSpace ? m_Transform.localEulerAngles : m_Transform.eulerAngles; - var scale = InLocalSpace ? m_Transform.localScale : m_Transform.lossyScale; + var interpolatedPosition = InLocalSpace ? m_Transform.localPosition : m_Transform.position; + var interpolatedRotAngles = InLocalSpace ? m_Transform.localEulerAngles : m_Transform.eulerAngles; + var interpolatedScale = InLocalSpace ? m_Transform.localScale : m_Transform.lossyScale; // InLocalSpace Read InLocalSpace = networkState.InLocalSpace; // Position Read if (networkState.HasPositionX) { - position.x = networkState.PositionX; + interpolatedPosition.x = PositionXInterpolator.GetInterpolatedValue(); } + if (networkState.HasPositionY) { - position.y = networkState.PositionY; + interpolatedPosition.y = PositionYInterpolator.GetInterpolatedValue(); } + if (networkState.HasPositionZ) { - position.z = networkState.PositionZ; + interpolatedPosition.z = PositionZInterpolator.GetInterpolatedValue(); } + // RotAngles Read if (networkState.HasRotAngleX) { - rotAngles.x = networkState.RotAngleX; + interpolatedRotAngles.x = RotationXInterpolator.GetInterpolatedValue(); } + if (networkState.HasRotAngleY) { - rotAngles.y = networkState.RotAngleY; + interpolatedRotAngles.y = RotationYInterpolator.GetInterpolatedValue(); } + if (networkState.HasRotAngleZ) { - rotAngles.z = networkState.RotAngleZ; + interpolatedRotAngles.z = RotationZInterpolator.GetInterpolatedValue(); } + // Scale Read if (networkState.HasScaleX) { - scale.x = networkState.ScaleX; + interpolatedScale.x = ScaleXInterpolator.GetInterpolatedValue(); } + if (networkState.HasScaleY) { - scale.y = networkState.ScaleY; + interpolatedScale.y = ScaleYInterpolator.GetInterpolatedValue(); } + if (networkState.HasScaleZ) { - scale.z = networkState.ScaleZ; + interpolatedScale.z = ScaleZInterpolator.GetInterpolatedValue(); } + PrevNetworkState = networkState; // Position Apply if (networkState.HasPositionX || networkState.HasPositionY || networkState.HasPositionZ) { if (InLocalSpace) { - m_Transform.localPosition = position; + m_Transform.localPosition = interpolatedPosition; } else { - m_Transform.position = position; + m_Transform.position = interpolatedPosition; } + + PrevNetworkState.Position = interpolatedPosition; } + // RotAngles Apply if (networkState.HasRotAngleX || networkState.HasRotAngleY || networkState.HasRotAngleZ) { if (InLocalSpace) { - m_Transform.localEulerAngles = rotAngles; + m_Transform.localEulerAngles = interpolatedRotAngles; } else { - m_Transform.eulerAngles = rotAngles; + m_Transform.eulerAngles = interpolatedRotAngles; } + + PrevNetworkState.Rotation = interpolatedRotAngles; } + // Scale Apply if (networkState.HasScaleX || networkState.HasScaleY || networkState.HasScaleZ) { if (InLocalSpace) { - m_Transform.localScale = scale; + m_Transform.localScale = interpolatedScale; } else { @@ -400,125 +506,99 @@ internal void ApplyNetworkState(NetworkState networkState) var lossyScale = m_Transform.lossyScale; m_Transform.localScale = new Vector3(networkState.ScaleX / lossyScale.x, networkState.ScaleY / lossyScale.y, networkState.ScaleZ / lossyScale.z); } - } - } - private bool IsGhostStateDirty(NetworkState networkState) - { - if (networkState == null) - { - return false; - } - bool isDirty = false; - - isDirty |= networkState.InLocalSpace != InLocalSpace; - if (InLocalSpace) - { - isDirty |= networkState.Position != PositionInterpolator.GetInterpolatedValue(); - isDirty |= networkState.Rotation != RotationInterpolator.GetInterpolatedValue(); - isDirty |= networkState.Scale != ScaleInterpolator.GetInterpolatedValue(); + PrevNetworkState.Scale = interpolatedScale; } - else - { - isDirty |= networkState.Position != PositionInterpolator.GetInterpolatedValue(); - isDirty |= networkState.Rotation != RotationInterpolator.GetInterpolatedValue(); - isDirty |= networkState.Scale != ScaleInterpolator.GetInterpolatedValue(); - } - - return isDirty; } // Is the non-interpolated authoritative state dirty? private bool IsAuthoritativeTransformDirty() { bool isDirty = false; - var networkState = m_NetworkState.Value; + var networkState = ReplNetworkState.Value; isDirty |= networkState.InLocalSpace != InLocalSpace; if (InLocalSpace) { isDirty |= networkState.Position != m_Transform.localPosition; - isDirty |= networkState.Rotation != m_Transform.localRotation; + isDirty |= networkState.Rotation != m_Transform.localEulerAngles; isDirty |= networkState.Scale != m_Transform.localScale; } else { isDirty |= networkState.Position != m_Transform.position; - isDirty |= networkState.Rotation != m_Transform.rotation; + isDirty |= networkState.Rotation != m_Transform.eulerAngles; isDirty |= networkState.Scale != m_Transform.lossyScale; } return isDirty; } - private void SetNetworkStateDirtyToGhosts(double dirtyTime) + private void OnNetworkStateChanged(NetworkState oldState, NetworkState newState) { - m_NetworkState.Value.InLocalSpace = InLocalSpace; - m_NetworkState.Value.SentTime = dirtyTime; - if (InLocalSpace) + if (!NetworkObject.IsSpawned) { - m_NetworkState.Value.Position = m_Transform.localPosition; - m_NetworkState.Value.Rotation = m_Transform.localRotation; - m_NetworkState.Value.Scale = m_Transform.localScale; + // todo MTT-849 should never happen but yet it does! maybe revisit/dig after NetVar updates and snapshot system lands? + return; } - else + + // todo for teleport, check teleport flag + // if (newState.Teleporting) + // { + // PositionInterpolator.Reset(newState.Position, new NetworkTime(NetworkManager.Singleton.ServerTime.TickRate, newState.SentTick)); + // } + + var sentTime = new NetworkTime(NetworkManager.Singleton.ServerTime.TickRate, newState.SentTime); + + if (newState.HasPositionX) { - m_NetworkState.Value.Position = m_Transform.position; - m_NetworkState.Value.Rotation = m_Transform.rotation; - m_NetworkState.Value.Scale = m_Transform.lossyScale; + PositionXInterpolator.AddMeasurement(newState.Position.x, sentTime); } - m_NetworkState.SetDirty(true); - } + if (newState.HasPositionY) + { + PositionYInterpolator.AddMeasurement(newState.Position.y, sentTime); + } - private void ApplyInterpolatedStateFromAuthority(NetworkState netState) - { - InLocalSpace = netState.InLocalSpace; - if (InLocalSpace) + if (newState.HasPositionZ) { - m_Transform.localPosition = PositionInterpolator.GetInterpolatedValue(); - m_Transform.localRotation = RotationInterpolator.GetInterpolatedValue(); - m_Transform.localScale = ScaleInterpolator.GetInterpolatedValue(); + PositionZInterpolator.AddMeasurement(newState.Position.z, sentTime); } - else + + if (newState.HasRotAngleX) { - m_Transform.position = PositionInterpolator.GetInterpolatedValue(); - m_Transform.rotation = RotationInterpolator.GetInterpolatedValue(); - m_Transform.localScale = Vector3.one; - var lossyScale = m_Transform.lossyScale; - m_Transform.localScale = new Vector3(ScaleInterpolator.GetInterpolatedValue().x / lossyScale.x, ScaleInterpolator.GetInterpolatedValue().y / lossyScale.y, ScaleInterpolator.GetInterpolatedValue().z / lossyScale.z); + RotationXInterpolator.AddMeasurement(newState.RotAngleX, sentTime); } - m_PrevNetworkState = netState; - m_PrevNetworkState.Position = PositionInterpolator.GetInterpolatedValue(); - m_PrevNetworkState.Rotation = RotationInterpolator.GetInterpolatedValue(); - m_PrevNetworkState.Scale = ScaleInterpolator.GetInterpolatedValue(); - } - private void OnNetworkStateChanged(NetworkState oldState, NetworkState newState) - { - if (!NetworkObject.IsSpawned) + if (newState.HasRotAngleY) { - // todo MTT-849 should never happen but yet it does! maybe revisit/dig after NetVar updates and snapshot system lands? - return; + RotationYInterpolator.AddMeasurement(newState.RotAngleY, sentTime); } - // todo for teleport, check teleport flag - // if (newState.Teleporting) - // { - // PositionInterpolator.Reset(newState.Position, new NetworkTime(NetworkManager.Singleton.ServerTime.TickRate, newState.SentTick)); - // } + if (newState.HasRotAngleZ) + { + RotationZInterpolator.AddMeasurement(newState.RotAngleZ, sentTime); + } - var sentTime = new NetworkTime(NetworkManager.Singleton.ServerTime.TickRate, newState.SentTime); - PositionInterpolator.AddMeasurement(newState.Position, sentTime); - RotationInterpolator.AddMeasurement(newState.Rotation, sentTime); - ScaleInterpolator.AddMeasurement(newState.Scale, sentTime); + if (newState.HasScaleX) + { + ScaleXInterpolator.AddMeasurement(newState.ScaleX, sentTime); + } + + if (newState.HasScaleY) + { + ScaleYInterpolator.AddMeasurement(newState.ScaleY, sentTime); + } + + if (newState.HasScaleZ) + { + ScaleZInterpolator.AddMeasurement(newState.ScaleZ, sentTime); + } } private void Awake() { m_Transform = transform; - PositionInterpolator = new BufferedLinearInterpolatorVector3(TransformPosition); - RotationInterpolator = new BufferedLinearInterpolatorQuaternion(TransformRotation); - ScaleInterpolator = new BufferedLinearInterpolatorVector3(TransformScale); + SetInterpolator(); ReplNetworkState.Settings.SendNetworkChannel = Channel; ReplNetworkState.Settings.SendTickrate = FixedSendsPerSecond; @@ -528,54 +608,37 @@ private void Awake() public void Start() { - PositionInterpolator.Start(); - RotationInterpolator.Start(); - ScaleInterpolator.Start(); + foreach (var interpolator in AllInterpolators()) + { + interpolator.Start(); + } } public void OnEnable() { - PositionInterpolator.OnEnable(); - RotationInterpolator.OnEnable(); - ScaleInterpolator.OnEnable(); + foreach (var interpolator in AllInterpolators()) + { + interpolator.OnEnable(); + } } public override void OnNetworkSpawn() { - m_PrevNetworkState = null; + var currentTime = new NetworkTime(NetworkManager.Singleton.ServerTime.TickRate, ReplNetworkState.Value.SentTime); - var currentTime = new NetworkTime(NetworkManager.Singleton.ServerTime.TickRate, m_NetworkState.Value.SentTime); - - PositionInterpolator.OnNetworkSpawn(); - RotationInterpolator.OnNetworkSpawn(); - ScaleInterpolator.OnNetworkSpawn(); + foreach (var interpolator in AllInterpolators()) + { + interpolator.OnNetworkSpawn(); + } } + private void OnDestroy() { ReplNetworkState.OnValueChanged -= OnNetworkStateChanged; - PositionInterpolator.OnDestroy(); - RotationInterpolator.OnDestroy(); - ScaleInterpolator.OnDestroy(); - } - - private void FixedUpdate() - { - if (!NetworkObject.IsSpawned) - { - return; - } - - if (IsServer) + foreach (var interpolator in AllInterpolators()) { - ReplNetworkState.SetDirty(UpdateNetworkState(ref ReplNetworkState.ValueRef)); - } - // try to update previously consumed NetworkState - // if we have any changes, that means made some updates locally - // we apply the latest ReplNetworkState again to revert our changes - else if (UpdateNetworkState(ref PrevNetworkState)) - { - ApplyNetworkState(ReplNetworkState.Value); + interpolator.OnDestroy(); } } @@ -586,17 +649,21 @@ private void FixedUpdate() return; } - if (!CanUpdateTransform) + // try to update previously consumed NetworkState + // if we have any changes, that means made some updates locally + // we apply the latest ReplNetworkState again to revert our changes + if (!IsServer) { - if (IsGhostStateDirty(m_PrevNetworkState)) + if (UpdateNetworkStateCheckDirty(ref PrevNetworkState, 0)) // todo figure what time should be here { - Debug.LogWarning("A local change without authority detected, revert back to latest network state!", this); - ApplyInterpolatedStateFromAuthority(m_NetworkState.Value); + Debug.LogWarning("A local change without authority detected, reverting back to latest network state!", this); + ApplyNetworkStateFromAuthority(ReplNetworkState.Value); } - PositionInterpolator.FixedUpdate(NetworkManager.ServerTime.FixedDeltaTime); - RotationInterpolator.FixedUpdate(NetworkManager.ServerTime.FixedDeltaTime); - ScaleInterpolator.FixedUpdate(NetworkManager.ServerTime.FixedDeltaTime); + foreach (var interpolator in AllInterpolators()) + { + interpolator.FixedUpdate(NetworkManager.ServerTime.FixedDeltaTime); + } } } @@ -607,21 +674,23 @@ private void Update() return; } - if (CanUpdateTransform) + if (IsServer) { if (IsAuthoritativeTransformDirty()) { // check for time there was a change to the transform // this needs to be done in Update to catch that time change as soon as it happens. - SetNetworkStateDirtyToGhosts(NetworkManager.LocalTime.Time); + ReplNetworkState.SetDirty(UpdateNetworkStateCheckDirty(ref ReplNetworkState.ValueRef, NetworkManager.LocalTime.Time)); } } else if (NetworkManager.Singleton.IsConnectedClient || NetworkManager.Singleton.IsListening) { - PositionInterpolator.Update(Time.deltaTime); - RotationInterpolator.Update(Time.deltaTime); - ScaleInterpolator.Update(Time.deltaTime); - ApplyInterpolatedStateFromAuthority(m_NetworkState.Value); + foreach (var interpolator in AllInterpolators()) + { + interpolator.Update(Time.deltaTime); + } + + ApplyNetworkStateFromAuthority(ReplNetworkState.Value); } } diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/NetworkTransformStateTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/NetworkTransformStateTests.cs index 1cae896568..3d5c94c090 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/NetworkTransformStateTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/NetworkTransformStateTests.cs @@ -66,16 +66,16 @@ public void TestSyncAxes( networkTransform.transform.eulerAngles = new Vector3(30, 45, 90); networkTransform.transform.localScale = new Vector3(1.1f, 0.5f, 2.5f); - bool isDirty = networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef); + bool isDirty = networkTransform.UpdateNetworkStateCheckDirty(ref networkTransform.ReplNetworkState.ValueRef, 0); networkTransform.ReplNetworkState.SetDirty(isDirty); Assert.IsTrue(isDirty); } // Step 2: apply current state locally, expect state to be not dirty/different { - networkTransform.ApplyNetworkState(networkTransform.ReplNetworkState.Value); + networkTransform.ApplyNetworkStateFromAuthority(networkTransform.ReplNetworkState.Value); - bool isDirty = networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef); + bool isDirty = networkTransform.UpdateNetworkStateCheckDirty(ref networkTransform.ReplNetworkState.ValueRef, 0); Assert.IsFalse(isDirty); } @@ -92,7 +92,7 @@ public void TestSyncAxes( position.x++; networkTransform.transform.position = position; - Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); + Assert.IsFalse(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransform.ReplNetworkState.ValueRef, 0)); } // SyncPositionY { @@ -101,7 +101,7 @@ public void TestSyncAxes( position.y++; networkTransform.transform.position = position; - Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); + Assert.IsFalse(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransform.ReplNetworkState.ValueRef, 0)); } // SyncPositionZ { @@ -110,7 +110,7 @@ public void TestSyncAxes( position.z++; networkTransform.transform.position = position; - Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); + Assert.IsFalse(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransform.ReplNetworkState.ValueRef, 0)); } // SyncRotAngleX @@ -120,7 +120,7 @@ public void TestSyncAxes( rotAngles.x++; networkTransform.transform.eulerAngles = rotAngles; - Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); + Assert.IsFalse(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransform.ReplNetworkState.ValueRef, 0)); } // SyncRotAngleY { @@ -129,7 +129,7 @@ public void TestSyncAxes( rotAngles.y++; networkTransform.transform.eulerAngles = rotAngles; - Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); + Assert.IsFalse(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransform.ReplNetworkState.ValueRef, 0)); } // SyncRotAngleZ { @@ -138,7 +138,7 @@ public void TestSyncAxes( rotAngles.z++; networkTransform.transform.eulerAngles = rotAngles; - Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); + Assert.IsFalse(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransform.ReplNetworkState.ValueRef, 0)); } // SyncScaleX @@ -148,7 +148,7 @@ public void TestSyncAxes( scale.x++; networkTransform.transform.localScale = scale; - Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); + Assert.IsFalse(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransform.ReplNetworkState.ValueRef, 0)); } // SyncScaleY { @@ -157,7 +157,7 @@ public void TestSyncAxes( scale.y++; networkTransform.transform.localScale = scale; - Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); + Assert.IsFalse(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransform.ReplNetworkState.ValueRef, 0)); } // SyncScaleZ { @@ -166,7 +166,7 @@ public void TestSyncAxes( scale.z++; networkTransform.transform.localScale = scale; - Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); + Assert.IsFalse(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransform.ReplNetworkState.ValueRef, 0)); } } @@ -227,16 +227,16 @@ public void TestThresholds( networkTransform.transform.eulerAngles = new Vector3(30, 45, 90); networkTransform.transform.localScale = new Vector3(1.1f, 0.5f, 2.5f); - bool isDirty = networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef); + bool isDirty = networkTransform.UpdateNetworkStateCheckDirty(ref networkTransform.ReplNetworkState.ValueRef, 0); networkTransform.ReplNetworkState.SetDirty(isDirty); Assert.IsTrue(isDirty); } // Step 2: apply current state locally, expect state to be not dirty/different { - networkTransform.ApplyNetworkState(networkTransform.ReplNetworkState.Value); + networkTransform.ApplyNetworkStateFromAuthority(networkTransform.ReplNetworkState.Value); - bool isDirty = networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef); + bool isDirty = networkTransform.UpdateNetworkStateCheckDirty(ref networkTransform.ReplNetworkState.ValueRef, 0); Assert.IsFalse(isDirty); } @@ -253,42 +253,42 @@ public void TestThresholds( { position.x += positionThreshold / 2; networkTransform.transform.position = position; - Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); + Assert.IsFalse(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransform.ReplNetworkState.ValueRef, 0)); position.x += positionThreshold * 2; networkTransform.transform.position = position; - Assert.IsTrue(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); + Assert.IsTrue(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransform.ReplNetworkState.ValueRef, 0)); - networkTransform.ApplyNetworkState(networkTransform.ReplNetworkState.Value); - Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); + networkTransform.ApplyNetworkStateFromAuthority(networkTransform.ReplNetworkState.Value); + Assert.IsFalse(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransform.ReplNetworkState.ValueRef, 0)); } // PositionY { position.y += positionThreshold / 2; networkTransform.transform.position = position; - Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); + Assert.IsFalse(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransform.ReplNetworkState.ValueRef, 0)); position.y += positionThreshold * 2; networkTransform.transform.position = position; - Assert.IsTrue(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); + Assert.IsTrue(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransform.ReplNetworkState.ValueRef, 0)); - networkTransform.ApplyNetworkState(networkTransform.ReplNetworkState.Value); - Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); + networkTransform.ApplyNetworkStateFromAuthority(networkTransform.ReplNetworkState.Value); + Assert.IsFalse(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransform.ReplNetworkState.ValueRef, 0)); } // PositionZ { position.z += positionThreshold / 2; networkTransform.transform.position = position; - Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); + Assert.IsFalse(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransform.ReplNetworkState.ValueRef, 0)); position.z += positionThreshold * 2; networkTransform.transform.position = position; - Assert.IsTrue(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); + Assert.IsTrue(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransform.ReplNetworkState.ValueRef, 0)); - networkTransform.ApplyNetworkState(networkTransform.ReplNetworkState.Value); - Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); + networkTransform.ApplyNetworkStateFromAuthority(networkTransform.ReplNetworkState.Value); + Assert.IsFalse(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransform.ReplNetworkState.ValueRef, 0)); } } @@ -301,42 +301,42 @@ public void TestThresholds( { rotAngles.x += rotAngleThreshold / 2; networkTransform.transform.eulerAngles = rotAngles; - Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); + Assert.IsFalse(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransform.ReplNetworkState.ValueRef, 0)); rotAngles.x += rotAngleThreshold * 2; networkTransform.transform.eulerAngles = rotAngles; - Assert.IsTrue(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); + Assert.IsTrue(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransform.ReplNetworkState.ValueRef, 0)); - networkTransform.ApplyNetworkState(networkTransform.ReplNetworkState.Value); - Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); + networkTransform.ApplyNetworkStateFromAuthority(networkTransform.ReplNetworkState.Value); + Assert.IsFalse(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransform.ReplNetworkState.ValueRef, 0)); } // RotAngleY { rotAngles.y += rotAngleThreshold / 2; networkTransform.transform.eulerAngles = rotAngles; - Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); + Assert.IsFalse(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransform.ReplNetworkState.ValueRef, 0)); rotAngles.y += rotAngleThreshold * 2; networkTransform.transform.eulerAngles = rotAngles; - Assert.IsTrue(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); + Assert.IsTrue(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransform.ReplNetworkState.ValueRef, 0)); - networkTransform.ApplyNetworkState(networkTransform.ReplNetworkState.Value); - Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); + networkTransform.ApplyNetworkStateFromAuthority(networkTransform.ReplNetworkState.Value); + Assert.IsFalse(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransform.ReplNetworkState.ValueRef, 0)); } // RotAngleZ { rotAngles.z += rotAngleThreshold / 2; networkTransform.transform.eulerAngles = rotAngles; - Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); + Assert.IsFalse(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransform.ReplNetworkState.ValueRef, 0)); rotAngles.z += rotAngleThreshold * 2; networkTransform.transform.eulerAngles = rotAngles; - Assert.IsTrue(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); + Assert.IsTrue(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransform.ReplNetworkState.ValueRef, 0)); - networkTransform.ApplyNetworkState(networkTransform.ReplNetworkState.Value); - Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); + networkTransform.ApplyNetworkStateFromAuthority(networkTransform.ReplNetworkState.Value); + Assert.IsFalse(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransform.ReplNetworkState.ValueRef, 0)); } } @@ -349,42 +349,42 @@ public void TestThresholds( { scale.x += scaleThreshold / 2; networkTransform.transform.localScale = scale; - Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); + Assert.IsFalse(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransform.ReplNetworkState.ValueRef, 0)); scale.x += scaleThreshold * 2; networkTransform.transform.localScale = scale; - Assert.IsTrue(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); + Assert.IsTrue(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransform.ReplNetworkState.ValueRef, 0)); - networkTransform.ApplyNetworkState(networkTransform.ReplNetworkState.Value); - Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); + networkTransform.ApplyNetworkStateFromAuthority(networkTransform.ReplNetworkState.Value); + Assert.IsFalse(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransform.ReplNetworkState.ValueRef, 0)); } // ScaleY { scale.y += scaleThreshold / 2; networkTransform.transform.localScale = scale; - Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); + Assert.IsFalse(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransform.ReplNetworkState.ValueRef, 0)); scale.y += scaleThreshold * 2; networkTransform.transform.localScale = scale; - Assert.IsTrue(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); + Assert.IsTrue(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransform.ReplNetworkState.ValueRef, 0)); - networkTransform.ApplyNetworkState(networkTransform.ReplNetworkState.Value); - Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); + networkTransform.ApplyNetworkStateFromAuthority(networkTransform.ReplNetworkState.Value); + Assert.IsFalse(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransform.ReplNetworkState.ValueRef, 0)); } // ScaleZ { scale.z += scaleThreshold / 2; networkTransform.transform.localScale = scale; - Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); + Assert.IsFalse(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransform.ReplNetworkState.ValueRef, 0)); scale.z += scaleThreshold * 2; networkTransform.transform.localScale = scale; - Assert.IsTrue(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); + Assert.IsTrue(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransform.ReplNetworkState.ValueRef, 0)); - networkTransform.ApplyNetworkState(networkTransform.ReplNetworkState.Value); - Assert.IsFalse(networkTransform.UpdateNetworkState(ref networkTransform.ReplNetworkState.ValueRef)); + networkTransform.ApplyNetworkStateFromAuthority(networkTransform.ReplNetworkState.Value); + Assert.IsFalse(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransform.ReplNetworkState.ValueRef, 0)); } } } diff --git a/testproject/Assets/Scenes/ZooSam.unity b/testproject/Assets/Scenes/ZooSam.unity index 60d8a94c3e..d828af14fd 100644 --- a/testproject/Assets/Scenes/ZooSam.unity +++ b/testproject/Assets/Scenes/ZooSam.unity @@ -6159,8 +6159,6 @@ MonoBehaviour: LoadSceneTimeOut: 120 MessageBufferTimeout: 20 EnableNetworkLogs: 1 - UseSnapshotDelta: 0 - UseSnapshotSpawn: 0 --- !u!4 &620561612 Transform: m_ObjectHideFlags: 0 @@ -6196,8 +6194,8 @@ MonoBehaviour: channels: [] MessageBufferSize: 5120 SimulatePacketLossChance: 0 - SimulateMinLatency: 70 - SimulateMaxLatency: 130 + SimulateMinLatency: 0 + SimulateMaxLatency: 0 --- !u!1001 &627808638 PrefabInstance: m_ObjectHideFlags: 0 @@ -7402,7 +7400,7 @@ MonoBehaviour: m_EditorClassIdentifier: m_MoveSpeed: 5 m_RotationSpeed: 30 - m_RunServerOnly: 0 + m_RunServerOnly: 1 m_RunInUpdate: 1 --- !u!114 &678326394 MonoBehaviour: @@ -7432,8 +7430,19 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3} m_Name: m_EditorClassIdentifier: - Authority: 0 InLocalSpace: 0 + SyncPositionX: 0 + SyncPositionY: 1 + SyncPositionZ: 1 + SyncRotAngleX: 1 + SyncRotAngleY: 0 + SyncRotAngleZ: 1 + SyncScaleX: 1 + SyncScaleY: 1 + SyncScaleZ: 1 + PositionThreshold: 0 + RotAngleThreshold: 0 + ScaleThreshold: 0 FixedSendsPerSecond: 30 --- !u!65 &678326396 BoxCollider: From 496fa826455d5388ed19a5a152cfce29c700e501 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Wed, 25 Aug 2021 21:05:29 -0400 Subject: [PATCH 035/113] some fixes --- .../BufferedLinearInterpolator.cs | 17 ++ .../Prototyping/Interpolator/IInterpolator.cs | 1 + .../Interpolator/SimpleInterpolator.cs | 5 + .../Prototyping/NetworkTransform.cs | 240 ++++++++++++------ 4 files changed, 190 insertions(+), 73 deletions(-) diff --git a/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs b/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs index a78f161de0..7ec38b75ca 100644 --- a/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs +++ b/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs @@ -62,8 +62,13 @@ public void OnEnable() { } + public void Awake() + { + } + public void OnNetworkSpawn() { + Update(0); } private void TryConsumeFromBuffer() @@ -172,4 +177,16 @@ public BufferedLinearInterpolatorFloat() { } } + + public class BufferedLinearInterpolatorQuaternion : BufferedLinearInterpolator + { + public override Quaternion Interpolate(Quaternion start, Quaternion end, float time) + { + return Quaternion.Slerp(start, end, time); + } + + public BufferedLinearInterpolatorQuaternion() + { + } + } } \ No newline at end of file diff --git a/com.unity.netcode.gameobjects/Prototyping/Interpolator/IInterpolator.cs b/com.unity.netcode.gameobjects/Prototyping/Interpolator/IInterpolator.cs index 5d1022287b..8550f1e21c 100644 --- a/com.unity.netcode.gameobjects/Prototyping/Interpolator/IInterpolator.cs +++ b/com.unity.netcode.gameobjects/Prototyping/Interpolator/IInterpolator.cs @@ -4,6 +4,7 @@ namespace Unity.Netcode { public interface IInterpolator { + public void Awake(); public void OnNetworkSpawn(); public void Start(); public void OnEnable(); diff --git a/com.unity.netcode.gameobjects/Prototyping/Interpolator/SimpleInterpolator.cs b/com.unity.netcode.gameobjects/Prototyping/Interpolator/SimpleInterpolator.cs index 6872c116d5..6cf5dc2d15 100644 --- a/com.unity.netcode.gameobjects/Prototyping/Interpolator/SimpleInterpolator.cs +++ b/com.unity.netcode.gameobjects/Prototyping/Interpolator/SimpleInterpolator.cs @@ -12,6 +12,11 @@ public class SimpleInterpolatorVector3 : IInterpolator private const float k_MaxLerpTime = 0.1f; + public void Awake() + { + Update(0); + } + public void OnNetworkSpawn() { } diff --git a/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs b/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs index fdf731f621..c02e4e4775 100644 --- a/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs @@ -23,62 +23,73 @@ internal struct NetworkState : INetworkSerializable internal const int RotAngleZBit = 6; internal const int ScaleXBit = 7; internal const int ScaleYBit = 8; + internal const int ScaleZBit = 9; + // 10-15: public ushort Bitset; public bool InLocalSpace { get => (Bitset & (1 << InLocalSpaceBit)) != 0; - set => Bitset |= (ushort)((value ? 1 : 0) << InLocalSpaceBit); + set => Bitset |= (ushort) ((value ? 1 : 0) << InLocalSpaceBit); } + // Position public bool HasPositionX { get => (Bitset & (1 << PositionXBit)) != 0; - set => Bitset |= (ushort)((value ? 1 : 0) << PositionXBit); + set => Bitset |= (ushort) ((value ? 1 : 0) << PositionXBit); } + public bool HasPositionY { get => (Bitset & (1 << PositionYBit)) != 0; - set => Bitset |= (ushort)((value ? 1 : 0) << PositionYBit); + set => Bitset |= (ushort) ((value ? 1 : 0) << PositionYBit); } + public bool HasPositionZ { get => (Bitset & (1 << PositionZBit)) != 0; - set => Bitset |= (ushort)((value ? 1 : 0) << PositionZBit); + set => Bitset |= (ushort) ((value ? 1 : 0) << PositionZBit); } + // RotAngles public bool HasRotAngleX { get => (Bitset & (1 << RotAngleXBit)) != 0; - set => Bitset |= (ushort)((value ? 1 : 0) << RotAngleXBit); + set => Bitset |= (ushort) ((value ? 1 : 0) << RotAngleXBit); } + public bool HasRotAngleY { get => (Bitset & (1 << RotAngleYBit)) != 0; - set => Bitset |= (ushort)((value ? 1 : 0) << RotAngleYBit); + set => Bitset |= (ushort) ((value ? 1 : 0) << RotAngleYBit); } + public bool HasRotAngleZ { get => (Bitset & (1 << RotAngleZBit)) != 0; - set => Bitset |= (ushort)((value ? 1 : 0) << RotAngleZBit); + set => Bitset |= (ushort) ((value ? 1 : 0) << RotAngleZBit); } + // Scale public bool HasScaleX { get => (Bitset & (1 << ScaleXBit)) != 0; - set => Bitset |= (ushort)((value ? 1 : 0) << ScaleXBit); + set => Bitset |= (ushort) ((value ? 1 : 0) << ScaleXBit); } + public bool HasScaleY { get => (Bitset & (1 << ScaleYBit)) != 0; - set => Bitset |= (ushort)((value ? 1 : 0) << ScaleYBit); + set => Bitset |= (ushort) ((value ? 1 : 0) << ScaleYBit); } + public bool HasScaleZ { get => (Bitset & (1 << ScaleZBit)) != 0; - set => Bitset |= (ushort)((value ? 1 : 0) << ScaleZBit); + set => Bitset |= (ushort) ((value ? 1 : 0) << ScaleZBit); } public float PositionX, PositionY, PositionZ; @@ -88,10 +99,7 @@ public bool HasScaleZ public Vector3 Position { - get - { - return new Vector3(PositionX, PositionY, PositionZ); - } + get { return new Vector3(PositionX, PositionY, PositionZ); } set { PositionX = value.x; @@ -102,10 +110,7 @@ public Vector3 Position public Vector3 Rotation { - get - { - return new Vector3(RotAngleX, RotAngleY, RotAngleZ); - } + get { return new Vector3(RotAngleX, RotAngleY, RotAngleZ); } set { RotAngleX = value.x; @@ -116,10 +121,7 @@ public Vector3 Rotation public Vector3 Scale { - get - { - return new Vector3(ScaleX, ScaleY, ScaleZ); - } + get { return new Vector3(ScaleX, ScaleY, ScaleZ); } set { ScaleX = value.x; @@ -138,36 +140,44 @@ public void NetworkSerialize(NetworkSerializer serializer) { serializer.Serialize(ref PositionX); } + if (HasPositionY) { serializer.Serialize(ref PositionY); } + if (HasPositionZ) { serializer.Serialize(ref PositionZ); } + // RotAngle Values if (HasRotAngleX) { serializer.Serialize(ref RotAngleX); } + if (HasRotAngleY) { serializer.Serialize(ref RotAngleY); } + if (HasRotAngleZ) { serializer.Serialize(ref RotAngleZ); } + // Scale Values if (HasScaleX) { serializer.Serialize(ref ScaleX); } + if (HasScaleY) { serializer.Serialize(ref ScaleY); } + if (HasScaleZ) { serializer.Serialize(ref ScaleZ); @@ -204,51 +214,65 @@ public void NetworkSerialize(NetworkSerializer serializer) public virtual IInterpolator PositionXInterpolator { get; set; } public virtual IInterpolator PositionYInterpolator { get; set; } + public virtual IInterpolator PositionZInterpolator { get; set; } - public virtual IInterpolator RotationXInterpolator { get; set; } - public virtual IInterpolator RotationYInterpolator { get; set; } - public virtual IInterpolator RotationZInterpolator { get; set; } + // public virtual IInterpolator RotationXInterpolator { get; set; } + // public virtual IInterpolator RotationYInterpolator { get; set; } + // public virtual IInterpolator RotationZInterpolator { get; set; } + public virtual IInterpolator RotationInterpolator { get; set; } public virtual IInterpolator ScaleXInterpolator { get; set; } public virtual IInterpolator ScaleYInterpolator { get; set; } public virtual IInterpolator ScaleZInterpolator { get; set; } - public void SetInterpolator() where T : IInterpolator, new() + public void InitializeInterpolator() where T : IInterpolator, new() where U : IInterpolator, new() { - var tickRate = NetworkManager.Singleton.NetworkConfig.TickRate; PositionXInterpolator = new T(); - PositionXInterpolator.AddMeasurement(TransformPosition.x, new NetworkTime(tickRate, 0.0)); PositionYInterpolator = new T(); - PositionYInterpolator.AddMeasurement(TransformPosition.y, new NetworkTime(tickRate, 0.0)); PositionZInterpolator = new T(); - PositionZInterpolator.AddMeasurement(TransformPosition.z, new NetworkTime(tickRate, 0.0)); - RotationXInterpolator = new T(); - RotationXInterpolator.AddMeasurement(TransformRotation.eulerAngles.x, new NetworkTime(tickRate, 0.0)); - RotationYInterpolator = new T(); - RotationYInterpolator.AddMeasurement(TransformRotation.eulerAngles.y, new NetworkTime(tickRate, 0.0)); - RotationZInterpolator = new T(); - RotationZInterpolator.AddMeasurement(TransformRotation.eulerAngles.z, new NetworkTime(tickRate, 0.0)); + RotationInterpolator = new U(); + // RotationXInterpolator = new T(); + // RotationYInterpolator = new T(); + // RotationZInterpolator = new T(); ScaleXInterpolator = new T(); - ScaleXInterpolator.AddMeasurement(TransformScale.x, new NetworkTime(tickRate, 0.0)); ScaleYInterpolator = new T(); - ScaleYInterpolator.AddMeasurement(TransformScale.y, new NetworkTime(tickRate, 0.0)); ScaleZInterpolator = new T(); - ScaleZInterpolator.AddMeasurement(TransformScale.z, new NetworkTime(tickRate, 0.0)); } - public IEnumerable> AllInterpolators() + public void SetCurrentInterpolatedState() + { + var tickRate = NetworkManager.Singleton.NetworkConfig.TickRate; + PositionXInterpolator.AddMeasurement(ReplNetworkState.Value.PositionX, new NetworkTime(tickRate, 0.0)); + PositionYInterpolator.AddMeasurement(ReplNetworkState.Value.PositionY, new NetworkTime(tickRate, 0.0)); + PositionZInterpolator.AddMeasurement(ReplNetworkState.Value.PositionZ, new NetworkTime(tickRate, 0.0)); + RotationInterpolator.AddMeasurement(Quaternion.Euler(ReplNetworkState.Value.Rotation), new NetworkTime(tickRate, 0.0)); + // RotationXInterpolator.AddMeasurement(ReplNetworkState.Value.RotationX ulerAngles.x, new NetworkTime(tickRate, 0.0)); + // RotationYInterpolator.AddMeasurement(ReplNetworkState.Value.RotationX ulerAngles.y, new NetworkTime(tickRate, 0.0)); + // RotationZInterpolator.AddMeasurement(ReplNetworkState.Value.RotationX ulerAngles.z, new NetworkTime(tickRate, 0.0)); + ScaleXInterpolator.AddMeasurement(ReplNetworkState.Value.ScaleX, new NetworkTime(tickRate, 0.0)); + ScaleYInterpolator.AddMeasurement(ReplNetworkState.Value.ScaleY, new NetworkTime(tickRate, 0.0)); + ScaleZInterpolator.AddMeasurement(ReplNetworkState.Value.ScaleZ, new NetworkTime(tickRate, 0.0)); + } + + public IEnumerable> AllFloatInterpolators() { yield return PositionXInterpolator; yield return PositionYInterpolator; yield return PositionZInterpolator; - yield return RotationXInterpolator; - yield return RotationYInterpolator; - yield return RotationZInterpolator; + // yield return RotationXInterpolator; + // yield return RotationYInterpolator; + // yield return RotationZInterpolator; yield return ScaleXInterpolator; yield return ScaleYInterpolator; yield return ScaleZInterpolator; } + public IEnumerable> AllQuaternionInterpolators() + { + yield return RotationInterpolator; + } + + private Transform m_Transform; // cache the transform component to reduce unnecessary bounce between managed and native private Vector3 TransformPosition @@ -301,13 +325,20 @@ private Vector3 TransformScale // updates `NetworkState` properties if they need to and returns a `bool` indicating whether or not there was any changes made // returned boolean would be useful to change encapsulating `NetworkVariable`'s dirty state, e.g. ReplNetworkState.SetDirty(isDirty); + internal bool UpdateNetworkStateCheckDirty(ref NetworkState networkState, double dirtyTime) + { + return UpdateNetworkStateCheckDirtyWithInfo(ref networkState, dirtyTime).isDirty; + } + + private (bool isDirty, bool isRotationDirty) UpdateNetworkStateCheckDirtyWithInfo(ref NetworkState networkState, double dirtyTime) { var position = InLocalSpace ? m_Transform.localPosition : m_Transform.position; var rotAngles = InLocalSpace ? m_Transform.localEulerAngles : m_Transform.eulerAngles; var scale = InLocalSpace ? m_Transform.localScale : m_Transform.lossyScale; bool isDirty = false; + bool isRotationDirty = false; if (InLocalSpace != networkState.InLocalSpace) { @@ -349,6 +380,7 @@ internal bool UpdateNetworkStateCheckDirty(ref NetworkState networkState, double networkState.RotAngleX = rotAngles.x; networkState.HasRotAngleX = true; isDirty |= true; + isRotationDirty = true; } if (SyncRotAngleY && @@ -358,6 +390,7 @@ internal bool UpdateNetworkStateCheckDirty(ref NetworkState networkState, double networkState.RotAngleY = rotAngles.y; networkState.HasRotAngleY = true; isDirty |= true; + isRotationDirty = true; } if (SyncRotAngleZ && @@ -367,6 +400,7 @@ internal bool UpdateNetworkStateCheckDirty(ref NetworkState networkState, double networkState.RotAngleZ = rotAngles.z; networkState.HasRotAngleZ = true; isDirty |= true; + isRotationDirty = true; } if (SyncScaleX && @@ -401,7 +435,7 @@ internal bool UpdateNetworkStateCheckDirty(ref NetworkState networkState, double networkState.SentTime = dirtyTime; } - return isDirty; + return (isDirty, isRotationDirty); } internal void ApplyNetworkStateFromAuthority(NetworkState networkState) @@ -431,19 +465,34 @@ internal void ApplyNetworkStateFromAuthority(NetworkState networkState) } // RotAngles Read + // if (networkState.HasRotAngleX) + // { + // interpolatedRotAngles.x = RotationXInterpolator.GetInterpolatedValue(); + // } + // + // if (networkState.HasRotAngleY) + // { + // interpolatedRotAngles.y = RotationYInterpolator.GetInterpolatedValue(); + // } + // + // if (networkState.HasRotAngleZ) + // { + // interpolatedRotAngles.z = RotationZInterpolator.GetInterpolatedValue(); + // } + if (networkState.HasRotAngleX) { - interpolatedRotAngles.x = RotationXInterpolator.GetInterpolatedValue(); + interpolatedRotAngles.x = RotationInterpolator.GetInterpolatedValue().eulerAngles.x; } if (networkState.HasRotAngleY) { - interpolatedRotAngles.y = RotationYInterpolator.GetInterpolatedValue(); + interpolatedRotAngles.y = RotationInterpolator.GetInterpolatedValue().eulerAngles.y; } if (networkState.HasRotAngleZ) { - interpolatedRotAngles.z = RotationZInterpolator.GetInterpolatedValue(); + interpolatedRotAngles.z = RotationInterpolator.GetInterpolatedValue().eulerAngles.z; } // Scale Read @@ -483,11 +532,11 @@ internal void ApplyNetworkStateFromAuthority(NetworkState networkState) { if (InLocalSpace) { - m_Transform.localEulerAngles = interpolatedRotAngles; + m_Transform.localRotation = Quaternion.Euler(interpolatedRotAngles); } else { - m_Transform.eulerAngles = interpolatedRotAngles; + m_Transform.rotation = Quaternion.Euler(interpolatedRotAngles); } PrevNetworkState.Rotation = interpolatedRotAngles; @@ -564,20 +613,23 @@ private void OnNetworkStateChanged(NetworkState oldState, NetworkState newState) PositionZInterpolator.AddMeasurement(newState.Position.z, sentTime); } - if (newState.HasRotAngleX) - { - RotationXInterpolator.AddMeasurement(newState.RotAngleX, sentTime); - } - if (newState.HasRotAngleY) - { - RotationYInterpolator.AddMeasurement(newState.RotAngleY, sentTime); - } - - if (newState.HasRotAngleZ) - { - RotationZInterpolator.AddMeasurement(newState.RotAngleZ, sentTime); - } + // todo fix this + // if (newState.HasRotAngleX) + // { + // RotationXInterpolator.AddMeasurement(newState.RotAngleX, sentTime); + // } + // + // if (newState.HasRotAngleY) + // { + // RotationYInterpolator.AddMeasurement(newState.RotAngleY, sentTime); + // } + // + // if (newState.HasRotAngleZ) + // { + // RotationZInterpolator.AddMeasurement(newState.RotAngleZ, sentTime); + // } + RotationInterpolator.AddMeasurement(Quaternion.Euler(newState.Rotation), sentTime); if (newState.HasScaleX) { @@ -598,7 +650,28 @@ private void OnNetworkStateChanged(NetworkState oldState, NetworkState newState) private void Awake() { m_Transform = transform; - SetInterpolator(); + + bool interpolatorAlreadySet = false; + foreach (var interpolator in AllFloatInterpolators()) + { + if (interpolator != null || RotationInterpolator != null) + { + interpolatorAlreadySet = true; + break; + } + } + + if (!interpolatorAlreadySet) + { + InitializeInterpolator(); + } + + foreach (var interpolator in AllFloatInterpolators()) + { + interpolator.Awake(); + } + + RotationInterpolator.Awake(); ReplNetworkState.Settings.SendNetworkChannel = Channel; ReplNetworkState.Settings.SendTickrate = FixedSendsPerSecond; @@ -608,27 +681,38 @@ private void Awake() public void Start() { - foreach (var interpolator in AllInterpolators()) + foreach (var interpolator in AllFloatInterpolators()) { interpolator.Start(); } + + RotationInterpolator.Start(); } public void OnEnable() { - foreach (var interpolator in AllInterpolators()) + foreach (var interpolator in AllFloatInterpolators()) { interpolator.OnEnable(); } + + RotationInterpolator.OnEnable(); } public override void OnNetworkSpawn() { - var currentTime = new NetworkTime(NetworkManager.Singleton.ServerTime.TickRate, ReplNetworkState.Value.SentTime); - - foreach (var interpolator in AllInterpolators()) + if (!IsServer) { - interpolator.OnNetworkSpawn(); + SetCurrentInterpolatedState(); // useful for late joining + + foreach (var interpolator in AllFloatInterpolators()) + { + interpolator.OnNetworkSpawn(); + } + + RotationInterpolator.OnNetworkSpawn(); + + ApplyNetworkStateFromAuthority(ReplNetworkState.Value); } } @@ -636,10 +720,13 @@ private void OnDestroy() { ReplNetworkState.OnValueChanged -= OnNetworkStateChanged; - foreach (var interpolator in AllInterpolators()) + foreach (var interpolator in AllFloatInterpolators()) { interpolator.OnDestroy(); } + + RotationInterpolator.OnDestroy(); + } private void FixedUpdate() @@ -654,16 +741,21 @@ private void FixedUpdate() // we apply the latest ReplNetworkState again to revert our changes if (!IsServer) { - if (UpdateNetworkStateCheckDirty(ref PrevNetworkState, 0)) // todo figure what time should be here + var oldStateDirtyInfo = UpdateNetworkStateCheckDirtyWithInfo(ref PrevNetworkState, 0); + if ((oldStateDirtyInfo.isDirty && !oldStateDirtyInfo.isRotationDirty) || (oldStateDirtyInfo.isRotationDirty && (SyncRotAngleX && SyncRotAngleY && SyncRotAngleZ))) { + // ignoring rotation dirty since quaternions will mess with euler angles, making this impossible to determine if the change to a single axis comes + // from an unauthorized transform change or euler to quaternion conversion artifacts. However if all rotation axis are synced, we can Debug.LogWarning("A local change without authority detected, reverting back to latest network state!", this); ApplyNetworkStateFromAuthority(ReplNetworkState.Value); } - foreach (var interpolator in AllInterpolators()) + foreach (var interpolator in AllFloatInterpolators()) { interpolator.FixedUpdate(NetworkManager.ServerTime.FixedDeltaTime); } + + RotationInterpolator.FixedUpdate(NetworkManager.ServerTime.FixedDeltaTime); } } @@ -685,11 +777,13 @@ private void Update() } else if (NetworkManager.Singleton.IsConnectedClient || NetworkManager.Singleton.IsListening) { - foreach (var interpolator in AllInterpolators()) + foreach (var interpolator in AllFloatInterpolators()) { interpolator.Update(Time.deltaTime); } + RotationInterpolator.Update(Time.deltaTime); + ApplyNetworkStateFromAuthority(ReplNetworkState.Value); } } From 522558fefcf7ac1b3ee74ad4b45363d18783bf2e Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Wed, 25 Aug 2021 21:09:34 -0400 Subject: [PATCH 036/113] # --- testproject/Assets/Scenes/ZooSam.unity | 108 +++++++++++++++++++++++-- 1 file changed, 100 insertions(+), 8 deletions(-) diff --git a/testproject/Assets/Scenes/ZooSam.unity b/testproject/Assets/Scenes/ZooSam.unity index d828af14fd..7a404cceed 100644 --- a/testproject/Assets/Scenes/ZooSam.unity +++ b/testproject/Assets/Scenes/ZooSam.unity @@ -219,6 +219,101 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 33522693} m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &36747676 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 36747677} + - component: {fileID: 36747680} + - component: {fileID: 36747679} + - component: {fileID: 36747678} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &36747677 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 36747676} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.455, y: 0.296, z: 0.312} + m_LocalScale: {x: 0.55787, y: 0.55787, z: 0.55787} + m_Children: [] + m_Father: {fileID: 678326399} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &36747678 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 36747676} + 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 &36747679 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 36747676} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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 &36747680 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 36747676} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} --- !u!1 &37826286 GameObject: m_ObjectHideFlags: 0 @@ -6111,12 +6206,7 @@ MonoBehaviour: ConnectAddress: 127.0.0.1 ConnectPort: 7777 ServerListenPort: 7777 - ServerWebsocketListenPort: 8887 - SupportWebsocket: 0 Channels: [] - UseNetcodeRelay: 0 - NetcodeRelayAddress: 127.0.0.1 - NetcodeRelayPort: 8888 MessageSendMode: 0 --- !u!114 &620561611 MonoBehaviour: @@ -6139,6 +6229,7 @@ MonoBehaviour: RegisteredScenes: - SampleScene - ZooSam + RegisteredSceneAssets: [] AllowRuntimeSceneChanges: 0 PlayerPrefab: {fileID: 4700706668509470175, guid: 7eeaaf9e50c0afc4dab93584a54fb0d6, type: 3} @@ -7393,7 +7484,7 @@ MonoBehaviour: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 678326392} - m_Enabled: 1 + m_Enabled: 0 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 307c40a41954948e7a36bb6b64b4b9cb, type: 3} m_Name: @@ -7431,11 +7522,11 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: InLocalSpace: 0 - SyncPositionX: 0 + SyncPositionX: 1 SyncPositionY: 1 SyncPositionZ: 1 SyncRotAngleX: 1 - SyncRotAngleY: 0 + SyncRotAngleY: 1 SyncRotAngleZ: 1 SyncScaleX: 1 SyncScaleY: 1 @@ -7518,6 +7609,7 @@ Transform: m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - {fileID: 702051986} + - {fileID: 36747677} m_Father: {fileID: 0} m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} From 2f57fa9916ffbd7bdf076267b7af67403254464c Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Wed, 25 Aug 2021 22:06:16 -0400 Subject: [PATCH 037/113] # --- .../Prototyping/NetworkTransform.cs | 30 ++++++++++--------- testproject/Assets/Scenes/ZooSam.unity | 2 +- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs b/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs index c02e4e4775..db98d90267 100644 --- a/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs @@ -331,14 +331,16 @@ internal bool UpdateNetworkStateCheckDirty(ref NetworkState networkState, double return UpdateNetworkStateCheckDirtyWithInfo(ref networkState, dirtyTime).isDirty; } - private (bool isDirty, bool isRotationDirty) UpdateNetworkStateCheckDirtyWithInfo(ref NetworkState networkState, double dirtyTime) + private (bool isDirty, bool isPositionDirty, bool isRotationDirty, bool isScaleDirty) UpdateNetworkStateCheckDirtyWithInfo(ref NetworkState networkState, double dirtyTime) { var position = InLocalSpace ? m_Transform.localPosition : m_Transform.position; var rotAngles = InLocalSpace ? m_Transform.localEulerAngles : m_Transform.eulerAngles; var scale = InLocalSpace ? m_Transform.localScale : m_Transform.lossyScale; bool isDirty = false; + bool isPositionDirty = false; bool isRotationDirty = false; + bool isScaleDirty = false; if (InLocalSpace != networkState.InLocalSpace) { @@ -352,7 +354,7 @@ internal bool UpdateNetworkStateCheckDirty(ref NetworkState networkState, double { networkState.PositionX = position.x; networkState.HasPositionX = true; - isDirty |= true; + isPositionDirty = true; } if (SyncPositionY && @@ -361,7 +363,7 @@ internal bool UpdateNetworkStateCheckDirty(ref NetworkState networkState, double { networkState.PositionY = position.y; networkState.HasPositionY = true; - isDirty |= true; + isPositionDirty = true; } if (SyncPositionZ && @@ -370,7 +372,7 @@ internal bool UpdateNetworkStateCheckDirty(ref NetworkState networkState, double { networkState.PositionZ = position.z; networkState.HasPositionZ = true; - isDirty |= true; + isPositionDirty = true; } if (SyncRotAngleX && @@ -379,7 +381,6 @@ internal bool UpdateNetworkStateCheckDirty(ref NetworkState networkState, double { networkState.RotAngleX = rotAngles.x; networkState.HasRotAngleX = true; - isDirty |= true; isRotationDirty = true; } @@ -389,7 +390,6 @@ internal bool UpdateNetworkStateCheckDirty(ref NetworkState networkState, double { networkState.RotAngleY = rotAngles.y; networkState.HasRotAngleY = true; - isDirty |= true; isRotationDirty = true; } @@ -399,7 +399,6 @@ internal bool UpdateNetworkStateCheckDirty(ref NetworkState networkState, double { networkState.RotAngleZ = rotAngles.z; networkState.HasRotAngleZ = true; - isDirty |= true; isRotationDirty = true; } @@ -409,7 +408,7 @@ internal bool UpdateNetworkStateCheckDirty(ref NetworkState networkState, double { networkState.ScaleX = scale.x; networkState.HasScaleX = true; - isDirty |= true; + isScaleDirty = true; } if (SyncScaleY && @@ -418,7 +417,7 @@ internal bool UpdateNetworkStateCheckDirty(ref NetworkState networkState, double { networkState.ScaleY = scale.y; networkState.HasScaleY = true; - isDirty |= true; + isScaleDirty = true; } if (SyncScaleZ && @@ -427,15 +426,17 @@ internal bool UpdateNetworkStateCheckDirty(ref NetworkState networkState, double { networkState.ScaleZ = scale.z; networkState.HasScaleZ = true; - isDirty |= true; + isScaleDirty = true; } + isDirty |= isPositionDirty || isRotationDirty || isScaleDirty; + if (isDirty) { networkState.SentTime = dirtyTime; } - return (isDirty, isRotationDirty); + return (isDirty, isPositionDirty, isRotationDirty, isScaleDirty); } internal void ApplyNetworkStateFromAuthority(NetworkState networkState) @@ -742,11 +743,12 @@ private void FixedUpdate() if (!IsServer) { var oldStateDirtyInfo = UpdateNetworkStateCheckDirtyWithInfo(ref PrevNetworkState, 0); - if ((oldStateDirtyInfo.isDirty && !oldStateDirtyInfo.isRotationDirty) || (oldStateDirtyInfo.isRotationDirty && (SyncRotAngleX && SyncRotAngleY && SyncRotAngleZ))) + if (oldStateDirtyInfo.isDirty && !oldStateDirtyInfo.isRotationDirty) { // ignoring rotation dirty since quaternions will mess with euler angles, making this impossible to determine if the change to a single axis comes - // from an unauthorized transform change or euler to quaternion conversion artifacts. However if all rotation axis are synced, we can - Debug.LogWarning("A local change without authority detected, reverting back to latest network state!", this); + // from an unauthorized transform change or euler to quaternion conversion artifacts. + var dirtyField = oldStateDirtyInfo.isPositionDirty ? "position" : "scale"; + Debug.LogWarning($"A local change to {dirtyField} without authority detected, reverting back to latest interpolated network state!", this); ApplyNetworkStateFromAuthority(ReplNetworkState.Value); } diff --git a/testproject/Assets/Scenes/ZooSam.unity b/testproject/Assets/Scenes/ZooSam.unity index 7a404cceed..6ac4ab70c1 100644 --- a/testproject/Assets/Scenes/ZooSam.unity +++ b/testproject/Assets/Scenes/ZooSam.unity @@ -7484,7 +7484,7 @@ MonoBehaviour: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 678326392} - m_Enabled: 0 + m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 307c40a41954948e7a36bb6b64b4b9cb, type: 3} m_Name: From b6ac56276fdc97d1daa90c4dffac47d94a48969e Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Wed, 1 Sep 2021 15:28:58 -0400 Subject: [PATCH 038/113] smooth now --- .../BufferedLinearInterpolator.cs | 77 +++-- .../Prototyping/Interpolator/IInterpolator.cs | 1 + .../Interpolator/NoInterpolator.cs | 2 + .../Interpolator/SimpleInterpolator.cs | 2 + .../Prototyping/NetworkTransform.cs | 90 +++++- .../Prototyping/NetworkTransform.cs.meta | 5 +- .../Runtime/Timing/NetworkTime.cs | 3 +- .../Tests/Editor/InterpolatorTests.cs | 10 + testproject/Assets/Scenes/ZooSam.unity | 268 +++++++++++++++++- testproject/Assets/Scripts/MoveInCircle.cs | 2 +- 10 files changed, 408 insertions(+), 52 deletions(-) diff --git a/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs b/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs index 7ec38b75ca..018ebca4ee 100644 --- a/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs +++ b/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs @@ -17,6 +17,7 @@ public abstract class BufferedLinearInterpolator : IInterpolator where T : public interface IInterpolatorTime { public double BufferedServerTime { get; } + public double BufferedServerFixedTime { get; } public double LocalTime { get; } public int TickRate { get; } } @@ -24,6 +25,7 @@ public interface IInterpolatorTime private class InterpolatorTime : IInterpolatorTime { public double BufferedServerTime => NetworkManager.Singleton.ServerTime.Time; + public double BufferedServerFixedTime => NetworkManager.Singleton.ServerTime.FixedTime; public double LocalTime => NetworkManager.Singleton.LocalTime.Time; public int TickRate => NetworkManager.Singleton.ServerTime.TickRate; } @@ -35,8 +37,10 @@ private struct BufferedItem } internal IInterpolatorTime interpolatorTime = new InterpolatorTime(); - protected virtual double ServerTimeBeingHandledForBuffering => interpolatorTime.BufferedServerTime; // override this if you want configurable buffering, right now using ServerTick's own global buffering - private double RenderTime => ServerTimeBeingHandledForBuffering - 1f / interpolatorTime.TickRate; + public bool UseFixedUpdate { get; set; } + // protected virtual double ServerTimeBeingHandledForBuffering => interpolatorTime.BufferedServerTime; // override this if you want configurable buffering, right now using ServerTick's own global buffering + protected virtual double ServerTimeBeingHandledForBuffering => UseFixedUpdate ? interpolatorTime.BufferedServerFixedTime : interpolatorTime.BufferedServerTime; // override this if you want configurable buffering, right now using ServerTick's own global buffering + protected virtual double RenderTime => interpolatorTime.BufferedServerTime - 1f / interpolatorTime.TickRate; private T m_InterpStartValue; private T m_CurrentInterpValue; @@ -71,38 +75,52 @@ public void OnNetworkSpawn() Update(0); } + double TickOrTime(NetworkTime t) + { + if (UseFixedUpdate) return t.FixedTime; + return t.Time; + } private void TryConsumeFromBuffer() { int consumedCount = 0; - // buffer is sorted so older (smaller) time values are at the end. - for (int i = m_Buffer.Count - 1; i >= 0; i--) + // only consume if we're ready + if (RenderTime >= m_EndTimeConsumed.Time) { - var bufferedValue = m_Buffer[i]; - // check render time so we only try to consume one value at once - if (bufferedValue.timeSent.Time <= ServerTimeBeingHandledForBuffering && RenderTime >= m_EndTimeConsumed.Time) + // buffer is sorted so older (smaller) time values are at the end. + for (int i = m_Buffer.Count - 1; i >= 0; i--) { - if (m_LifetimeConsumedCount == 0) + var bufferedValue = m_Buffer[i]; + // Consume when ready. This can consume multiple times + if (TickOrTime(bufferedValue.timeSent) <= ServerTimeBeingHandledForBuffering) // todo do tick + 1 instead of changing the way tick is calculated? discuss with Luke { - m_StartTimeConsumed = bufferedValue.timeSent; - m_InterpStartValue = bufferedValue.item; + // if (RenderTime > TickOrTime(m_EndTimeConsumed)) + { + if (m_LifetimeConsumedCount == 0) + { + m_StartTimeConsumed = bufferedValue.timeSent; + m_InterpStartValue = bufferedValue.item; + } + else if (consumedCount == 0) + { + m_StartTimeConsumed = m_EndTimeConsumed; + m_InterpStartValue = m_InterpEndValue; + } + } + + m_EndTimeConsumed = bufferedValue.timeSent; + m_InterpEndValue = bufferedValue.item; + m_Buffer.RemoveAt(i); + consumedCount++; + m_LifetimeConsumedCount++; } - else if (consumedCount == 0) - { - m_StartTimeConsumed = m_EndTimeConsumed; - m_InterpStartValue = m_InterpEndValue; - } - - m_EndTimeConsumed = bufferedValue.timeSent; - m_InterpEndValue = bufferedValue.item; - m_Buffer.RemoveAt(i); - consumedCount++; - m_LifetimeConsumedCount++; } } } public T Update(float deltaTime) { + if (m_LifetimeConsumedCount > 2) // todo remove debug + Debug.Log($"Sam got value m_Buffer.Count {m_Buffer.Count}"); TryConsumeFromBuffer(); if (m_LifetimeConsumedCount == 0 && m_Buffer.Count == 0) @@ -117,7 +135,7 @@ public T Update(float deltaTime) if (m_LifetimeConsumedCount >= 1) // shouldn't interpolate between default values, let's wait to receive data first, should only interpolate between real measurements { - double range = m_EndTimeConsumed.Time - m_StartTimeConsumed.Time; + double range = TickOrTime(m_EndTimeConsumed) - TickOrTime(m_StartTimeConsumed); float t; if (range == 0) { @@ -125,10 +143,19 @@ public T Update(float deltaTime) } else { - t = (float) ((RenderTime - m_StartTimeConsumed.Time) / range); + t = (float) ((RenderTime - TickOrTime(m_StartTimeConsumed)) / range); + } + + if (t > 2) // max extrapolation + { + t = 1; } - Debug.Assert(t >= 0, "t must be bigger or equal than 0"); + if (m_LifetimeConsumedCount > 2) // todo remove debug + Debug.Log($"sam got value t {t}, TT(m_EndTimeConsumed) {TickOrTime(m_EndTimeConsumed)}, TT(m_StartTimeConsumed) {TickOrTime(m_StartTimeConsumed)}, range {range}, " + + $" RenderTime {RenderTime}, ServerTimeBeingHandledForBuffering {ServerTimeBeingHandledForBuffering}, interpolatorTime.TickRate {interpolatorTime.TickRate}, " + + $" interpolatorTime.BufferedServerFixedTime {interpolatorTime.BufferedServerFixedTime}, interpolatorTime.BufferedServerTime {interpolatorTime.BufferedServerTime}"); + Debug.Assert(t >= 0, $"t must be bigger or equal than 0. range {range}, RenderTime {RenderTime}, Start time {TickOrTime(m_StartTimeConsumed)}, end time {TickOrTime(m_EndTimeConsumed)}"); m_CurrentInterpValue = Interpolate(m_InterpStartValue, m_InterpEndValue, t); } @@ -171,6 +198,7 @@ public class BufferedLinearInterpolatorFloat : BufferedLinearInterpolator public override float Interpolate(float start, float end, float time) { return Mathf.Lerp(start, end, time); + // return Mathf.LerpUnclamped(start, end, time); } public BufferedLinearInterpolatorFloat() @@ -182,6 +210,7 @@ public class BufferedLinearInterpolatorQuaternion : BufferedLinearInterpolator public void AddMeasurement(T newMeasurement, NetworkTime sentTime); public T GetInterpolatedValue(); public void OnDestroy(); + public bool UseFixedUpdate { get; set; } } } diff --git a/com.unity.netcode.gameobjects/Prototyping/Interpolator/NoInterpolator.cs b/com.unity.netcode.gameobjects/Prototyping/Interpolator/NoInterpolator.cs index 4ed406c55e..52201e5ec3 100644 --- a/com.unity.netcode.gameobjects/Prototyping/Interpolator/NoInterpolator.cs +++ b/com.unity.netcode.gameobjects/Prototyping/Interpolator/NoInterpolator.cs @@ -43,5 +43,7 @@ public T GetInterpolatedValue() public void OnDestroy() { } + + public bool UseFixedUpdate { get; set; } } } \ No newline at end of file diff --git a/com.unity.netcode.gameobjects/Prototyping/Interpolator/SimpleInterpolator.cs b/com.unity.netcode.gameobjects/Prototyping/Interpolator/SimpleInterpolator.cs index 6cf5dc2d15..8c8428562d 100644 --- a/com.unity.netcode.gameobjects/Prototyping/Interpolator/SimpleInterpolator.cs +++ b/com.unity.netcode.gameobjects/Prototyping/Interpolator/SimpleInterpolator.cs @@ -55,5 +55,7 @@ public Vector3 GetInterpolatedValue() public void OnDestroy() { } + + public bool UseFixedUpdate { get; set; } } } \ No newline at end of file diff --git a/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs b/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs index db98d90267..65c44da41b 100644 --- a/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs @@ -2,6 +2,7 @@ using System.Collections; using System.Collections.Generic; using UnityEngine; +using Random = UnityEngine.Random; namespace Unity.Netcode.Prototyping { @@ -9,7 +10,9 @@ namespace Unity.Netcode.Prototyping /// A prototype component for syncing transforms /// [AddComponentMenu("Netcode/" + nameof(NetworkTransform))] - [DefaultExecutionOrder(1000000)] // this is needed to catch the update time after the transform was updated by user scripts +// todo add a note in doc about this + // todo have a way for this to be only server side? This way client side you can have scripts that depend on that position update that'll execute afterward + [DefaultExecutionOrder(1000)] // this is needed to catch the update time after the transform was updated by user scripts public class NetworkTransform : NetworkBehaviour { internal struct NetworkState : INetworkSerializable @@ -23,10 +26,10 @@ internal struct NetworkState : INetworkSerializable internal const int RotAngleZBit = 6; internal const int ScaleXBit = 7; internal const int ScaleYBit = 8; - internal const int ScaleZBit = 9; + internal const int LastSentBit = 10; // todo remove this - // 10-15: + // 11-15: public ushort Bitset; public bool InLocalSpace @@ -92,6 +95,12 @@ public bool HasScaleZ set => Bitset |= (ushort) ((value ? 1 : 0) << ScaleZBit); } + public bool IsLastSent + { + get => (Bitset & (1 << LastSentBit)) != 0; + set => Bitset |= (ushort) ((value ? 1 : 0) << LastSentBit); + } + public float PositionX, PositionY, PositionZ; public float RotAngleX, RotAngleY, RotAngleZ; public float ScaleX, ScaleY, ScaleZ; @@ -133,7 +142,7 @@ public Vector3 Scale public void NetworkSerialize(NetworkSerializer serializer) { serializer.Serialize(ref SentTime); - // InLocalSpace + HasXXX Bits + // InLocalSpace + HasXXX Bits + LastSent flag serializer.Serialize(ref Bitset); // Position Values if (HasPositionX) @@ -212,6 +221,8 @@ public void NetworkSerialize(NetworkSerializer serializer) [SerializeField, Range(0, 120), Tooltip("The base amount of sends per seconds to use when range is disabled")] public float FixedSendsPerSecond = 30f; + public bool UseFixedUpdate = true; + public virtual IInterpolator PositionXInterpolator { get; set; } public virtual IInterpolator PositionYInterpolator { get; set; } @@ -272,6 +283,8 @@ public IEnumerable> AllQuaternionInterpolators() yield return RotationInterpolator; } + private int k_debugDrawLineTime = 10; + private Transform m_Transform; // cache the transform component to reduce unnecessary bounce between managed and native @@ -431,11 +444,12 @@ internal bool UpdateNetworkStateCheckDirty(ref NetworkState networkState, double isDirty |= isPositionDirty || isRotationDirty || isScaleDirty; - if (isDirty) + // if (isDirty) { networkState.SentTime = dirtyTime; } + return (isDirty, isPositionDirty, isRotationDirty, isScaleDirty); } @@ -599,6 +613,11 @@ private void OnNetworkStateChanged(NetworkState oldState, NetworkState newState) var sentTime = new NetworkTime(NetworkManager.Singleton.ServerTime.TickRate, newState.SentTime); + if (newState.IsLastSent) + { + Debug.Log("asdf"); + } + if (newState.HasPositionX) { PositionXInterpolator.AddMeasurement(newState.Position.x, sentTime); @@ -646,6 +665,12 @@ private void OnNetworkStateChanged(NetworkState oldState, NetworkState newState) { ScaleZInterpolator.AddMeasurement(newState.ScaleZ, sentTime); } + + if (NetworkManager.Singleton.LogLevel == LogLevel.Developer) + { + var pos = new Vector3(newState.PositionX, newState.PositionY, newState.PositionZ); + Debug.DrawLine(pos, pos + Vector3.up + Vector3.left * Random.Range(0.5f, 2f), Color.green, k_debugDrawLineTime, false); + } } private void Awake() @@ -661,7 +686,6 @@ private void Awake() break; } } - if (!interpolatorAlreadySet) { InitializeInterpolator(); @@ -670,9 +694,10 @@ private void Awake() foreach (var interpolator in AllFloatInterpolators()) { interpolator.Awake(); + interpolator.UseFixedUpdate = UseFixedUpdate; } - RotationInterpolator.Awake(); + RotationInterpolator.UseFixedUpdate = UseFixedUpdate; ReplNetworkState.Settings.SendNetworkChannel = Channel; ReplNetworkState.Settings.SendTickrate = FixedSendsPerSecond; @@ -730,6 +755,31 @@ private void OnDestroy() } + private void DoSendToOthers(double time) + { + // check for time there was a change to the transform + // this needs to be done in Update to catch that time change as soon as it happens. + var isDirty = UpdateNetworkStateCheckDirty(ref ReplNetworkState.ValueRef, time); // todo sam diff here is Fixedtime + if (isDirty) + { + alreadySentLastValue = false; + } + else if (!alreadySentLastValue) + { + isDirty = true; + alreadySentLastValue = true; // to send one more value after a transform moves, so that unclamped interpolation has two similar last values + shouldSendLastValue = true; + } + ReplNetworkState.ValueRef.IsLastSent = shouldSendLastValue; + + ReplNetworkState.SetDirty(shouldSendLastValue || isDirty); + if (ReplNetworkState.IsDirty()) + { + Debug.DrawLine(ReplNetworkState.Value.Position, ReplNetworkState.Value.Position + Vector3.up, Color.magenta, 10, false); + } + shouldSendLastValue = false; + } + private void FixedUpdate() { if (!NetworkObject.IsSpawned) @@ -737,6 +787,11 @@ private void FixedUpdate() return; } + if (IsServer && UseFixedUpdate) + { + DoSendToOthers(NetworkManager.LocalTime.FixedTime); + } + // try to update previously consumed NetworkState // if we have any changes, that means made some updates locally // we apply the latest ReplNetworkState again to revert our changes @@ -761,6 +816,10 @@ private void FixedUpdate() } } + private bool alreadySentLastValue = false; + private bool shouldSendLastValue = false; + + private void Update() { if (!NetworkObject.IsSpawned) @@ -768,16 +827,11 @@ private void Update() return; } - if (IsServer) + if (IsServer && !UseFixedUpdate) { - if (IsAuthoritativeTransformDirty()) - { - // check for time there was a change to the transform - // this needs to be done in Update to catch that time change as soon as it happens. - ReplNetworkState.SetDirty(UpdateNetworkStateCheckDirty(ref ReplNetworkState.ValueRef, NetworkManager.LocalTime.Time)); - } + DoSendToOthers(NetworkManager.LocalTime.Time); } - else if (NetworkManager.Singleton.IsConnectedClient || NetworkManager.Singleton.IsListening) + if (!IsServer && (NetworkManager.Singleton.IsConnectedClient || NetworkManager.Singleton.IsListening)) { foreach (var interpolator in AllFloatInterpolators()) { @@ -786,6 +840,12 @@ private void Update() RotationInterpolator.Update(Time.deltaTime); + if (NetworkManager.Singleton.LogLevel == LogLevel.Developer) + { + var interpolatedPosition = new Vector3(PositionXInterpolator.GetInterpolatedValue(), PositionYInterpolator.GetInterpolatedValue(), PositionZInterpolator.GetInterpolatedValue()); + Debug.DrawLine(interpolatedPosition, interpolatedPosition + Vector3.up, Color.magenta, k_debugDrawLineTime, false); + } + ApplyNetworkStateFromAuthority(ReplNetworkState.Value); } } diff --git a/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs.meta b/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs.meta index 6af788f27b..4023b38e0e 100644 --- a/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs.meta +++ b/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs.meta @@ -3,10 +3,7 @@ guid: e96cb6065543e43c4a752faaa1468eb1 MonoImporter: externalObjects: {} serializedVersion: 2 - defaultReferences: - - m_PositionInterpolatorFactory: {fileID: 11400000, guid: a882403a7bf6247cd881a093a9a3f537, - type: 2} - - m_RotationInterpolatorFactory: {instanceID: 0} + defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: diff --git a/com.unity.netcode.gameobjects/Runtime/Timing/NetworkTime.cs b/com.unity.netcode.gameobjects/Runtime/Timing/NetworkTime.cs index 4a90602916..e17a5ed176 100644 --- a/com.unity.netcode.gameobjects/Runtime/Timing/NetworkTime.cs +++ b/com.unity.netcode.gameobjects/Runtime/Timing/NetworkTime.cs @@ -106,7 +106,8 @@ public NetworkTime ToFixedTime() private void UpdateCache() { double d = m_TimeSec / m_TickInterval; - m_CachedTick = (int)d; + m_CachedTick = (int)d; // rounding up. if you're in tick 3.123, you're really in the tick 4 + // m_CachedTick = (int)Math.Ceiling(d); // rounding up. if you're in tick 3.123, you're really in the tick 4 m_CachedTickOffset = ((d - Math.Truncate(d)) * m_TickInterval); // This handles negative time, decreases tick by 1 and makes offset positive. diff --git a/com.unity.netcode.gameobjects/Tests/Editor/InterpolatorTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/InterpolatorTests.cs index ea18a14f19..4c572213e6 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/InterpolatorTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/InterpolatorTests.cs @@ -10,6 +10,7 @@ public class BufferedInterpolatorTests private class MockInterpolatorTime : BufferedLinearInterpolator.IInterpolatorTime { public double BufferedServerTime { get; set; } + public double BufferedServerFixedTime { get; } public double LocalTime { get; } public int TickRate { get; set; } @@ -45,6 +46,7 @@ public void NormalUsage() // Testing float instead of Vector3. The only difference with Vector3 is the lerp method used. var interpolator = new BufferedLinearInterpolatorFloat(); + interpolator.UseFixedUpdate = false; var mockBufferedTime = new MockInterpolatorTime(0, k_MockTickRate); interpolator.interpolatorTime = mockBufferedTime; @@ -91,6 +93,7 @@ public void NormalUsage() public void OutOfOrderShouldStillWork() { var interpolator = new BufferedLinearInterpolatorFloat(); + interpolator.UseFixedUpdate = false; var mockBufferedTime = new MockInterpolatorTime(0, k_MockTickRate); interpolator.interpolatorTime = mockBufferedTime; @@ -121,6 +124,7 @@ public void OutOfOrderShouldStillWork() public void MessageLoss() { var interpolator = new BufferedLinearInterpolatorFloat(); + interpolator.UseFixedUpdate = false; var mockBufferedTime = new MockInterpolatorTime(0, k_MockTickRate); interpolator.interpolatorTime = mockBufferedTime; @@ -166,6 +170,7 @@ public void MessageLoss() public void AddFirstMeasurement() { var interpolator = new BufferedLinearInterpolatorFloat(); + interpolator.UseFixedUpdate = false; var mockBufferedTime = new MockInterpolatorTime(0, k_MockTickRate); interpolator.interpolatorTime = mockBufferedTime; @@ -194,6 +199,7 @@ public void AddFirstMeasurement() public void JumpToEachValueIfDeltaTimeTooBig() { var interpolator = new BufferedLinearInterpolatorFloat(); + interpolator.UseFixedUpdate = false; var mockBufferedTime = new MockInterpolatorTime(0, k_MockTickRate); interpolator.interpolatorTime = mockBufferedTime; @@ -213,6 +219,7 @@ public void JumpToEachValueIfDeltaTimeTooBig() public void JumpToLastValueFromStart() { var interpolator = new BufferedLinearInterpolatorFloat(); + interpolator.UseFixedUpdate = false; var mockBufferedTime = new MockInterpolatorTime(0, k_MockTickRate); interpolator.interpolatorTime = mockBufferedTime; @@ -244,6 +251,7 @@ public void JumpToLastValueFromStart() public void TestBufferSizeLimit() { var interpolator = new BufferedLinearInterpolatorFloat(); + interpolator.UseFixedUpdate = false; var mockBufferedTime = new MockInterpolatorTime(0, k_MockTickRate); interpolator.interpolatorTime = mockBufferedTime; @@ -277,6 +285,7 @@ public void TestBufferSizeLimit() public void TestUpdatingInterpolatorWithNoData() { var interpolator = new BufferedLinearInterpolatorFloat(); + interpolator.UseFixedUpdate = false; var mockBufferedTime = new MockInterpolatorTime(0, k_MockTickRate); interpolator.interpolatorTime = mockBufferedTime; @@ -288,6 +297,7 @@ public void TestUpdatingInterpolatorWithNoData() public void TestDuplicatedValues() { var interpolator = new BufferedLinearInterpolatorFloat(); + interpolator.UseFixedUpdate = false; var mockBufferedTime = new MockInterpolatorTime(0, k_MockTickRate); interpolator.interpolatorTime = mockBufferedTime; diff --git a/testproject/Assets/Scenes/ZooSam.unity b/testproject/Assets/Scenes/ZooSam.unity index 6ac4ab70c1..1354882eaa 100644 --- a/testproject/Assets/Scenes/ZooSam.unity +++ b/testproject/Assets/Scenes/ZooSam.unity @@ -3098,6 +3098,164 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 237078269} m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &240282449 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 240282456} + - component: {fileID: 240282455} + - component: {fileID: 240282454} + - component: {fileID: 240282453} + - component: {fileID: 240282452} + - component: {fileID: 240282451} + - component: {fileID: 240282450} + m_Layer: 0 + m_Name: NetworkTransformBuffered (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!114 &240282450 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 240282449} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3} + m_Name: + m_EditorClassIdentifier: + InLocalSpace: 0 + SyncPositionX: 1 + SyncPositionY: 0 + SyncPositionZ: 1 + SyncRotAngleX: 0 + SyncRotAngleY: 1 + SyncRotAngleZ: 0 + SyncScaleX: 0 + SyncScaleY: 0 + SyncScaleZ: 0 + PositionThreshold: 0 + RotAngleThreshold: 0 + ScaleThreshold: 0 + FixedSendsPerSecond: 30 + UseFixedUpdate: 1 +--- !u!114 &240282451 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 240282449} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 307c40a41954948e7a36bb6b64b4b9cb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_MoveSpeed: -5 + m_RotationSpeed: 30 + m_RunServerOnly: 1 + m_RunInUpdate: 1 +--- !u!114 &240282452 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 240282449} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} + m_Name: + m_EditorClassIdentifier: + GlobalObjectIdHash: 2979526890 + AlwaysReplicateAsRoot: 0 + DontDestroyWithOwner: 0 + AutoObjectParentSync: 1 +--- !u!65 &240282453 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 240282449} + 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 &240282454 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 240282449} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: 16358fcb4e0c94cc8b980fbb17259843, 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 &240282455 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 240282449} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &240282456 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 240282449} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -8.25, y: 1.55, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1551181949} + m_Father: {fileID: 0} + m_RootOrder: 8 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &250510712 GameObject: m_ObjectHideFlags: 0 @@ -6222,7 +6380,7 @@ MonoBehaviour: m_EditorClassIdentifier: DontDestroy: 1 RunInBackground: 1 - LogLevel: 1 + LogLevel: 0 NetworkConfig: ProtocolVersion: 0 NetworkTransport: {fileID: 620561613} @@ -6234,7 +6392,7 @@ MonoBehaviour: PlayerPrefab: {fileID: 4700706668509470175, guid: 7eeaaf9e50c0afc4dab93584a54fb0d6, type: 3} NetworkPrefabs: [] - TickRate: 20 + TickRate: 30 ClientConnectionBufferTimeout: 10 ConnectionApproval: 0 ConnectionData: @@ -7492,7 +7650,7 @@ MonoBehaviour: m_MoveSpeed: 5 m_RotationSpeed: 30 m_RunServerOnly: 1 - m_RunInUpdate: 1 + m_RunInUpdate: 0 --- !u!114 &678326394 MonoBehaviour: m_ObjectHideFlags: 0 @@ -7528,13 +7686,14 @@ MonoBehaviour: SyncRotAngleX: 1 SyncRotAngleY: 1 SyncRotAngleZ: 1 - SyncScaleX: 1 - SyncScaleY: 1 - SyncScaleZ: 1 + SyncScaleX: 0 + SyncScaleY: 0 + SyncScaleZ: 0 PositionThreshold: 0 RotAngleThreshold: 0 ScaleThreshold: 0 - FixedSendsPerSecond: 30 + FixedSendsPerSecond: 50 + UseFixedUpdate: 1 --- !u!65 &678326396 BoxCollider: m_ObjectHideFlags: 0 @@ -19687,6 +19846,101 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1537050448} m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1551181948 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1551181949} + - component: {fileID: 1551181952} + - component: {fileID: 1551181951} + - component: {fileID: 1551181950} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1551181949 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1551181948} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.455, y: 0.296, z: 0.312} + m_LocalScale: {x: 0.55787, y: 0.55787, z: 0.55787} + m_Children: [] + m_Father: {fileID: 240282456} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &1551181950 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1551181948} + 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 &1551181951 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1551181948} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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 &1551181952 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1551181948} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} --- !u!1 &1556458764 GameObject: m_ObjectHideFlags: 0 diff --git a/testproject/Assets/Scripts/MoveInCircle.cs b/testproject/Assets/Scripts/MoveInCircle.cs index 6f809325da..00b9aebf9e 100644 --- a/testproject/Assets/Scripts/MoveInCircle.cs +++ b/testproject/Assets/Scripts/MoveInCircle.cs @@ -21,7 +21,7 @@ public class MoveInCircle : NetworkBehaviour public override void OnNetworkSpawn() { base.OnNetworkSpawn(); - NetworkManager.Singleton.NetworkTimeSystem.ServerBufferSec = 0.15f; + //NetworkManager.Singleton.NetworkTimeSystem.ServerBufferSec = 0.15f; } void FixedUpdate() From 54ee62e1f9842b8985e6c0b6fe6cd2fd4838a9b3 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Wed, 1 Sep 2021 15:59:20 -0400 Subject: [PATCH 039/113] fixes after merge --- .../Prototyping/NetworkTransform.cs | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs b/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs index 82bec80bfe..e32fc15d55 100644 --- a/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs @@ -283,7 +283,7 @@ public IEnumerable> AllQuaternionInterpolators() private int k_debugDrawLineTime = 10; internal NetworkState LocalNetworkState; - + private Transform m_Transform; // cache the transform component to reduce unnecessary bounce between managed and native private Vector3 TransformPosition @@ -696,7 +696,7 @@ private void Awake() RotationInterpolator.Awake(); RotationInterpolator.UseFixedUpdate = UseFixedUpdate; - ReplNetworkState.Settings.SendNetworkChannel = NetworkChannel.PositionUpdate; + // ReplNetworkState.NetworkVariableChannel = NetworkChannel.PositionUpdate; // todo figure this out ReplNetworkState.OnValueChanged += OnNetworkStateChanged; } @@ -756,15 +756,15 @@ private void DoSendToOthers(double time) // this needs to be done in Update to catch that time change as soon as it happens. /* todo - if (UpdateNetworkState(ref LocalNetworkState)) + if (UpdateNetworkState(ref LocalNetworkState)) { // if updated (dirty), change NetVar, mark it dirty ReplNetworkState.Value = LocalNetworkState; ReplNetworkState.SetDirty(true); } */ - - var isDirty = UpdateNetworkStateCheckDirty(ref ReplNetworkState.ValueRef, time); // todo sam diff here is Fixedtime + + var isDirty = UpdateNetworkStateCheckDirty(ref LocalNetworkState, time); // todo sam diff here is Fixedtime if (isDirty) { alreadySentLastValue = false; @@ -775,13 +775,17 @@ private void DoSendToOthers(double time) alreadySentLastValue = true; // to send one more value after a transform moves, so that unclamped interpolation has two similar last values shouldSendLastValue = true; } - ReplNetworkState.ValueRef.IsLastSent = shouldSendLastValue; + //ReplNetworkState.ValueRef.IsLastSent = shouldSendLastValue; - ReplNetworkState.SetDirty(shouldSendLastValue || isDirty); - if (ReplNetworkState.IsDirty()) + if (isDirty) { - Debug.DrawLine(ReplNetworkState.Value.Position, ReplNetworkState.Value.Position + Vector3.up, Color.magenta, 10, false); + ReplNetworkState.Value = LocalNetworkState; } + ReplNetworkState.SetDirty(shouldSendLastValue || isDirty); + // if (ReplNetworkState.IsDirty()) + // { + // Debug.DrawLine(ReplNetworkState.Value.Position, ReplNetworkState.Value.Position + Vector3.up, Color.magenta, 10, false); + // } shouldSendLastValue = false; } From 35606d7ce88bc2b4e30b7fac26d5a2cf883fdc31 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Thu, 2 Sep 2021 16:43:52 -0400 Subject: [PATCH 040/113] # --- .../Editor/NetworkTransformEditor.cs | 3 + .../BufferedLinearInterpolator.cs | 67 ++-- .../Prototyping/Interpolator/IInterpolator.cs | 1 + .../Interpolator/NoInterpolator.cs | 5 + .../Interpolator/SimpleInterpolator.cs | 47 ++- .../Prototyping/NetworkTransform.cs | 165 ++++----- testproject/Assets/Scenes/ZooSam.unity | 342 +++++++++++++++++- testproject/Assets/Scripts/MoveInCircle.cs | 8 +- 8 files changed, 488 insertions(+), 150 deletions(-) diff --git a/com.unity.netcode.gameobjects/Editor/NetworkTransformEditor.cs b/com.unity.netcode.gameobjects/Editor/NetworkTransformEditor.cs index 519b2a6f38..c565c917f3 100644 --- a/com.unity.netcode.gameobjects/Editor/NetworkTransformEditor.cs +++ b/com.unity.netcode.gameobjects/Editor/NetworkTransformEditor.cs @@ -21,6 +21,7 @@ public class NetworkTransformEditor : UnityEditor.Editor private SerializedProperty m_ScaleThresholdProperty; private SerializedProperty m_InLocalSpaceProperty; private SerializedProperty m_InterpolateProperty; + private SerializedProperty m_UseFixedUpdateProperty; private static int s_ToggleOffset = 45; private static float s_MaxRowWidth = EditorGUIUtility.labelWidth + EditorGUIUtility.fieldWidth + 5; @@ -44,6 +45,7 @@ public void OnEnable() m_ScaleThresholdProperty = serializedObject.FindProperty(nameof(NetworkTransform.ScaleThreshold)); m_InLocalSpaceProperty = serializedObject.FindProperty(nameof(NetworkTransform.InLocalSpace)); m_InterpolateProperty = serializedObject.FindProperty(nameof(NetworkTransform.Interpolate)); + m_UseFixedUpdateProperty = serializedObject.FindProperty(nameof(NetworkTransform.UseFixedUpdate)); } public override void OnInspectorGUI() @@ -111,6 +113,7 @@ public override void OnInspectorGUI() EditorGUILayout.LabelField("Configurations", EditorStyles.boldLabel); EditorGUILayout.PropertyField(m_InLocalSpaceProperty); EditorGUILayout.PropertyField(m_InterpolateProperty); + EditorGUILayout.PropertyField(m_UseFixedUpdateProperty); serializedObject.ApplyModifiedProperties(); } diff --git a/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs b/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs index 018ebca4ee..e7b97504c1 100644 --- a/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs +++ b/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs @@ -37,8 +37,22 @@ private struct BufferedItem } internal IInterpolatorTime interpolatorTime = new InterpolatorTime(); + + public void ResetTo(T targetValue) + { + m_LifetimeConsumedCount = 1; + m_InterpStartValue = targetValue; + m_InterpEndValue = targetValue; + m_CurrentInterpValue = targetValue; + m_Buffer.Clear(); + m_EndTimeConsumed = new NetworkTime(interpolatorTime.TickRate, 0); + m_StartTimeConsumed = new NetworkTime(interpolatorTime.TickRate, 0); + + simpleInterpolator.ResetTo(targetValue); // for statically placed objects, so we don't interpolate from 0 to current position + Update(0); + } + public bool UseFixedUpdate { get; set; } - // protected virtual double ServerTimeBeingHandledForBuffering => interpolatorTime.BufferedServerTime; // override this if you want configurable buffering, right now using ServerTick's own global buffering protected virtual double ServerTimeBeingHandledForBuffering => UseFixedUpdate ? interpolatorTime.BufferedServerFixedTime : interpolatorTime.BufferedServerTime; // override this if you want configurable buffering, right now using ServerTick's own global buffering protected virtual double RenderTime => interpolatorTime.BufferedServerTime - 1f / interpolatorTime.TickRate; @@ -72,12 +86,12 @@ public void Awake() public void OnNetworkSpawn() { - Update(0); } - double TickOrTime(NetworkTime t) + double FixedOrTime(NetworkTime t) { if (UseFixedUpdate) return t.FixedTime; + return t.Time; } private void TryConsumeFromBuffer() @@ -91,7 +105,7 @@ private void TryConsumeFromBuffer() { var bufferedValue = m_Buffer[i]; // Consume when ready. This can consume multiple times - if (TickOrTime(bufferedValue.timeSent) <= ServerTimeBeingHandledForBuffering) // todo do tick + 1 instead of changing the way tick is calculated? discuss with Luke + if (FixedOrTime(bufferedValue.timeSent) <= ServerTimeBeingHandledForBuffering) // todo do tick + 1 instead of changing the way tick is calculated? discuss with Luke { // if (RenderTime > TickOrTime(m_EndTimeConsumed)) { @@ -119,8 +133,6 @@ private void TryConsumeFromBuffer() public T Update(float deltaTime) { - if (m_LifetimeConsumedCount > 2) // todo remove debug - Debug.Log($"Sam got value m_Buffer.Count {m_Buffer.Count}"); TryConsumeFromBuffer(); if (m_LifetimeConsumedCount == 0 && m_Buffer.Count == 0) @@ -135,7 +147,7 @@ public T Update(float deltaTime) if (m_LifetimeConsumedCount >= 1) // shouldn't interpolate between default values, let's wait to receive data first, should only interpolate between real measurements { - double range = TickOrTime(m_EndTimeConsumed) - TickOrTime(m_StartTimeConsumed); + double range = FixedOrTime(m_EndTimeConsumed) - FixedOrTime(m_StartTimeConsumed); float t; if (range == 0) { @@ -143,7 +155,7 @@ public T Update(float deltaTime) } else { - t = (float) ((RenderTime - TickOrTime(m_StartTimeConsumed)) / range); + t = (float) ((RenderTime - FixedOrTime(m_StartTimeConsumed)) / range); } if (t > 2) // max extrapolation @@ -151,12 +163,11 @@ public T Update(float deltaTime) t = 1; } - if (m_LifetimeConsumedCount > 2) // todo remove debug - Debug.Log($"sam got value t {t}, TT(m_EndTimeConsumed) {TickOrTime(m_EndTimeConsumed)}, TT(m_StartTimeConsumed) {TickOrTime(m_StartTimeConsumed)}, range {range}, " + - $" RenderTime {RenderTime}, ServerTimeBeingHandledForBuffering {ServerTimeBeingHandledForBuffering}, interpolatorTime.TickRate {interpolatorTime.TickRate}, " + - $" interpolatorTime.BufferedServerFixedTime {interpolatorTime.BufferedServerFixedTime}, interpolatorTime.BufferedServerTime {interpolatorTime.BufferedServerTime}"); - Debug.Assert(t >= 0, $"t must be bigger or equal than 0. range {range}, RenderTime {RenderTime}, Start time {TickOrTime(m_StartTimeConsumed)}, end time {TickOrTime(m_EndTimeConsumed)}"); - m_CurrentInterpValue = Interpolate(m_InterpStartValue, m_InterpEndValue, t); + Debug.Assert(t >= 0, $"t must be bigger or equal than 0. range {range}, RenderTime {RenderTime}, Start time {FixedOrTime(m_StartTimeConsumed)}, end time {FixedOrTime(m_EndTimeConsumed)}"); // todo remove GC alloc this creates + + // m_CurrentInterpValue = Interpolate(m_InterpStartValue, m_InterpEndValue, t); + simpleInterpolator.AddMeasurement(Interpolate(m_InterpStartValue, m_InterpEndValue, t), default); // using simple interpolation so there's no jump + m_CurrentInterpValue = simpleInterpolator.Update(deltaTime); } return m_CurrentInterpValue; @@ -190,32 +201,46 @@ public void OnDestroy() { } - public abstract T Interpolate(T start, T end, float time); + protected abstract T Interpolate(T start, T end, float time); + + protected abstract SimpleInterpolator simpleInterpolator { get; } } public class BufferedLinearInterpolatorFloat : BufferedLinearInterpolator { - public override float Interpolate(float start, float end, float time) + protected override float Interpolate(float start, float end, float time) { - return Mathf.Lerp(start, end, time); - // return Mathf.LerpUnclamped(start, end, time); + return Mathf.LerpUnclamped(start, end, time); } public BufferedLinearInterpolatorFloat() { } + + protected override SimpleInterpolator simpleInterpolator { get; } = new SimpleInterpolatorFloat(); + } + + public class BufferedLinearInterpolatorFloatForScale : BufferedLinearInterpolatorFloat + { + protected override float Interpolate(float start, float end, float time) + { + // scale can't be negative, stopping negative extrapolation + return Mathf.Max(Mathf.LerpUnclamped(start, end, time), 0); + } } public class BufferedLinearInterpolatorQuaternion : BufferedLinearInterpolator { - public override Quaternion Interpolate(Quaternion start, Quaternion end, float time) + protected override Quaternion Interpolate(Quaternion start, Quaternion end, float time) { - // return Quaternion.SlerpUnclamped(start, end, time); - return Quaternion.Slerp(start, end, time); + return Quaternion.SlerpUnclamped(start, end, time); + // return Quaternion.Slerp(start, end, time); } public BufferedLinearInterpolatorQuaternion() { } + + protected override SimpleInterpolator simpleInterpolator { get; } = new SimpleInterpolatorQuaternion(); } } \ No newline at end of file diff --git a/com.unity.netcode.gameobjects/Prototyping/Interpolator/IInterpolator.cs b/com.unity.netcode.gameobjects/Prototyping/Interpolator/IInterpolator.cs index 546923128e..3d9bca687c 100644 --- a/com.unity.netcode.gameobjects/Prototyping/Interpolator/IInterpolator.cs +++ b/com.unity.netcode.gameobjects/Prototyping/Interpolator/IInterpolator.cs @@ -13,6 +13,7 @@ public interface IInterpolator public void AddMeasurement(T newMeasurement, NetworkTime sentTime); public T GetInterpolatedValue(); public void OnDestroy(); + public void ResetTo(T targetValue); public bool UseFixedUpdate { get; set; } } } diff --git a/com.unity.netcode.gameobjects/Prototyping/Interpolator/NoInterpolator.cs b/com.unity.netcode.gameobjects/Prototyping/Interpolator/NoInterpolator.cs index 52201e5ec3..fb7c9e58b9 100644 --- a/com.unity.netcode.gameobjects/Prototyping/Interpolator/NoInterpolator.cs +++ b/com.unity.netcode.gameobjects/Prototyping/Interpolator/NoInterpolator.cs @@ -44,6 +44,11 @@ public void OnDestroy() { } + public void ResetTo(T targetValue) + { + m_Current = targetValue; + } + public bool UseFixedUpdate { get; set; } } } \ No newline at end of file diff --git a/com.unity.netcode.gameobjects/Prototyping/Interpolator/SimpleInterpolator.cs b/com.unity.netcode.gameobjects/Prototyping/Interpolator/SimpleInterpolator.cs index 8c8428562d..6b3091640e 100644 --- a/com.unity.netcode.gameobjects/Prototyping/Interpolator/SimpleInterpolator.cs +++ b/com.unity.netcode.gameobjects/Prototyping/Interpolator/SimpleInterpolator.cs @@ -3,12 +3,12 @@ namespace Unity.Netcode { - public class SimpleInterpolatorVector3 : IInterpolator + public abstract class SimpleInterpolator : IInterpolator { private float m_CurrentTime; - private Vector3 m_StartVector; - private Vector3 m_EndVector; - private Vector3 m_UpdatedVector; + private T m_Start; + private T m_End; + private T m_Updated; private const float k_MaxLerpTime = 0.1f; @@ -29,10 +29,10 @@ public void OnEnable() { } - public Vector3 Update(float deltaTime) + public T Update(float deltaTime) { m_CurrentTime += deltaTime; - m_UpdatedVector = Vector3.Lerp(m_StartVector, m_EndVector, m_CurrentTime / k_MaxLerpTime); + m_Updated = Interpolate(m_Start, m_End, m_CurrentTime / k_MaxLerpTime); return GetInterpolatedValue(); } @@ -40,22 +40,47 @@ public void FixedUpdate(float fixedDeltaTime) { } - public void AddMeasurement(Vector3 newMeasurement, NetworkTime sentTick) + public void AddMeasurement(T newMeasurement, NetworkTime sentTick) { - m_EndVector = newMeasurement; + m_End = newMeasurement; m_CurrentTime = 0; - m_StartVector = m_UpdatedVector; + m_Start = m_Updated; } - public Vector3 GetInterpolatedValue() + public T GetInterpolatedValue() { - return m_UpdatedVector; + return m_Updated; } public void OnDestroy() { } + public void ResetTo(T targetValue) + { + m_End = targetValue; + m_Start = targetValue; + m_Updated = targetValue; + m_CurrentTime = 0; + } + + protected abstract T Interpolate(T a, T b, float time); + public bool UseFixedUpdate { get; set; } } + public class SimpleInterpolatorFloat : SimpleInterpolator + { + protected override float Interpolate(float a, float b, float time) + { + return Mathf.Lerp(a, b, time); + } + } + + public class SimpleInterpolatorQuaternion : SimpleInterpolator + { + protected override Quaternion Interpolate(Quaternion a, Quaternion b, float time) + { + return Quaternion.Slerp(a, b, time); + } + } } \ No newline at end of file diff --git a/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs b/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs index e32fc15d55..faad8ba0ec 100644 --- a/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs @@ -10,7 +10,7 @@ namespace Unity.Netcode.Prototyping /// A prototype component for syncing transforms /// [AddComponentMenu("Netcode/" + nameof(NetworkTransform))] -// todo add a note in doc about this + // todo add a note in doc about this // todo have a way for this to be only server side? This way client side you can have scripts that depend on that position update that'll execute afterward [DefaultExecutionOrder(1000)] // this is needed to catch the update time after the transform was updated by user scripts public class NetworkTransform : NetworkBehaviour @@ -27,9 +27,8 @@ internal struct NetworkState : INetworkSerializable internal const int ScaleXBit = 7; internal const int ScaleYBit = 8; internal const int ScaleZBit = 9; - internal const int LastSentBit = 10; // todo remove this - // 11-15: + // 10-15: public ushort Bitset; public bool InLocalSpace @@ -95,12 +94,6 @@ public bool HasScaleZ set => Bitset |= (ushort) ((value ? 1 : 0) << ScaleZBit); } - public bool IsLastSent - { - get => (Bitset & (1 << LastSentBit)) != 0; - set => Bitset |= (ushort) ((value ? 1 : 0) << LastSentBit); - } - public float PositionX, PositionY, PositionZ; public float RotAngleX, RotAngleY, RotAngleZ; public float ScaleX, ScaleY, ScaleZ; @@ -225,64 +218,53 @@ public void NetworkSerialize(NetworkSerializer serializer) public virtual IInterpolator PositionZInterpolator { get; set; } - // public virtual IInterpolator RotationXInterpolator { get; set; } - // public virtual IInterpolator RotationYInterpolator { get; set; } - // public virtual IInterpolator RotationZInterpolator { get; set; } - public virtual IInterpolator RotationInterpolator { get; set; } + public virtual IInterpolator RotationInterpolator { get; set; } // rotation is a single Quaternion since each euler axis will affect the quaternion's final value public virtual IInterpolator ScaleXInterpolator { get; set; } public virtual IInterpolator ScaleYInterpolator { get; set; } public virtual IInterpolator ScaleZInterpolator { get; set; } - public void InitializeInterpolator() where T : IInterpolator, new() where U : IInterpolator, new() + public void InitializeInterpolator() where Pos : IInterpolator, new() where Rot : IInterpolator, new() where Scale : IInterpolator, new() { - PositionXInterpolator = new T(); - PositionYInterpolator = new T(); - PositionZInterpolator = new T(); - RotationInterpolator = new U(); - // RotationXInterpolator = new T(); - // RotationYInterpolator = new T(); - // RotationZInterpolator = new T(); - ScaleXInterpolator = new T(); - ScaleYInterpolator = new T(); - ScaleZInterpolator = new T(); + PositionXInterpolator = new Pos(); + PositionYInterpolator = new Pos(); + PositionZInterpolator = new Pos(); + RotationInterpolator = new Rot(); + ScaleXInterpolator = new Scale(); + ScaleYInterpolator = new Scale(); + ScaleZInterpolator = new Scale(); } public void SetCurrentInterpolatedState() { var tickRate = NetworkManager.Singleton.NetworkConfig.TickRate; - PositionXInterpolator.AddMeasurement(ReplNetworkState.Value.PositionX, new NetworkTime(tickRate, 0.0)); - PositionYInterpolator.AddMeasurement(ReplNetworkState.Value.PositionY, new NetworkTime(tickRate, 0.0)); - PositionZInterpolator.AddMeasurement(ReplNetworkState.Value.PositionZ, new NetworkTime(tickRate, 0.0)); - RotationInterpolator.AddMeasurement(Quaternion.Euler(ReplNetworkState.Value.Rotation), new NetworkTime(tickRate, 0.0)); - // RotationXInterpolator.AddMeasurement(ReplNetworkState.Value.RotationX ulerAngles.x, new NetworkTime(tickRate, 0.0)); - // RotationYInterpolator.AddMeasurement(ReplNetworkState.Value.RotationX ulerAngles.y, new NetworkTime(tickRate, 0.0)); - // RotationZInterpolator.AddMeasurement(ReplNetworkState.Value.RotationX ulerAngles.z, new NetworkTime(tickRate, 0.0)); - ScaleXInterpolator.AddMeasurement(ReplNetworkState.Value.ScaleX, new NetworkTime(tickRate, 0.0)); - ScaleYInterpolator.AddMeasurement(ReplNetworkState.Value.ScaleY, new NetworkTime(tickRate, 0.0)); - ScaleZInterpolator.AddMeasurement(ReplNetworkState.Value.ScaleZ, new NetworkTime(tickRate, 0.0)); + for (int i = 0; i < 1; i++) // repeat this twice to set both "start" and "end" values + { + ScaleXInterpolator.ResetTo(ReplNetworkState.Value.ScaleX); + ScaleYInterpolator.ResetTo(ReplNetworkState.Value.ScaleY); + ScaleZInterpolator.ResetTo(ReplNetworkState.Value.ScaleZ); + + PositionXInterpolator.ResetTo(ReplNetworkState.Value.PositionX); + PositionYInterpolator.ResetTo(ReplNetworkState.Value.PositionY); + PositionZInterpolator.ResetTo(ReplNetworkState.Value.PositionZ); + + RotationInterpolator.ResetTo(Quaternion.Euler(ReplNetworkState.Value.Rotation)); + } } public IEnumerable> AllFloatInterpolators() { - yield return PositionXInterpolator; - yield return PositionYInterpolator; - yield return PositionZInterpolator; - // yield return RotationXInterpolator; - // yield return RotationYInterpolator; - // yield return RotationZInterpolator; yield return ScaleXInterpolator; yield return ScaleYInterpolator; yield return ScaleZInterpolator; - } - public IEnumerable> AllQuaternionInterpolators() - { - yield return RotationInterpolator; + yield return PositionXInterpolator; + yield return PositionYInterpolator; + yield return PositionZInterpolator; } private int k_debugDrawLineTime = 10; - internal NetworkState LocalNetworkState; + internal NetworkState LocalAuthoritativeNetworkState; private Transform m_Transform; // cache the transform component to reduce unnecessary bounce between managed and native @@ -442,7 +424,7 @@ internal bool UpdateNetworkStateCheckDirty(ref NetworkState networkState, double isDirty |= isPositionDirty || isRotationDirty || isScaleDirty; - // if (isDirty) + if (isDirty) { networkState.SentTime = dirtyTime; } @@ -477,22 +459,6 @@ internal void ApplyNetworkStateFromAuthority(NetworkState networkState) interpolatedPosition.z = PositionZInterpolator.GetInterpolatedValue(); } - // RotAngles Read - // if (networkState.HasRotAngleX) - // { - // interpolatedRotAngles.x = RotationXInterpolator.GetInterpolatedValue(); - // } - // - // if (networkState.HasRotAngleY) - // { - // interpolatedRotAngles.y = RotationYInterpolator.GetInterpolatedValue(); - // } - // - // if (networkState.HasRotAngleZ) - // { - // interpolatedRotAngles.z = RotationZInterpolator.GetInterpolatedValue(); - // } - if (networkState.HasRotAngleX) { interpolatedRotAngles.x = RotationInterpolator.GetInterpolatedValue().eulerAngles.x; @@ -566,6 +532,7 @@ internal void ApplyNetworkStateFromAuthority(NetworkState networkState) { m_Transform.localScale = Vector3.one; var lossyScale = m_Transform.lossyScale; + // todo this conversion is messing with interpolation. local scale interpolates fine, lossy scale is jittery. should investigate m_Transform.localScale = new Vector3(networkState.ScaleX / lossyScale.x, networkState.ScaleY / lossyScale.y, networkState.ScaleZ / lossyScale.z); } @@ -603,6 +570,11 @@ private void OnNetworkStateChanged(NetworkState oldState, NetworkState newState) return; } + if (IsServer) + { + return; // todo use authority + } + // todo for teleport, check teleport flag // if (newState.Teleporting) // { @@ -611,11 +583,6 @@ private void OnNetworkStateChanged(NetworkState oldState, NetworkState newState) var sentTime = new NetworkTime(NetworkManager.Singleton.ServerTime.TickRate, newState.SentTime); - if (newState.IsLastSent) - { - Debug.Log("asdf"); - } - if (newState.HasPositionX) { PositionXInterpolator.AddMeasurement(newState.Position.x, sentTime); @@ -673,6 +640,7 @@ private void OnNetworkStateChanged(NetworkState oldState, NetworkState newState) private void Awake() { + // NetworkManager.Singleton.NetworkTickSystem.Tick += TickFixedUpdate; m_Transform = transform; bool interpolatorAlreadySet = false; foreach (var interpolator in AllFloatInterpolators()) @@ -683,9 +651,10 @@ private void Awake() break; } } + if (!interpolatorAlreadySet) { - InitializeInterpolator(); + InitializeInterpolator(); } foreach (var interpolator in AllFloatInterpolators()) @@ -693,10 +662,26 @@ private void Awake() interpolator.Awake(); interpolator.UseFixedUpdate = UseFixedUpdate; } + RotationInterpolator.Awake(); RotationInterpolator.UseFixedUpdate = UseFixedUpdate; // ReplNetworkState.NetworkVariableChannel = NetworkChannel.PositionUpdate; // todo figure this out + + // set initial value for spawn + if (IsServer) + { + if (UseFixedUpdate) + { + // try to update local NetworkState + DoSendToOthers(NetworkManager.LocalTime.FixedTime); + } + else + { + DoSendToOthers(NetworkManager.LocalTime.Time); + } + } + ReplNetworkState.OnValueChanged += OnNetworkStateChanged; } @@ -726,11 +711,11 @@ public override void OnNetworkSpawn() { SetCurrentInterpolatedState(); // useful for late joining - foreach (var interpolator in AllFloatInterpolators()) + foreach (var interpolator in AllFloatInterpolators()) // todo remove GC alloc this creates { interpolator.OnNetworkSpawn(); } - +// todo cache network manager to remove some of the time it takes to get it RotationInterpolator.OnNetworkSpawn(); ApplyNetworkStateFromAuthority(ReplNetworkState.Value); @@ -747,46 +732,18 @@ private void OnDestroy() } RotationInterpolator.OnDestroy(); - } private void DoSendToOthers(double time) { // check for time there was a change to the transform // this needs to be done in Update to catch that time change as soon as it happens. - /* - todo - if (UpdateNetworkState(ref LocalNetworkState)) - { - // if updated (dirty), change NetVar, mark it dirty - ReplNetworkState.Value = LocalNetworkState; - ReplNetworkState.SetDirty(true); - } - */ - - var isDirty = UpdateNetworkStateCheckDirty(ref LocalNetworkState, time); // todo sam diff here is Fixedtime - if (isDirty) - { - alreadySentLastValue = false; - } - else if (!alreadySentLastValue) - { - isDirty = true; - alreadySentLastValue = true; // to send one more value after a transform moves, so that unclamped interpolation has two similar last values - shouldSendLastValue = true; - } - //ReplNetworkState.ValueRef.IsLastSent = shouldSendLastValue; - if (isDirty) + if (UpdateNetworkStateCheckDirty(ref LocalAuthoritativeNetworkState, time)) { - ReplNetworkState.Value = LocalNetworkState; + ReplNetworkState.Value = LocalAuthoritativeNetworkState; + ReplNetworkState.SetDirty(true); } - ReplNetworkState.SetDirty(shouldSendLastValue || isDirty); - // if (ReplNetworkState.IsDirty()) - // { - // Debug.DrawLine(ReplNetworkState.Value.Position, ReplNetworkState.Value.Position + Vector3.up, Color.magenta, 10, false); - // } - shouldSendLastValue = false; } private void FixedUpdate() @@ -826,8 +783,8 @@ private void FixedUpdate() } } - private bool alreadySentLastValue = false; - private bool shouldSendLastValue = false; + // private bool alreadySentLastValue = false; + // private bool shouldSendLastValue = false; private void Update() @@ -841,6 +798,8 @@ private void Update() { DoSendToOthers(NetworkManager.LocalTime.Time); } + + // apply interpolated value if (!IsServer && (NetworkManager.Singleton.IsConnectedClient || NetworkManager.Singleton.IsListening)) { foreach (var interpolator in AllFloatInterpolators()) diff --git a/testproject/Assets/Scenes/ZooSam.unity b/testproject/Assets/Scenes/ZooSam.unity index 1354882eaa..7d7f227c45 100644 --- a/testproject/Assets/Scenes/ZooSam.unity +++ b/testproject/Assets/Scenes/ZooSam.unity @@ -3132,7 +3132,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3} m_Name: m_EditorClassIdentifier: - InLocalSpace: 0 SyncPositionX: 1 SyncPositionY: 0 SyncPositionZ: 1 @@ -3145,6 +3144,8 @@ MonoBehaviour: PositionThreshold: 0 RotAngleThreshold: 0 ScaleThreshold: 0 + InLocalSpace: 0 + Interpolate: 1 FixedSendsPerSecond: 30 UseFixedUpdate: 1 --- !u!114 &240282451 @@ -5175,6 +5176,101 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 489960630} m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &491088866 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 491088867} + - component: {fileID: 491088870} + - component: {fileID: 491088869} + - component: {fileID: 491088868} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &491088867 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 491088866} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -0.01, y: 0.47, z: 0} + m_LocalScale: {x: 0.55787, y: 0.55787, z: 0.55787} + m_Children: [] + m_Father: {fileID: 1934616770} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &491088868 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 491088866} + 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 &491088869 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 491088866} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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 &491088870 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 491088866} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} --- !u!1 &506377921 GameObject: m_ObjectHideFlags: 0 @@ -5559,6 +5655,89 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 555000401} m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &557794667 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 557794668} + - component: {fileID: 557794670} + - component: {fileID: 557794669} + m_Layer: 0 + m_Name: Camera + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &557794668 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 557794667} + m_LocalRotation: {x: 0.5, y: -0, z: -0, w: 0.8660254} + m_LocalPosition: {x: 8.25, y: 18.45, z: -16} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1934616770} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 60, y: 0, z: 0} +--- !u!81 &557794669 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 557794667} + m_Enabled: 1 +--- !u!20 &557794670 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 557794667} + 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: 0 + 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!1 &561629645 GameObject: m_ObjectHideFlags: 0 @@ -6384,11 +6563,6 @@ MonoBehaviour: NetworkConfig: ProtocolVersion: 0 NetworkTransport: {fileID: 620561613} - RegisteredScenes: - - SampleScene - - ZooSam - RegisteredSceneAssets: [] - AllowRuntimeSceneChanges: 0 PlayerPrefab: {fileID: 4700706668509470175, guid: 7eeaaf9e50c0afc4dab93584a54fb0d6, type: 3} NetworkPrefabs: [] @@ -6443,8 +6617,8 @@ MonoBehaviour: channels: [] MessageBufferSize: 5120 SimulatePacketLossChance: 0 - SimulateMinLatency: 0 - SimulateMaxLatency: 0 + SimulateMinLatency: 70 + SimulateMaxLatency: 130 --- !u!1001 &627808638 PrefabInstance: m_ObjectHideFlags: 0 @@ -7679,19 +7853,20 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3} m_Name: m_EditorClassIdentifier: - InLocalSpace: 0 SyncPositionX: 1 SyncPositionY: 1 SyncPositionZ: 1 SyncRotAngleX: 1 SyncRotAngleY: 1 SyncRotAngleZ: 1 - SyncScaleX: 0 - SyncScaleY: 0 - SyncScaleZ: 0 + SyncScaleX: 1 + SyncScaleY: 1 + SyncScaleZ: 1 PositionThreshold: 0 RotAngleThreshold: 0 ScaleThreshold: 0 + InLocalSpace: 1 + Interpolate: 1 FixedSendsPerSecond: 50 UseFixedUpdate: 1 --- !u!65 &678326396 @@ -24572,6 +24747,149 @@ PrefabInstance: objectReference: {fileID: 0} m_RemovedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: d725b5588e1b956458798319e6541d84, type: 3} +--- !u!1 &1934616763 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1934616770} + - component: {fileID: 1934616769} + - component: {fileID: 1934616768} + - component: {fileID: 1934616767} + - component: {fileID: 1934616766} + - component: {fileID: 1934616764} + m_Layer: 0 + m_Name: NetworkTransformBuffered-no-move + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!114 &1934616764 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1934616763} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3} + m_Name: + m_EditorClassIdentifier: + SyncPositionX: 1 + SyncPositionY: 1 + SyncPositionZ: 1 + SyncRotAngleX: 1 + SyncRotAngleY: 1 + SyncRotAngleZ: 1 + SyncScaleX: 0 + SyncScaleY: 0 + SyncScaleZ: 0 + PositionThreshold: 0 + RotAngleThreshold: 0 + ScaleThreshold: 0 + InLocalSpace: 0 + Interpolate: 1 + FixedSendsPerSecond: 50 + UseFixedUpdate: 1 +--- !u!114 &1934616766 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1934616763} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} + m_Name: + m_EditorClassIdentifier: + GlobalObjectIdHash: 3146719950 + AlwaysReplicateAsRoot: 0 + DontDestroyWithOwner: 0 + AutoObjectParentSync: 1 +--- !u!65 &1934616767 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1934616763} + 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 &1934616768 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1934616763} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: 16358fcb4e0c94cc8b980fbb17259843, 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 &1934616769 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1934616763} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &1934616770 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1934616763} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 6.26, y: 1.55, z: 5.87} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 557794668} + - {fileID: 491088867} + m_Father: {fileID: 0} + m_RootOrder: 9 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1949195315 GameObject: m_ObjectHideFlags: 0 diff --git a/testproject/Assets/Scripts/MoveInCircle.cs b/testproject/Assets/Scripts/MoveInCircle.cs index 00b9aebf9e..51218b31af 100644 --- a/testproject/Assets/Scripts/MoveInCircle.cs +++ b/testproject/Assets/Scripts/MoveInCircle.cs @@ -27,24 +27,26 @@ public override void OnNetworkSpawn() void FixedUpdate() { if (m_RunInUpdate) return; - Tick(Time.fixedDeltaTime); + Tick(true); } private void Update() { if (!m_RunInUpdate) return; - Tick(Time.deltaTime); + Tick(false); } - void Tick(float deltaTime) + void Tick(bool isFixed) { if (NetworkManager.Singleton.IsServer || !m_RunServerOnly) { m_DebugOldPosition = transform.position; + var deltaTime = isFixed ? Time.fixedDeltaTime : Time.deltaTime; transform.position = transform.position + transform.forward * (m_MoveSpeed * deltaTime); // Debug.Log($"ewqqwe {Math.Round((transform.position - debug_oldPosition).magnitude, 2)} time diff {Math.Round(Time.time - lastTime, 2)}"); m_DebugLastTime = Time.time; transform.Rotate(0, m_RotationSpeed * deltaTime, 0); + transform.localScale = ((Mathf.Sin(isFixed ? Time.fixedTime : Time.time)+1) * Vector3.one); } } } From 3d569862931d52f54a23a7a2f44a93bc5508e81d Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Thu, 2 Sep 2021 20:28:36 -0400 Subject: [PATCH 041/113] # --- .../BufferedLinearInterpolator.cs | 63 +++--- .../Prototyping/NetworkTransform.cs | 183 +++++------------- 2 files changed, 75 insertions(+), 171 deletions(-) diff --git a/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs b/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs index e7b97504c1..a27284377f 100644 --- a/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs +++ b/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs @@ -38,22 +38,12 @@ private struct BufferedItem internal IInterpolatorTime interpolatorTime = new InterpolatorTime(); - public void ResetTo(T targetValue) - { - m_LifetimeConsumedCount = 1; - m_InterpStartValue = targetValue; - m_InterpEndValue = targetValue; - m_CurrentInterpValue = targetValue; - m_Buffer.Clear(); - m_EndTimeConsumed = new NetworkTime(interpolatorTime.TickRate, 0); - m_StartTimeConsumed = new NetworkTime(interpolatorTime.TickRate, 0); - - simpleInterpolator.ResetTo(targetValue); // for statically placed objects, so we don't interpolate from 0 to current position - Update(0); - } - public bool UseFixedUpdate { get; set; } - protected virtual double ServerTimeBeingHandledForBuffering => UseFixedUpdate ? interpolatorTime.BufferedServerFixedTime : interpolatorTime.BufferedServerTime; // override this if you want configurable buffering, right now using ServerTick's own global buffering + + /// + /// Override this if you want configurable buffering, right now using ServerTick's own global buffering + /// + protected virtual double ServerTimeBeingHandledForBuffering => UseFixedUpdate ? interpolatorTime.BufferedServerFixedTime : interpolatorTime.BufferedServerTime; protected virtual double RenderTime => interpolatorTime.BufferedServerTime - 1f / interpolatorTime.TickRate; private T m_InterpStartValue; @@ -88,6 +78,20 @@ public void OnNetworkSpawn() { } + public void ResetTo(T targetValue) + { + m_LifetimeConsumedCount = 1; + m_InterpStartValue = targetValue; + m_InterpEndValue = targetValue; + m_CurrentInterpValue = targetValue; + m_Buffer.Clear(); + m_EndTimeConsumed = new NetworkTime(interpolatorTime.TickRate, 0); + m_StartTimeConsumed = new NetworkTime(interpolatorTime.TickRate, 0); + + simpleInterpolator.ResetTo(targetValue); // for statically placed objects, so we don't interpolate from 0 to current position + Update(0); + } + double FixedOrTime(NetworkTime t) { if (UseFixedUpdate) return t.FixedTime; @@ -101,24 +105,21 @@ private void TryConsumeFromBuffer() if (RenderTime >= m_EndTimeConsumed.Time) { // buffer is sorted so older (smaller) time values are at the end. - for (int i = m_Buffer.Count - 1; i >= 0; i--) + for (int i = m_Buffer.Count - 1; i >= 0; i--) // todo stretch: consume ahead if we see we're missing values { var bufferedValue = m_Buffer[i]; // Consume when ready. This can consume multiple times if (FixedOrTime(bufferedValue.timeSent) <= ServerTimeBeingHandledForBuffering) // todo do tick + 1 instead of changing the way tick is calculated? discuss with Luke { - // if (RenderTime > TickOrTime(m_EndTimeConsumed)) + if (m_LifetimeConsumedCount == 0) + { + m_StartTimeConsumed = bufferedValue.timeSent; + m_InterpStartValue = bufferedValue.item; + } + else if (consumedCount == 0) { - if (m_LifetimeConsumedCount == 0) - { - m_StartTimeConsumed = bufferedValue.timeSent; - m_InterpStartValue = bufferedValue.item; - } - else if (consumedCount == 0) - { - m_StartTimeConsumed = m_EndTimeConsumed; - m_InterpStartValue = m_InterpEndValue; - } + m_StartTimeConsumed = m_EndTimeConsumed; + m_InterpStartValue = m_InterpEndValue; } m_EndTimeConsumed = bufferedValue.timeSent; @@ -158,14 +159,13 @@ public T Update(float deltaTime) t = (float) ((RenderTime - FixedOrTime(m_StartTimeConsumed)) / range); } - if (t > 2) // max extrapolation + // if (t > 5) // max extrapolation { t = 1; } Debug.Assert(t >= 0, $"t must be bigger or equal than 0. range {range}, RenderTime {RenderTime}, Start time {FixedOrTime(m_StartTimeConsumed)}, end time {FixedOrTime(m_EndTimeConsumed)}"); // todo remove GC alloc this creates - // m_CurrentInterpValue = Interpolate(m_InterpStartValue, m_InterpEndValue, t); simpleInterpolator.AddMeasurement(Interpolate(m_InterpStartValue, m_InterpEndValue, t), default); // using simple interpolation so there's no jump m_CurrentInterpValue = simpleInterpolator.Update(deltaTime); } @@ -213,10 +213,6 @@ protected override float Interpolate(float start, float end, float time) return Mathf.LerpUnclamped(start, end, time); } - public BufferedLinearInterpolatorFloat() - { - } - protected override SimpleInterpolator simpleInterpolator { get; } = new SimpleInterpolatorFloat(); } @@ -234,7 +230,6 @@ public class BufferedLinearInterpolatorQuaternion : BufferedLinearInterpolator [AddComponentMenu("Netcode/" + nameof(NetworkTransform))] - // todo add a note in doc about this - // todo have a way for this to be only server side? This way client side you can have scripts that depend on that position update that'll execute afterward [DefaultExecutionOrder(1000)] // this is needed to catch the update time after the transform was updated by user scripts public class NetworkTransform : NetworkBehaviour { @@ -135,7 +133,7 @@ public Vector3 Scale public void NetworkSerialize(NetworkSerializer serializer) { serializer.Serialize(ref SentTime); - // InLocalSpace + HasXXX Bits + LastSent flag + // InLocalSpace + HasXXX Bits serializer.Serialize(ref Bitset); // Position Values if (HasPositionX) @@ -202,7 +200,6 @@ public void NetworkSerialize(NetworkSerializer serializer) [Tooltip("Sets whether this transform should sync in local space or in world space")] public bool InLocalSpace = false; - // todo: revisit after MTT-876 public bool Interpolate = true; /// @@ -215,9 +212,7 @@ public void NetworkSerialize(NetworkSerializer serializer) public virtual IInterpolator PositionXInterpolator { get; set; } public virtual IInterpolator PositionYInterpolator { get; set; } - public virtual IInterpolator PositionZInterpolator { get; set; } - public virtual IInterpolator RotationInterpolator { get; set; } // rotation is a single Quaternion since each euler axis will affect the quaternion's final value public virtual IInterpolator ScaleXInterpolator { get; set; } public virtual IInterpolator ScaleYInterpolator { get; set; } @@ -225,100 +220,66 @@ public void NetworkSerialize(NetworkSerializer serializer) public void InitializeInterpolator() where Pos : IInterpolator, new() where Rot : IInterpolator, new() where Scale : IInterpolator, new() { - PositionXInterpolator = new Pos(); - PositionYInterpolator = new Pos(); - PositionZInterpolator = new Pos(); - RotationInterpolator = new Rot(); - ScaleXInterpolator = new Scale(); - ScaleYInterpolator = new Scale(); - ScaleZInterpolator = new Scale(); - } - - public void SetCurrentInterpolatedState() - { - var tickRate = NetworkManager.Singleton.NetworkConfig.TickRate; - for (int i = 0; i < 1; i++) // repeat this twice to set both "start" and "end" values + if (Interpolate) { - ScaleXInterpolator.ResetTo(ReplNetworkState.Value.ScaleX); - ScaleYInterpolator.ResetTo(ReplNetworkState.Value.ScaleY); - ScaleZInterpolator.ResetTo(ReplNetworkState.Value.ScaleZ); - - PositionXInterpolator.ResetTo(ReplNetworkState.Value.PositionX); - PositionYInterpolator.ResetTo(ReplNetworkState.Value.PositionY); - PositionZInterpolator.ResetTo(ReplNetworkState.Value.PositionZ); - - RotationInterpolator.ResetTo(Quaternion.Euler(ReplNetworkState.Value.Rotation)); + PositionXInterpolator = new Pos(); + PositionYInterpolator = new Pos(); + PositionZInterpolator = new Pos(); + RotationInterpolator = new Rot(); + ScaleXInterpolator = new Scale(); + ScaleYInterpolator = new Scale(); + ScaleZInterpolator = new Scale(); + } + else + { + PositionXInterpolator = new NoInterpolator(); + PositionYInterpolator = new NoInterpolator(); + PositionZInterpolator = new NoInterpolator(); + RotationInterpolator = new NoInterpolator(); + ScaleXInterpolator = new NoInterpolator(); + ScaleYInterpolator = new NoInterpolator(); + ScaleZInterpolator = new NoInterpolator(); } } public IEnumerable> AllFloatInterpolators() { - yield return ScaleXInterpolator; - yield return ScaleYInterpolator; - yield return ScaleZInterpolator; - yield return PositionXInterpolator; yield return PositionYInterpolator; yield return PositionZInterpolator; + yield return ScaleXInterpolator; + yield return ScaleYInterpolator; + yield return ScaleZInterpolator; } private int k_debugDrawLineTime = 10; - internal NetworkState LocalAuthoritativeNetworkState; private Transform m_Transform; // cache the transform component to reduce unnecessary bounce between managed and native - private Vector3 TransformPosition - { - get - { - if (InLocalSpace) - { - return m_Transform.localPosition; - } - else - { - return m_Transform.position; - } - } - } + internal readonly NetworkVariable ReplNetworkState = new NetworkVariable(new NetworkState()); + internal NetworkState PrevNetworkState; + internal NetworkState LocalAuthoritativeNetworkState; - private Quaternion TransformRotation + public void ResetCurrentInterpolatedState() { - get + var tickRate = NetworkManager.Singleton.NetworkConfig.TickRate; + for (int i = 0; i < 1; i++) // repeat this twice to set both "start" and "end" values { - if (InLocalSpace) - { - return m_Transform.localRotation; - } - else - { - return m_Transform.rotation; - } - } - } + ScaleXInterpolator.ResetTo(ReplNetworkState.Value.ScaleX); + ScaleYInterpolator.ResetTo(ReplNetworkState.Value.ScaleY); + ScaleZInterpolator.ResetTo(ReplNetworkState.Value.ScaleZ); - private Vector3 TransformScale - { - get - { - if (InLocalSpace) - { - return m_Transform.localScale; - } - else - { - return m_Transform.lossyScale; - } + PositionXInterpolator.ResetTo(ReplNetworkState.Value.PositionX); + PositionYInterpolator.ResetTo(ReplNetworkState.Value.PositionY); + PositionZInterpolator.ResetTo(ReplNetworkState.Value.PositionZ); + + RotationInterpolator.ResetTo(Quaternion.Euler(ReplNetworkState.Value.Rotation)); } } - internal readonly NetworkVariable ReplNetworkState = new NetworkVariable(new NetworkState()); - internal NetworkState PrevNetworkState; - // updates `NetworkState` properties if they need to and returns a `bool` indicating whether or not there was any changes made // returned boolean would be useful to change encapsulating `NetworkVariable`'s dirty state, e.g. ReplNetworkState.SetDirty(isDirty); - internal bool UpdateNetworkStateCheckDirty(ref NetworkState networkState, double dirtyTime) { return UpdateNetworkStateCheckDirtyWithInfo(ref networkState, dirtyTime).isDirty; @@ -532,7 +493,7 @@ internal void ApplyNetworkStateFromAuthority(NetworkState networkState) { m_Transform.localScale = Vector3.one; var lossyScale = m_Transform.lossyScale; - // todo this conversion is messing with interpolation. local scale interpolates fine, lossy scale is jittery. should investigate + // todo this conversion is messing with interpolation. local scale interpolates fine, lossy scale is jittery. must investigate m_Transform.localScale = new Vector3(networkState.ScaleX / lossyScale.x, networkState.ScaleY / lossyScale.y, networkState.ScaleZ / lossyScale.z); } @@ -540,28 +501,6 @@ internal void ApplyNetworkStateFromAuthority(NetworkState networkState) } } - // Is the non-interpolated authoritative state dirty? - private bool IsAuthoritativeTransformDirty() - { - bool isDirty = false; - var networkState = ReplNetworkState.Value; - isDirty |= networkState.InLocalSpace != InLocalSpace; - if (InLocalSpace) - { - isDirty |= networkState.Position != m_Transform.localPosition; - isDirty |= networkState.Rotation != m_Transform.localEulerAngles; - isDirty |= networkState.Scale != m_Transform.localScale; - } - else - { - isDirty |= networkState.Position != m_Transform.position; - isDirty |= networkState.Rotation != m_Transform.eulerAngles; - isDirty |= networkState.Scale != m_Transform.lossyScale; - } - - return isDirty; - } - private void OnNetworkStateChanged(NetworkState oldState, NetworkState newState) { if (!NetworkObject.IsSpawned) @@ -575,12 +514,6 @@ private void OnNetworkStateChanged(NetworkState oldState, NetworkState newState) return; // todo use authority } - // todo for teleport, check teleport flag - // if (newState.Teleporting) - // { - // PositionInterpolator.Reset(newState.Position, new NetworkTime(NetworkManager.Singleton.ServerTime.TickRate, newState.SentTick)); - // } - var sentTime = new NetworkTime(NetworkManager.Singleton.ServerTime.TickRate, newState.SentTime); if (newState.HasPositionX) @@ -598,22 +531,6 @@ private void OnNetworkStateChanged(NetworkState oldState, NetworkState newState) PositionZInterpolator.AddMeasurement(newState.Position.z, sentTime); } - - // todo fix this - // if (newState.HasRotAngleX) - // { - // RotationXInterpolator.AddMeasurement(newState.RotAngleX, sentTime); - // } - // - // if (newState.HasRotAngleY) - // { - // RotationYInterpolator.AddMeasurement(newState.RotAngleY, sentTime); - // } - // - // if (newState.HasRotAngleZ) - // { - // RotationZInterpolator.AddMeasurement(newState.RotAngleZ, sentTime); - // } RotationInterpolator.AddMeasurement(Quaternion.Euler(newState.Rotation), sentTime); if (newState.HasScaleX) @@ -640,7 +557,6 @@ private void OnNetworkStateChanged(NetworkState oldState, NetworkState newState) private void Awake() { - // NetworkManager.Singleton.NetworkTickSystem.Tick += TickFixedUpdate; m_Transform = transform; bool interpolatorAlreadySet = false; foreach (var interpolator in AllFloatInterpolators()) @@ -666,7 +582,7 @@ private void Awake() RotationInterpolator.Awake(); RotationInterpolator.UseFixedUpdate = UseFixedUpdate; - // ReplNetworkState.NetworkVariableChannel = NetworkChannel.PositionUpdate; // todo figure this out + // ReplNetworkState.NetworkVariableChannel = NetworkChannel.PositionUpdate; // todo figure this out, talk with Matt/Fatih, this should be unreliable // set initial value for spawn if (IsServer) @@ -674,11 +590,11 @@ private void Awake() if (UseFixedUpdate) { // try to update local NetworkState - DoSendToOthers(NetworkManager.LocalTime.FixedTime); + DoUpdateToGhosts(NetworkManager.LocalTime.FixedTime); } else { - DoSendToOthers(NetworkManager.LocalTime.Time); + DoUpdateToGhosts(NetworkManager.LocalTime.Time); } } @@ -709,13 +625,13 @@ public override void OnNetworkSpawn() { if (!IsServer) { - SetCurrentInterpolatedState(); // useful for late joining + ResetCurrentInterpolatedState(); // useful for late joining foreach (var interpolator in AllFloatInterpolators()) // todo remove GC alloc this creates { interpolator.OnNetworkSpawn(); } -// todo cache network manager to remove some of the time it takes to get it + // todo cache network manager to remove some of the time it takes to get it RotationInterpolator.OnNetworkSpawn(); ApplyNetworkStateFromAuthority(ReplNetworkState.Value); @@ -734,11 +650,8 @@ private void OnDestroy() RotationInterpolator.OnDestroy(); } - private void DoSendToOthers(double time) + private void DoUpdateToGhosts(double time) { - // check for time there was a change to the transform - // this needs to be done in Update to catch that time change as soon as it happens. - if (UpdateNetworkStateCheckDirty(ref LocalAuthoritativeNetworkState, time)) { ReplNetworkState.Value = LocalAuthoritativeNetworkState; @@ -753,10 +666,10 @@ private void FixedUpdate() return; } - if (IsServer && UseFixedUpdate) + if (IsServer && UseFixedUpdate) // todo change IsServer for HasAuthority check { // try to update local NetworkState - DoSendToOthers(NetworkManager.LocalTime.FixedTime); + DoUpdateToGhosts(NetworkManager.LocalTime.FixedTime); } // try to update previously consumed NetworkState @@ -783,10 +696,6 @@ private void FixedUpdate() } } - // private bool alreadySentLastValue = false; - // private bool shouldSendLastValue = false; - - private void Update() { if (!NetworkObject.IsSpawned) @@ -796,7 +705,7 @@ private void Update() if (IsServer && !UseFixedUpdate) { - DoSendToOthers(NetworkManager.LocalTime.Time); + DoUpdateToGhosts(NetworkManager.LocalTime.Time); } // apply interpolated value From 9374e4bf37a10ffd95fe07c790c8aabb6e7d4e12 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Thu, 2 Sep 2021 22:05:19 -0400 Subject: [PATCH 042/113] # --- .../BufferedLinearInterpolator.cs | 14 +- .../Prototyping/Interpolator/IInterpolator.cs | 2 - .../Interpolator/SimpleInterpolator.cs | 2 +- .../Prototyping/NetworkTransform.cs | 25 +- .../Runtime/Timing/NetworkTime.cs | 3 +- .../Runtime/Timing/NetworkTimeSystem.cs | 3 - .../Tests/Editor/InterpolatorTests.cs | 88 +++++- .../NetworkTransform/NetworkTransformTests.cs | 23 +- testproject/Assets/Scenes/ZooSam.unity | 258 +++++++++++++++++- 9 files changed, 358 insertions(+), 60 deletions(-) diff --git a/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs b/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs index a27284377f..4a3c22ff27 100644 --- a/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs +++ b/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs @@ -5,8 +5,8 @@ namespace Unity.Netcode { /// - /// Solves for jittered incoming values - /// Doesn't solve for message loss + /// Solves for incoming values that are jittered + /// Partially solves for message loss. Unclamped lerping will help hide it, but not completely /// /// public abstract class BufferedLinearInterpolator : IInterpolator where T : struct @@ -30,14 +30,14 @@ private class InterpolatorTime : IInterpolatorTime public int TickRate => NetworkManager.Singleton.ServerTime.TickRate; } + internal IInterpolatorTime interpolatorTime = new InterpolatorTime(); + private struct BufferedItem { public T item; public NetworkTime timeSent; } - internal IInterpolatorTime interpolatorTime = new InterpolatorTime(); - public bool UseFixedUpdate { get; set; } /// @@ -98,6 +98,8 @@ double FixedOrTime(NetworkTime t) return t.Time; } + + // todo if I have value 1, 2, 3 and I'm treating 1 to 3, I shouldn't interpolate between 1 and 3, I should interpolate from 1 to 2, then from 2 to 3 to get the best path private void TryConsumeFromBuffer() { int consumedCount = 0; @@ -109,7 +111,7 @@ private void TryConsumeFromBuffer() { var bufferedValue = m_Buffer[i]; // Consume when ready. This can consume multiple times - if (FixedOrTime(bufferedValue.timeSent) <= ServerTimeBeingHandledForBuffering) // todo do tick + 1 instead of changing the way tick is calculated? discuss with Luke + if (FixedOrTime(bufferedValue.timeSent) <= ServerTimeBeingHandledForBuffering) { if (m_LifetimeConsumedCount == 0) { @@ -159,7 +161,7 @@ public T Update(float deltaTime) t = (float) ((RenderTime - FixedOrTime(m_StartTimeConsumed)) / range); } - // if (t > 5) // max extrapolation + if (t > 3) // max extrapolation { t = 1; } diff --git a/com.unity.netcode.gameobjects/Prototyping/Interpolator/IInterpolator.cs b/com.unity.netcode.gameobjects/Prototyping/Interpolator/IInterpolator.cs index 3d9bca687c..6d55374080 100644 --- a/com.unity.netcode.gameobjects/Prototyping/Interpolator/IInterpolator.cs +++ b/com.unity.netcode.gameobjects/Prototyping/Interpolator/IInterpolator.cs @@ -1,5 +1,3 @@ -using UnityEngine; - namespace Unity.Netcode { public interface IInterpolator diff --git a/com.unity.netcode.gameobjects/Prototyping/Interpolator/SimpleInterpolator.cs b/com.unity.netcode.gameobjects/Prototyping/Interpolator/SimpleInterpolator.cs index 6b3091640e..397ac20dbb 100644 --- a/com.unity.netcode.gameobjects/Prototyping/Interpolator/SimpleInterpolator.cs +++ b/com.unity.netcode.gameobjects/Prototyping/Interpolator/SimpleInterpolator.cs @@ -1,4 +1,3 @@ -using System; using UnityEngine; namespace Unity.Netcode @@ -68,6 +67,7 @@ public void ResetTo(T targetValue) public bool UseFixedUpdate { get; set; } } + public class SimpleInterpolatorFloat : SimpleInterpolator { protected override float Interpolate(float a, float b, float time) diff --git a/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs b/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs index 2dd46e665c..11f0c445b6 100644 --- a/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs @@ -1,5 +1,4 @@ using System; -using System.Collections; using System.Collections.Generic; using UnityEngine; using Random = UnityEngine.Random; @@ -210,6 +209,8 @@ public void NetworkSerialize(NetworkSerializer serializer) public bool UseFixedUpdate = true; + private int k_debugDrawLineTime = 10; + public virtual IInterpolator PositionXInterpolator { get; set; } public virtual IInterpolator PositionYInterpolator { get; set; } public virtual IInterpolator PositionZInterpolator { get; set; } @@ -252,9 +253,6 @@ public IEnumerable> AllFloatInterpolators() yield return ScaleZInterpolator; } - private int k_debugDrawLineTime = 10; - - private Transform m_Transform; // cache the transform component to reduce unnecessary bounce between managed and native internal readonly NetworkVariable ReplNetworkState = new NetworkVariable(new NetworkState()); @@ -263,19 +261,15 @@ public IEnumerable> AllFloatInterpolators() public void ResetCurrentInterpolatedState() { - var tickRate = NetworkManager.Singleton.NetworkConfig.TickRate; - for (int i = 0; i < 1; i++) // repeat this twice to set both "start" and "end" values - { - ScaleXInterpolator.ResetTo(ReplNetworkState.Value.ScaleX); - ScaleYInterpolator.ResetTo(ReplNetworkState.Value.ScaleY); - ScaleZInterpolator.ResetTo(ReplNetworkState.Value.ScaleZ); + PositionXInterpolator.ResetTo(ReplNetworkState.Value.PositionX); + PositionYInterpolator.ResetTo(ReplNetworkState.Value.PositionY); + PositionZInterpolator.ResetTo(ReplNetworkState.Value.PositionZ); - PositionXInterpolator.ResetTo(ReplNetworkState.Value.PositionX); - PositionYInterpolator.ResetTo(ReplNetworkState.Value.PositionY); - PositionZInterpolator.ResetTo(ReplNetworkState.Value.PositionZ); + RotationInterpolator.ResetTo(Quaternion.Euler(ReplNetworkState.Value.Rotation)); - RotationInterpolator.ResetTo(Quaternion.Euler(ReplNetworkState.Value.Rotation)); - } + ScaleXInterpolator.ResetTo(ReplNetworkState.Value.ScaleX); + ScaleYInterpolator.ResetTo(ReplNetworkState.Value.ScaleY); + ScaleZInterpolator.ResetTo(ReplNetworkState.Value.ScaleZ); } // updates `NetworkState` properties if they need to and returns a `bool` indicating whether or not there was any changes made @@ -451,7 +445,6 @@ internal void ApplyNetworkStateFromAuthority(NetworkState networkState) interpolatedScale.z = ScaleZInterpolator.GetInterpolatedValue(); } - PrevNetworkState = networkState; // Position Apply if (networkState.HasPositionX || networkState.HasPositionY || networkState.HasPositionZ) { diff --git a/com.unity.netcode.gameobjects/Runtime/Timing/NetworkTime.cs b/com.unity.netcode.gameobjects/Runtime/Timing/NetworkTime.cs index e17a5ed176..4a90602916 100644 --- a/com.unity.netcode.gameobjects/Runtime/Timing/NetworkTime.cs +++ b/com.unity.netcode.gameobjects/Runtime/Timing/NetworkTime.cs @@ -106,8 +106,7 @@ public NetworkTime ToFixedTime() private void UpdateCache() { double d = m_TimeSec / m_TickInterval; - m_CachedTick = (int)d; // rounding up. if you're in tick 3.123, you're really in the tick 4 - // m_CachedTick = (int)Math.Ceiling(d); // rounding up. if you're in tick 3.123, you're really in the tick 4 + m_CachedTick = (int)d; m_CachedTickOffset = ((d - Math.Truncate(d)) * m_TickInterval); // This handles negative time, decreases tick by 1 and makes offset positive. diff --git a/com.unity.netcode.gameobjects/Runtime/Timing/NetworkTimeSystem.cs b/com.unity.netcode.gameobjects/Runtime/Timing/NetworkTimeSystem.cs index f283d26b19..25c77665a0 100644 --- a/com.unity.netcode.gameobjects/Runtime/Timing/NetworkTimeSystem.cs +++ b/com.unity.netcode.gameobjects/Runtime/Timing/NetworkTimeSystem.cs @@ -1,5 +1,4 @@ using System; -using UnityEngine; namespace Unity.Netcode { @@ -21,8 +20,6 @@ public class NetworkTimeSystem /// public double LocalBufferSec { get; set; } - private double m_ServerBufferSec; - /// /// Gets or sets the amount of the time in seconds the client should buffer incoming messages from the server. This increases server time. /// A higher value increases latency but makes the game look more smooth in bad networking conditions. diff --git a/com.unity.netcode.gameobjects/Tests/Editor/InterpolatorTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/InterpolatorTests.cs index 4c572213e6..64a665f9e9 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/InterpolatorTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/InterpolatorTests.cs @@ -23,22 +23,53 @@ public MockInterpolatorTime(double serverTime, int tickRate) } const int k_MockTickRate = 1; + NetworkTime T(float time, int tickRate = k_MockTickRate) { return new NetworkTime(tickRate, timeSec: time); } - /* - * TODO - * test normal interpolation - * test with some jitter - * test with high jitter - * test with too high jitter - * test with negative time should fail - * check https://github.com/vis2k/Mirror/blob/02cc3de7b8889f477118e20379b584eaf8bd43b6/Assets/Mirror/Tests/Editor/SnapshotInterpolationTests.cs - * for examples of tests - * Test every single public API - */ + [Test] + public void TestSimpleInterpolator() + { + var interpolator = new SimpleInterpolatorFloat(); + interpolator.UseFixedUpdate = false; + + Assert.That(interpolator.GetInterpolatedValue(), Is.EqualTo(0f)); + + interpolator.AddMeasurement(10, default); + var val = interpolator.Update(0.05f); + Assert.That(val, Is.EqualTo(5f)); + } + + [Test] + public void TestReset() + { + void DoTest(Action> specialAction = null) where TypeToTest : IInterpolator, new() + { + var interpolator = new TypeToTest(); + specialAction?.Invoke(interpolator); + interpolator.AddMeasurement(5, T(1.0f)); + var initVal = interpolator.Update(10); // big value + Assert.That(initVal, Is.EqualTo(5f)); + Assert.That(interpolator.GetInterpolatedValue(), Is.EqualTo(5f)); + + interpolator.ResetTo(100f); + Assert.That(interpolator.GetInterpolatedValue(), Is.EqualTo(100f)); + var val = interpolator.Update(1f); + Assert.That(val, Is.EqualTo(100f)); + } + + DoTest>(); + DoTest(); + DoTest(interpolator => + { + var timeMock = new MockInterpolatorTime(0, k_MockTickRate); + ((BufferedLinearInterpolatorFloat) interpolator).interpolatorTime = timeMock; + timeMock.BufferedServerTime = 100f; + } + ); + } [Test] public void NormalUsage() @@ -133,6 +164,8 @@ public void MessageLoss() // message time=3 was lost interpolator.AddMeasurement(4f, T(4f)); interpolator.AddMeasurement(5f, T(5f)); + // message time=6 was lost + interpolator.AddMeasurement(100f, T(7f)); // high value to produce a misprediction mockBufferedTime.BufferedServerTime = 2f; interpolator.Update(2f); @@ -146,10 +179,10 @@ public void MessageLoss() interpolator.Update(0.5f); Assert.That(interpolator.GetInterpolatedValue(), Is.EqualTo(2f)); - // pausing until buffer reaches next value in buffer, should have been 2.5f, pausing to last value 2f + // extrapolating to 2.5 mockBufferedTime.BufferedServerTime = 3.5f; interpolator.Update(0.5f); - Assert.That(interpolator.GetInterpolatedValue(), Is.EqualTo(2f)); + Assert.That(interpolator.GetInterpolatedValue(), Is.EqualTo(2.5f)); // next value skips to where it was supposed to be once buffer time is showing the next value mockBufferedTime.BufferedServerTime = 4f; @@ -164,6 +197,26 @@ public void MessageLoss() mockBufferedTime.BufferedServerTime = 5f; interpolator.Update(0.5f); Assert.That(interpolator.GetInterpolatedValue(), Is.EqualTo(4f)); + + // lost time=6, extrapolating + mockBufferedTime.BufferedServerTime = 5.5f; + interpolator.Update(0.5f); + Assert.That(interpolator.GetInterpolatedValue(), Is.EqualTo(4.5f)); + + mockBufferedTime.BufferedServerTime = 6.0f; + interpolator.Update(0.5f); + Assert.That(interpolator.GetInterpolatedValue(), Is.EqualTo(5f)); + + // misprediction + mockBufferedTime.BufferedServerTime = 6.5f; + interpolator.Update(0.5f); + Assert.That(interpolator.GetInterpolatedValue(), Is.EqualTo(5.5f)); + + // lerp to right value + mockBufferedTime.BufferedServerTime = 7.0f; + interpolator.Update(0.5f); + Assert.That(interpolator.GetInterpolatedValue(), Is.GreaterThan(6.0f)); + Assert.That(interpolator.GetInterpolatedValue(), Is.LessThanOrEqualTo(100f)); } [Test] @@ -314,11 +367,18 @@ public void TestDuplicatedValues() mockBufferedTime.BufferedServerTime = 3f; interp = interpolator.Update(0.5f); Assert.That(interp, Is.EqualTo(2f)); + + // with unclamped interpolation, we continue mispredicting since the two last values are actually treated as the same. Therefore we're not stopping at "2" mockBufferedTime.BufferedServerTime = 3.5f; interp = interpolator.Update(0.5f); - Assert.That(interp, Is.EqualTo(2f)); + Assert.That(interp, Is.EqualTo(2.5f)); mockBufferedTime.BufferedServerTime = 4f; interp = interpolator.Update(0.5f); + Assert.That(interp, Is.EqualTo(3f)); + + // we add a measurement with an updated time + interpolator.AddMeasurement(2f, T(3f)); + interp = interpolator.Update(0.5f); Assert.That(interp, Is.EqualTo(2f)); } } diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/NetworkTransformTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/NetworkTransformTests.cs index 4f0584b19b..13a4c8fb7e 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/NetworkTransformTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/NetworkTransformTests.cs @@ -1,6 +1,7 @@ using System.Collections; using Unity.Netcode.Prototyping; using NUnit.Framework; +using UnityEngine; using UnityEngine.TestTools; namespace Unity.Netcode.RuntimeTests @@ -42,7 +43,8 @@ public override IEnumerator Setup() } // TODO: rewrite after perms & authority changes - /* [UnityTest] + /* + [UnityTest] [TestCase(true, NetworkAuthority.Client, ExpectedResult = null)] [TestCase(true, NetworkAuthority.Server, ExpectedResult = null)] [TestCase(false, NetworkAuthority.Client, ExpectedResult = null)] @@ -53,15 +55,11 @@ public IEnumerator TestAuthoritativeTransformChangeOneAtATime(bool testLocalTran var networkTransform = (authorityToTest == NetworkAuthority.Client ? m_ClientSideClientPlayer : m_ServerSideClientPlayer).GetComponent(); networkTransform.SetAuthority(authorityToTest); - networkTransform.PositionInterpolator = new NoInterpolator(); - networkTransform.RotationInterpolator = new NoInterpolator(); - networkTransform.ScaleInterpolator = new NoInterpolator(); + networkTransform.InitializeInterpolator, NoInterpolator, NoInterpolator>(); var otherSideNetworkTransform = (authorityToTest == NetworkAuthority.Client ? m_ServerSideClientPlayer : m_ClientSideClientPlayer).GetComponent(); otherSideNetworkTransform.SetAuthority(authorityToTest); - otherSideNetworkTransform.PositionInterpolator = new NoInterpolator(); - otherSideNetworkTransform.RotationInterpolator = new NoInterpolator(); - otherSideNetworkTransform.ScaleInterpolator = new NoInterpolator(); + otherSideNetworkTransform.InitializeInterpolator, NoInterpolator, NoInterpolator>(); static bool HasAuthorityFunc(NetworkTransform transform) { @@ -131,15 +129,11 @@ public IEnumerator TestCantChangeTransformFromOtherSideAuthority(NetworkAuthorit // test server can't change client authoritative transform var networkTransform = (authorityToTest == NetworkAuthority.Client ? m_ClientSideClientPlayer : m_ServerSideClientPlayer).GetComponent(); networkTransform.SetAuthority(authorityToTest); - networkTransform.PositionInterpolator = new NoInterpolator(); - networkTransform.RotationInterpolator = new NoInterpolator(); - networkTransform.ScaleInterpolator = new NoInterpolator(); + networkTransform.InitializeInterpolator, NoInterpolator, NoInterpolator>(); var otherSideNetworkTransform = (authorityToTest == NetworkAuthority.Client ? m_ServerSideClientPlayer : m_ClientSideClientPlayer).GetComponent(); otherSideNetworkTransform.SetAuthority(authorityToTest); - otherSideNetworkTransform.PositionInterpolator = new NoInterpolator(); - otherSideNetworkTransform.RotationInterpolator = new NoInterpolator(); - otherSideNetworkTransform.ScaleInterpolator = new NoInterpolator(); + otherSideNetworkTransform.InitializeInterpolator, NoInterpolator, NoInterpolator>(); Assert.AreEqual(Vector3.zero, otherSideNetworkTransform.transform.position, "other side pos should be zero at first"); // sanity check otherSideNetworkTransform.transform.position = new Vector3(4, 5, 6); @@ -147,7 +141,8 @@ public IEnumerator TestCantChangeTransformFromOtherSideAuthority(NetworkAuthorit yield return new WaitForFixedUpdate(); Assert.AreEqual(Vector3.zero, otherSideNetworkTransform.transform.position, "got authority error, but other side still moved!"); - } */ + } + //*/ [UnityTearDown] public override IEnumerator Teardown() diff --git a/testproject/Assets/Scenes/ZooSam.unity b/testproject/Assets/Scenes/ZooSam.unity index 7d7f227c45..4cec43f1f1 100644 --- a/testproject/Assets/Scenes/ZooSam.unity +++ b/testproject/Assets/Scenes/ZooSam.unity @@ -1178,6 +1178,165 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 106591948} m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &108150024 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 108150031} + - component: {fileID: 108150030} + - component: {fileID: 108150029} + - component: {fileID: 108150028} + - component: {fileID: 108150027} + - component: {fileID: 108150026} + - component: {fileID: 108150025} + m_Layer: 0 + m_Name: NetworkTransformBuffered (2) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &108150025 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 108150024} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3} + m_Name: + m_EditorClassIdentifier: + SyncPositionX: 1 + SyncPositionY: 1 + SyncPositionZ: 1 + SyncRotAngleX: 1 + SyncRotAngleY: 1 + SyncRotAngleZ: 1 + SyncScaleX: 1 + SyncScaleY: 1 + SyncScaleZ: 1 + PositionThreshold: 0 + RotAngleThreshold: 0 + ScaleThreshold: 0 + InLocalSpace: 1 + Interpolate: 0 + FixedSendsPerSecond: 50 + UseFixedUpdate: 1 +--- !u!114 &108150026 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 108150024} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 307c40a41954948e7a36bb6b64b4b9cb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_MoveSpeed: 5 + m_RotationSpeed: 30 + m_RunServerOnly: 1 + m_RunInUpdate: 1 +--- !u!114 &108150027 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 108150024} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} + m_Name: + m_EditorClassIdentifier: + GlobalObjectIdHash: 3052257193 + AlwaysReplicateAsRoot: 0 + DontDestroyWithOwner: 0 + AutoObjectParentSync: 1 +--- !u!65 &108150028 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 108150024} + 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 &108150029 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 108150024} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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: 16358fcb4e0c94cc8b980fbb17259843, 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 &108150030 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 108150024} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &108150031 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 108150024} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -8.25, y: 1.55, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 153211162} + m_Father: {fileID: 0} + m_RootOrder: 10 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &110121429 GameObject: m_ObjectHideFlags: 0 @@ -1658,6 +1817,101 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 150536644} m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &153211161 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 153211162} + - component: {fileID: 153211165} + - component: {fileID: 153211164} + - component: {fileID: 153211163} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &153211162 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 153211161} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.455, y: 0.296, z: 0.312} + m_LocalScale: {x: 0.55787, y: 0.55787, z: 0.55787} + m_Children: [] + m_Father: {fileID: 108150031} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &153211163 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 153211161} + 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 &153211164 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 153211161} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + 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 &153211165 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 153211161} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} --- !u!1 &169380227 GameObject: m_ObjectHideFlags: 0 @@ -6559,7 +6813,7 @@ MonoBehaviour: m_EditorClassIdentifier: DontDestroy: 1 RunInBackground: 1 - LogLevel: 0 + LogLevel: 1 NetworkConfig: ProtocolVersion: 0 NetworkTransport: {fileID: 620561613} @@ -7824,7 +8078,7 @@ MonoBehaviour: m_MoveSpeed: 5 m_RotationSpeed: 30 m_RunServerOnly: 1 - m_RunInUpdate: 0 + m_RunInUpdate: 1 --- !u!114 &678326394 MonoBehaviour: m_ObjectHideFlags: 0 From 6c9b905d2a6ed29a0319681053103cf5c2e271e5 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Thu, 2 Sep 2021 22:44:45 -0400 Subject: [PATCH 043/113] # --- .../BufferedLinearInterpolator.cs | 35 +++----- .../Prototyping/NetworkTransform.cs | 88 +++++++++---------- .../Tests/Editor/InterpolatorTests.cs | 4 +- .../Tests/Editor/InterpolatorTests.cs.meta | 11 +++ 4 files changed, 64 insertions(+), 74 deletions(-) create mode 100644 com.unity.netcode.gameobjects/Tests/Editor/InterpolatorTests.cs.meta diff --git a/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs b/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs index 4a3c22ff27..bc68ebf14b 100644 --- a/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs +++ b/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs @@ -11,14 +11,11 @@ namespace Unity.Netcode /// public abstract class BufferedLinearInterpolator : IInterpolator where T : struct { - // public const float InterpolationConfigTimeSec = 0.100f; // todo expose global config, todo use in actual code - // interface for mock testing, abstracting away external systems public interface IInterpolatorTime { public double BufferedServerTime { get; } public double BufferedServerFixedTime { get; } - public double LocalTime { get; } public int TickRate { get; } } @@ -26,7 +23,6 @@ private class InterpolatorTime : IInterpolatorTime { public double BufferedServerTime => NetworkManager.Singleton.ServerTime.Time; public double BufferedServerFixedTime => NetworkManager.Singleton.ServerTime.FixedTime; - public double LocalTime => NetworkManager.Singleton.LocalTime.Time; public int TickRate => NetworkManager.Singleton.ServerTime.TickRate; } @@ -58,10 +54,6 @@ private struct BufferedItem private int m_LifetimeConsumedCount; - public BufferedLinearInterpolator() - { - } - public void Start() { } @@ -88,15 +80,13 @@ public void ResetTo(T targetValue) m_EndTimeConsumed = new NetworkTime(interpolatorTime.TickRate, 0); m_StartTimeConsumed = new NetworkTime(interpolatorTime.TickRate, 0); - simpleInterpolator.ResetTo(targetValue); // for statically placed objects, so we don't interpolate from 0 to current position + SimpleInterpolator.ResetTo(targetValue); // for statically placed objects, so we don't interpolate from 0 to current position Update(0); } - double FixedOrTime(NetworkTime t) + private double FixedOrTime(NetworkTime t) { - if (UseFixedUpdate) return t.FixedTime; - - return t.Time; + return UseFixedUpdate ? t.FixedTime : t.Time; } // todo if I have value 1, 2, 3 and I'm treating 1 to 3, I shouldn't interpolate between 1 and 3, I should interpolate from 1 to 2, then from 2 to 3 to get the best path @@ -166,10 +156,13 @@ public T Update(float deltaTime) t = 1; } - Debug.Assert(t >= 0, $"t must be bigger or equal than 0. range {range}, RenderTime {RenderTime}, Start time {FixedOrTime(m_StartTimeConsumed)}, end time {FixedOrTime(m_EndTimeConsumed)}"); // todo remove GC alloc this creates + if (Debug.isDebugBuild) + { + Debug.Assert(t >= 0, $"t must be bigger or equal than 0. range {range}, RenderTime {RenderTime}, Start time {FixedOrTime(m_StartTimeConsumed)}, end time {FixedOrTime(m_EndTimeConsumed)}"); + } - simpleInterpolator.AddMeasurement(Interpolate(m_InterpStartValue, m_InterpEndValue, t), default); // using simple interpolation so there's no jump - m_CurrentInterpValue = simpleInterpolator.Update(deltaTime); + SimpleInterpolator.AddMeasurement(Interpolate(m_InterpStartValue, m_InterpEndValue, t), default); // using simple interpolation so there's no jump + m_CurrentInterpValue = SimpleInterpolator.Update(deltaTime); } return m_CurrentInterpValue; @@ -205,7 +198,7 @@ public void OnDestroy() protected abstract T Interpolate(T start, T end, float time); - protected abstract SimpleInterpolator simpleInterpolator { get; } + protected abstract SimpleInterpolator SimpleInterpolator { get; } } public class BufferedLinearInterpolatorFloat : BufferedLinearInterpolator @@ -215,7 +208,7 @@ protected override float Interpolate(float start, float end, float time) return Mathf.LerpUnclamped(start, end, time); } - protected override SimpleInterpolator simpleInterpolator { get; } = new SimpleInterpolatorFloat(); + protected override SimpleInterpolator SimpleInterpolator { get; } = new SimpleInterpolatorFloat(); } public class BufferedLinearInterpolatorFloatForScale : BufferedLinearInterpolatorFloat @@ -234,10 +227,6 @@ protected override Quaternion Interpolate(Quaternion start, Quaternion end, floa return Quaternion.SlerpUnclamped(start, end, time); } - public BufferedLinearInterpolatorQuaternion() - { - } - - protected override SimpleInterpolator simpleInterpolator { get; } = new SimpleInterpolatorQuaternion(); + protected override SimpleInterpolator SimpleInterpolator { get; } = new SimpleInterpolatorQuaternion(); } } \ No newline at end of file diff --git a/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs b/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs index 11f0c445b6..9f30aa4a93 100644 --- a/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs @@ -209,27 +209,28 @@ public void NetworkSerialize(NetworkSerializer serializer) public bool UseFixedUpdate = true; - private int k_debugDrawLineTime = 10; + private const int k_DebugDrawLineTime = 10; - public virtual IInterpolator PositionXInterpolator { get; set; } - public virtual IInterpolator PositionYInterpolator { get; set; } - public virtual IInterpolator PositionZInterpolator { get; set; } - public virtual IInterpolator RotationInterpolator { get; set; } // rotation is a single Quaternion since each euler axis will affect the quaternion's final value - public virtual IInterpolator ScaleXInterpolator { get; set; } - public virtual IInterpolator ScaleYInterpolator { get; set; } - public virtual IInterpolator ScaleZInterpolator { get; set; } + protected virtual IInterpolator PositionXInterpolator { get; set; } + protected virtual IInterpolator PositionYInterpolator { get; set; } + protected virtual IInterpolator PositionZInterpolator { get; set; } + protected virtual IInterpolator RotationInterpolator { get; set; } // rotation is a single Quaternion since each euler axis will affect the quaternion's final value + protected virtual IInterpolator ScaleXInterpolator { get; set; } + protected virtual IInterpolator ScaleYInterpolator { get; set; } + protected virtual IInterpolator ScaleZInterpolator { get; set; } - public void InitializeInterpolator() where Pos : IInterpolator, new() where Rot : IInterpolator, new() where Scale : IInterpolator, new() + public void InitializeInterpolator() where TPos : IInterpolator, new() where TRot : IInterpolator, new() where TScale : IInterpolator, new() { + AllFloatInterpolators.Clear(); if (Interpolate) { - PositionXInterpolator = new Pos(); - PositionYInterpolator = new Pos(); - PositionZInterpolator = new Pos(); - RotationInterpolator = new Rot(); - ScaleXInterpolator = new Scale(); - ScaleYInterpolator = new Scale(); - ScaleZInterpolator = new Scale(); + PositionXInterpolator = new TPos(); + PositionYInterpolator = new TPos(); + PositionZInterpolator = new TPos(); + RotationInterpolator = new TRot(); + ScaleXInterpolator = new TScale(); + ScaleYInterpolator = new TScale(); + ScaleZInterpolator = new TScale(); } else { @@ -241,18 +242,18 @@ public void NetworkSerialize(NetworkSerializer serializer) ScaleYInterpolator = new NoInterpolator(); ScaleZInterpolator = new NoInterpolator(); } - } - public IEnumerable> AllFloatInterpolators() - { - yield return PositionXInterpolator; - yield return PositionYInterpolator; - yield return PositionZInterpolator; - yield return ScaleXInterpolator; - yield return ScaleYInterpolator; - yield return ScaleZInterpolator; + AllFloatInterpolators.Add(PositionXInterpolator); + AllFloatInterpolators.Add(PositionYInterpolator); + AllFloatInterpolators.Add(PositionZInterpolator); + AllFloatInterpolators.Add(ScaleXInterpolator); + AllFloatInterpolators.Add(ScaleYInterpolator); + AllFloatInterpolators.Add(ScaleZInterpolator); } + // public IInterpolator[] all = new[]; + private readonly List> AllFloatInterpolators = new List>(6); + private Transform m_Transform; // cache the transform component to reduce unnecessary bounce between managed and native internal readonly NetworkVariable ReplNetworkState = new NetworkVariable(new NetworkState()); @@ -293,7 +294,7 @@ internal bool UpdateNetworkStateCheckDirty(ref NetworkState networkState, double if (InLocalSpace != networkState.InLocalSpace) { networkState.InLocalSpace = InLocalSpace; - isDirty |= true; + isDirty = true; } if (SyncPositionX && @@ -511,17 +512,17 @@ private void OnNetworkStateChanged(NetworkState oldState, NetworkState newState) if (newState.HasPositionX) { - PositionXInterpolator.AddMeasurement(newState.Position.x, sentTime); + PositionXInterpolator.AddMeasurement(newState.PositionX, sentTime); } if (newState.HasPositionY) { - PositionYInterpolator.AddMeasurement(newState.Position.y, sentTime); + PositionYInterpolator.AddMeasurement(newState.PositionY, sentTime); } if (newState.HasPositionZ) { - PositionZInterpolator.AddMeasurement(newState.Position.z, sentTime); + PositionZInterpolator.AddMeasurement(newState.PositionZ, sentTime); } RotationInterpolator.AddMeasurement(Quaternion.Euler(newState.Rotation), sentTime); @@ -544,29 +545,20 @@ private void OnNetworkStateChanged(NetworkState oldState, NetworkState newState) if (NetworkManager.Singleton.LogLevel == LogLevel.Developer) { var pos = new Vector3(newState.PositionX, newState.PositionY, newState.PositionZ); - Debug.DrawLine(pos, pos + Vector3.up + Vector3.left * Random.Range(0.5f, 2f), Color.green, k_debugDrawLineTime, false); + Debug.DrawLine(pos, pos + Vector3.up + Vector3.left * Random.Range(0.5f, 2f), Color.green, k_DebugDrawLineTime, false); } } private void Awake() { m_Transform = transform; - bool interpolatorAlreadySet = false; - foreach (var interpolator in AllFloatInterpolators()) - { - if (interpolator != null || RotationInterpolator != null) - { - interpolatorAlreadySet = true; - break; - } - } - if (!interpolatorAlreadySet) + if (AllFloatInterpolators.Count == 0) { InitializeInterpolator(); } - foreach (var interpolator in AllFloatInterpolators()) + foreach (var interpolator in AllFloatInterpolators) { interpolator.Awake(); interpolator.UseFixedUpdate = UseFixedUpdate; @@ -596,7 +588,7 @@ private void Awake() public void Start() { - foreach (var interpolator in AllFloatInterpolators()) + foreach (var interpolator in AllFloatInterpolators) { interpolator.Start(); } @@ -606,7 +598,7 @@ public void Start() public void OnEnable() { - foreach (var interpolator in AllFloatInterpolators()) + foreach (var interpolator in AllFloatInterpolators) { interpolator.OnEnable(); } @@ -620,7 +612,7 @@ public override void OnNetworkSpawn() { ResetCurrentInterpolatedState(); // useful for late joining - foreach (var interpolator in AllFloatInterpolators()) // todo remove GC alloc this creates + foreach (var interpolator in AllFloatInterpolators) // todo remove GC alloc this creates { interpolator.OnNetworkSpawn(); } @@ -635,7 +627,7 @@ private void OnDestroy() { ReplNetworkState.OnValueChanged -= OnNetworkStateChanged; - foreach (var interpolator in AllFloatInterpolators()) + foreach (var interpolator in AllFloatInterpolators) { interpolator.OnDestroy(); } @@ -680,7 +672,7 @@ private void FixedUpdate() ApplyNetworkStateFromAuthority(ReplNetworkState.Value); } - foreach (var interpolator in AllFloatInterpolators()) + foreach (var interpolator in AllFloatInterpolators) { interpolator.FixedUpdate(NetworkManager.ServerTime.FixedDeltaTime); } @@ -704,7 +696,7 @@ private void Update() // apply interpolated value if (!IsServer && (NetworkManager.Singleton.IsConnectedClient || NetworkManager.Singleton.IsListening)) { - foreach (var interpolator in AllFloatInterpolators()) + foreach (var interpolator in AllFloatInterpolators) { interpolator.Update(Time.deltaTime); } @@ -714,7 +706,7 @@ private void Update() if (NetworkManager.Singleton.LogLevel == LogLevel.Developer) { var interpolatedPosition = new Vector3(PositionXInterpolator.GetInterpolatedValue(), PositionYInterpolator.GetInterpolatedValue(), PositionZInterpolator.GetInterpolatedValue()); - Debug.DrawLine(interpolatedPosition, interpolatedPosition + Vector3.up, Color.magenta, k_debugDrawLineTime, false); + Debug.DrawLine(interpolatedPosition, interpolatedPosition + Vector3.up, Color.magenta, k_DebugDrawLineTime, false); } ApplyNetworkStateFromAuthority(ReplNetworkState.Value); diff --git a/com.unity.netcode.gameobjects/Tests/Editor/InterpolatorTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/InterpolatorTests.cs index 64a665f9e9..c7d40b05b9 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/InterpolatorTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/InterpolatorTests.cs @@ -3,7 +3,7 @@ namespace Unity.Netcode.EditorTests { - public class BufferedInterpolatorTests + public class InterpolatorTests { private const float k_Precision = 0.00000001f; @@ -11,14 +11,12 @@ private class MockInterpolatorTime : BufferedLinearInterpolator.IInterpol { public double BufferedServerTime { get; set; } public double BufferedServerFixedTime { get; } - public double LocalTime { get; } public int TickRate { get; set; } public MockInterpolatorTime(double serverTime, int tickRate) { BufferedServerTime = serverTime; TickRate = tickRate; - LocalTime = serverTime; // todo } } diff --git a/com.unity.netcode.gameobjects/Tests/Editor/InterpolatorTests.cs.meta b/com.unity.netcode.gameobjects/Tests/Editor/InterpolatorTests.cs.meta new file mode 100644 index 0000000000..973fe501b9 --- /dev/null +++ b/com.unity.netcode.gameobjects/Tests/Editor/InterpolatorTests.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a5cfbc170161c4e95ac6124ee43068b6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From ae567487500c4eb6e63f75305ea8eeffcd5059cf Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Thu, 2 Sep 2021 22:50:09 -0400 Subject: [PATCH 044/113] # --- .../Prototyping/NetworkTransform.cs | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs b/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs index 9f30aa4a93..5ed5b6081c 100644 --- a/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs @@ -221,7 +221,7 @@ public void NetworkSerialize(NetworkSerializer serializer) public void InitializeInterpolator() where TPos : IInterpolator, new() where TRot : IInterpolator, new() where TScale : IInterpolator, new() { - AllFloatInterpolators.Clear(); + m_AllFloatInterpolators.Clear(); if (Interpolate) { PositionXInterpolator = new TPos(); @@ -243,16 +243,15 @@ public void NetworkSerialize(NetworkSerializer serializer) ScaleZInterpolator = new NoInterpolator(); } - AllFloatInterpolators.Add(PositionXInterpolator); - AllFloatInterpolators.Add(PositionYInterpolator); - AllFloatInterpolators.Add(PositionZInterpolator); - AllFloatInterpolators.Add(ScaleXInterpolator); - AllFloatInterpolators.Add(ScaleYInterpolator); - AllFloatInterpolators.Add(ScaleZInterpolator); + m_AllFloatInterpolators.Add(PositionXInterpolator); + m_AllFloatInterpolators.Add(PositionYInterpolator); + m_AllFloatInterpolators.Add(PositionZInterpolator); + m_AllFloatInterpolators.Add(ScaleXInterpolator); + m_AllFloatInterpolators.Add(ScaleYInterpolator); + m_AllFloatInterpolators.Add(ScaleZInterpolator); } - // public IInterpolator[] all = new[]; - private readonly List> AllFloatInterpolators = new List>(6); + private readonly List> m_AllFloatInterpolators = new List>(6); private Transform m_Transform; // cache the transform component to reduce unnecessary bounce between managed and native @@ -553,12 +552,12 @@ private void Awake() { m_Transform = transform; - if (AllFloatInterpolators.Count == 0) + if (m_AllFloatInterpolators.Count == 0) { InitializeInterpolator(); } - foreach (var interpolator in AllFloatInterpolators) + foreach (var interpolator in m_AllFloatInterpolators) { interpolator.Awake(); interpolator.UseFixedUpdate = UseFixedUpdate; @@ -588,7 +587,7 @@ private void Awake() public void Start() { - foreach (var interpolator in AllFloatInterpolators) + foreach (var interpolator in m_AllFloatInterpolators) { interpolator.Start(); } @@ -598,7 +597,7 @@ public void Start() public void OnEnable() { - foreach (var interpolator in AllFloatInterpolators) + foreach (var interpolator in m_AllFloatInterpolators) { interpolator.OnEnable(); } @@ -612,10 +611,11 @@ public override void OnNetworkSpawn() { ResetCurrentInterpolatedState(); // useful for late joining - foreach (var interpolator in AllFloatInterpolators) // todo remove GC alloc this creates + foreach (var interpolator in m_AllFloatInterpolators) { interpolator.OnNetworkSpawn(); } + // todo cache network manager to remove some of the time it takes to get it RotationInterpolator.OnNetworkSpawn(); @@ -627,7 +627,7 @@ private void OnDestroy() { ReplNetworkState.OnValueChanged -= OnNetworkStateChanged; - foreach (var interpolator in AllFloatInterpolators) + foreach (var interpolator in m_AllFloatInterpolators) { interpolator.OnDestroy(); } @@ -672,7 +672,7 @@ private void FixedUpdate() ApplyNetworkStateFromAuthority(ReplNetworkState.Value); } - foreach (var interpolator in AllFloatInterpolators) + foreach (var interpolator in m_AllFloatInterpolators) { interpolator.FixedUpdate(NetworkManager.ServerTime.FixedDeltaTime); } @@ -696,7 +696,7 @@ private void Update() // apply interpolated value if (!IsServer && (NetworkManager.Singleton.IsConnectedClient || NetworkManager.Singleton.IsListening)) { - foreach (var interpolator in AllFloatInterpolators) + foreach (var interpolator in m_AllFloatInterpolators) { interpolator.Update(Time.deltaTime); } From 83998c714acd82a4ed73b576bc2ed1ef88e218bb Mon Sep 17 00:00:00 2001 From: Sam Bellomo <71790295+SamuelBellomo@users.noreply.github.com> Date: Tue, 7 Sep 2021 10:13:28 -0400 Subject: [PATCH 045/113] Update com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs Co-authored-by: M. Fatih MAR --- .../Prototyping/Interpolator/BufferedLinearInterpolator.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs b/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs index bc68ebf14b..5f7e75d14d 100644 --- a/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs +++ b/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs @@ -14,9 +14,9 @@ public abstract class BufferedLinearInterpolator : IInterpolator where T : // interface for mock testing, abstracting away external systems public interface IInterpolatorTime { - public double BufferedServerTime { get; } - public double BufferedServerFixedTime { get; } - public int TickRate { get; } + double BufferedServerTime { get; } + double BufferedServerFixedTime { get; } + int TickRate { get; } } private class InterpolatorTime : IInterpolatorTime From 68ae5be6e9b0fa39a39b9e349b82d3c600815440 Mon Sep 17 00:00:00 2001 From: Sam Bellomo <71790295+SamuelBellomo@users.noreply.github.com> Date: Tue, 7 Sep 2021 10:14:10 -0400 Subject: [PATCH 046/113] Update com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs --- .../Prototyping/Interpolator/BufferedLinearInterpolator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs b/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs index 5f7e75d14d..1eb627a070 100644 --- a/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs +++ b/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs @@ -6,7 +6,7 @@ namespace Unity.Netcode { /// /// Solves for incoming values that are jittered - /// Partially solves for message loss. Unclamped lerping will help hide it, but not completely + /// Partially solves for message loss. Unclamped lerping helps hide this, but not completely /// /// public abstract class BufferedLinearInterpolator : IInterpolator where T : struct From 9432c94dda86d07e367de8b2701c000432c7ba12 Mon Sep 17 00:00:00 2001 From: Sam Bellomo <71790295+SamuelBellomo@users.noreply.github.com> Date: Tue, 7 Sep 2021 10:16:07 -0400 Subject: [PATCH 047/113] Update com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs Co-authored-by: M. Fatih MAR --- .../Prototyping/Interpolator/BufferedLinearInterpolator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs b/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs index 1eb627a070..b8a570741e 100644 --- a/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs +++ b/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs @@ -158,7 +158,7 @@ public T Update(float deltaTime) if (Debug.isDebugBuild) { - Debug.Assert(t >= 0, $"t must be bigger or equal than 0. range {range}, RenderTime {RenderTime}, Start time {FixedOrTime(m_StartTimeConsumed)}, end time {FixedOrTime(m_EndTimeConsumed)}"); + Debug.Assert(t >= 0, $"t must be bigger than or equal to 0. range {range}, RenderTime {RenderTime}, Start time {FixedOrTime(m_StartTimeConsumed)}, end time {FixedOrTime(m_EndTimeConsumed)}"); } SimpleInterpolator.AddMeasurement(Interpolate(m_InterpStartValue, m_InterpEndValue, t), default); // using simple interpolation so there's no jump From 1ebd1e5b001ba1d6ce55a2a3709b022331cb6e17 Mon Sep 17 00:00:00 2001 From: Sam Bellomo <71790295+SamuelBellomo@users.noreply.github.com> Date: Tue, 7 Sep 2021 10:20:42 -0400 Subject: [PATCH 048/113] Update com.unity.netcode.gameobjects/Prototyping/Interpolator/IInterpolator.cs Co-authored-by: M. Fatih MAR --- .../Prototyping/Interpolator/IInterpolator.cs | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/com.unity.netcode.gameobjects/Prototyping/Interpolator/IInterpolator.cs b/com.unity.netcode.gameobjects/Prototyping/Interpolator/IInterpolator.cs index 6d55374080..eb2700d632 100644 --- a/com.unity.netcode.gameobjects/Prototyping/Interpolator/IInterpolator.cs +++ b/com.unity.netcode.gameobjects/Prototyping/Interpolator/IInterpolator.cs @@ -2,16 +2,16 @@ namespace Unity.Netcode { public interface IInterpolator { - public void Awake(); - public void OnNetworkSpawn(); - public void Start(); - public void OnEnable(); - public T Update(float deltaTime); - public void FixedUpdate(float tickDeltaTime); - public void AddMeasurement(T newMeasurement, NetworkTime sentTime); - public T GetInterpolatedValue(); - public void OnDestroy(); - public void ResetTo(T targetValue); - public bool UseFixedUpdate { get; set; } + void Awake(); + void OnNetworkSpawn(); + void Start(); + void OnEnable(); + T Update(float deltaTime); + void FixedUpdate(float tickDeltaTime); + void AddMeasurement(T newMeasurement, NetworkTime sentTime); + T GetInterpolatedValue(); + void OnDestroy(); + void ResetTo(T targetValue); + bool UseFixedUpdate { get; set; } } } From 5b1761b0d8c659ff53d9bd01ddbdcdf581cab389 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Tue, 7 Sep 2021 12:39:41 -0400 Subject: [PATCH 049/113] code review feedback --- .../BufferedLinearInterpolator.cs | 12 +++++----- .../Tests/Editor/InterpolatorTests.cs | 24 +++++++++---------- testproject/Assets/Scripts/MoveInCircle.cs | 16 +++++++++---- 3 files changed, 29 insertions(+), 23 deletions(-) diff --git a/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs b/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs index bc68ebf14b..87908256fa 100644 --- a/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs +++ b/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs @@ -6,7 +6,7 @@ namespace Unity.Netcode { /// /// Solves for incoming values that are jittered - /// Partially solves for message loss. Unclamped lerping will help hide it, but not completely + /// Partially solves for message loss. Unclamped lerping helps hide this, but not completely /// /// public abstract class BufferedLinearInterpolator : IInterpolator where T : struct @@ -26,7 +26,7 @@ private class InterpolatorTime : IInterpolatorTime public int TickRate => NetworkManager.Singleton.ServerTime.TickRate; } - internal IInterpolatorTime interpolatorTime = new InterpolatorTime(); + internal IInterpolatorTime InterpolatorTimeProxy = new InterpolatorTime(); private struct BufferedItem { @@ -39,8 +39,8 @@ private struct BufferedItem /// /// Override this if you want configurable buffering, right now using ServerTick's own global buffering /// - protected virtual double ServerTimeBeingHandledForBuffering => UseFixedUpdate ? interpolatorTime.BufferedServerFixedTime : interpolatorTime.BufferedServerTime; - protected virtual double RenderTime => interpolatorTime.BufferedServerTime - 1f / interpolatorTime.TickRate; + protected virtual double ServerTimeBeingHandledForBuffering => UseFixedUpdate ? InterpolatorTimeProxy.BufferedServerFixedTime : InterpolatorTimeProxy.BufferedServerTime; + protected virtual double RenderTime => InterpolatorTimeProxy.BufferedServerTime - 1f / InterpolatorTimeProxy.TickRate; private T m_InterpStartValue; private T m_CurrentInterpValue; @@ -77,8 +77,8 @@ public void ResetTo(T targetValue) m_InterpEndValue = targetValue; m_CurrentInterpValue = targetValue; m_Buffer.Clear(); - m_EndTimeConsumed = new NetworkTime(interpolatorTime.TickRate, 0); - m_StartTimeConsumed = new NetworkTime(interpolatorTime.TickRate, 0); + m_EndTimeConsumed = new NetworkTime(InterpolatorTimeProxy.TickRate, 0); + m_StartTimeConsumed = new NetworkTime(InterpolatorTimeProxy.TickRate, 0); SimpleInterpolator.ResetTo(targetValue); // for statically placed objects, so we don't interpolate from 0 to current position Update(0); diff --git a/com.unity.netcode.gameobjects/Tests/Editor/InterpolatorTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/InterpolatorTests.cs index c7d40b05b9..bed79b1dc5 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/InterpolatorTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/InterpolatorTests.cs @@ -20,9 +20,9 @@ public MockInterpolatorTime(double serverTime, int tickRate) } } - const int k_MockTickRate = 1; + private const int k_MockTickRate = 1; - NetworkTime T(float time, int tickRate = k_MockTickRate) + private NetworkTime T(float time, int tickRate = k_MockTickRate) { return new NetworkTime(tickRate, timeSec: time); } @@ -63,7 +63,7 @@ public void TestReset() DoTest(interpolator => { var timeMock = new MockInterpolatorTime(0, k_MockTickRate); - ((BufferedLinearInterpolatorFloat) interpolator).interpolatorTime = timeMock; + ((BufferedLinearInterpolatorFloat) interpolator).InterpolatorTimeProxy = timeMock; timeMock.BufferedServerTime = 100f; } ); @@ -77,7 +77,7 @@ public void NormalUsage() var interpolator = new BufferedLinearInterpolatorFloat(); interpolator.UseFixedUpdate = false; var mockBufferedTime = new MockInterpolatorTime(0, k_MockTickRate); - interpolator.interpolatorTime = mockBufferedTime; + interpolator.InterpolatorTimeProxy = mockBufferedTime; Assert.That(interpolator.GetInterpolatedValue(), Is.EqualTo(0f)); @@ -124,7 +124,7 @@ public void OutOfOrderShouldStillWork() var interpolator = new BufferedLinearInterpolatorFloat(); interpolator.UseFixedUpdate = false; var mockBufferedTime = new MockInterpolatorTime(0, k_MockTickRate); - interpolator.interpolatorTime = mockBufferedTime; + interpolator.InterpolatorTimeProxy = mockBufferedTime; interpolator.AddMeasurement(0, T(0f)); interpolator.AddMeasurement(2, T(2f)); @@ -155,7 +155,7 @@ public void MessageLoss() var interpolator = new BufferedLinearInterpolatorFloat(); interpolator.UseFixedUpdate = false; var mockBufferedTime = new MockInterpolatorTime(0, k_MockTickRate); - interpolator.interpolatorTime = mockBufferedTime; + interpolator.InterpolatorTimeProxy = mockBufferedTime; interpolator.AddMeasurement(1f, T(1f)); interpolator.AddMeasurement(2f, T(2f)); @@ -223,7 +223,7 @@ public void AddFirstMeasurement() var interpolator = new BufferedLinearInterpolatorFloat(); interpolator.UseFixedUpdate = false; var mockBufferedTime = new MockInterpolatorTime(0, k_MockTickRate); - interpolator.interpolatorTime = mockBufferedTime; + interpolator.InterpolatorTimeProxy = mockBufferedTime; interpolator.AddMeasurement(2f, T(1f)); interpolator.AddMeasurement(3f, T(2f)); @@ -252,7 +252,7 @@ public void JumpToEachValueIfDeltaTimeTooBig() var interpolator = new BufferedLinearInterpolatorFloat(); interpolator.UseFixedUpdate = false; var mockBufferedTime = new MockInterpolatorTime(0, k_MockTickRate); - interpolator.interpolatorTime = mockBufferedTime; + interpolator.InterpolatorTimeProxy = mockBufferedTime; interpolator.AddMeasurement(2f, T(1f)); interpolator.AddMeasurement(3f, T(2f)); @@ -272,7 +272,7 @@ public void JumpToLastValueFromStart() var interpolator = new BufferedLinearInterpolatorFloat(); interpolator.UseFixedUpdate = false; var mockBufferedTime = new MockInterpolatorTime(0, k_MockTickRate); - interpolator.interpolatorTime = mockBufferedTime; + interpolator.InterpolatorTimeProxy = mockBufferedTime; interpolator.AddMeasurement(1f, T(1f)); interpolator.AddMeasurement(2f, T(2f)); @@ -304,7 +304,7 @@ public void TestBufferSizeLimit() var interpolator = new BufferedLinearInterpolatorFloat(); interpolator.UseFixedUpdate = false; var mockBufferedTime = new MockInterpolatorTime(0, k_MockTickRate); - interpolator.interpolatorTime = mockBufferedTime; + interpolator.InterpolatorTimeProxy = mockBufferedTime; // set first value interpolator.AddMeasurement(-1f, T(1f)); @@ -338,7 +338,7 @@ public void TestUpdatingInterpolatorWithNoData() var interpolator = new BufferedLinearInterpolatorFloat(); interpolator.UseFixedUpdate = false; var mockBufferedTime = new MockInterpolatorTime(0, k_MockTickRate); - interpolator.interpolatorTime = mockBufferedTime; + interpolator.InterpolatorTimeProxy = mockBufferedTime; // invalid case, this is undefined behaviour Assert.Throws(() => interpolator.Update(1f)); @@ -350,7 +350,7 @@ public void TestDuplicatedValues() var interpolator = new BufferedLinearInterpolatorFloat(); interpolator.UseFixedUpdate = false; var mockBufferedTime = new MockInterpolatorTime(0, k_MockTickRate); - interpolator.interpolatorTime = mockBufferedTime; + interpolator.InterpolatorTimeProxy = mockBufferedTime; interpolator.AddMeasurement(1f, T(1f)); interpolator.AddMeasurement(2f, T(2f)); diff --git a/testproject/Assets/Scripts/MoveInCircle.cs b/testproject/Assets/Scripts/MoveInCircle.cs index 51218b31af..f440e6f55a 100644 --- a/testproject/Assets/Scripts/MoveInCircle.cs +++ b/testproject/Assets/Scripts/MoveInCircle.cs @@ -1,4 +1,3 @@ -using System; using UnityEngine; using Unity.Netcode; @@ -12,6 +11,7 @@ public class MoveInCircle : NetworkBehaviour [SerializeField] private bool m_RunServerOnly; + [SerializeField] private bool m_RunInUpdate; @@ -24,19 +24,25 @@ public override void OnNetworkSpawn() //NetworkManager.Singleton.NetworkTimeSystem.ServerBufferSec = 0.15f; } - void FixedUpdate() + private void FixedUpdate() { - if (m_RunInUpdate) return; + if (m_RunInUpdate) + { + return; + } Tick(true); } private void Update() { - if (!m_RunInUpdate) return; + if (!m_RunInUpdate) + { + return; + } Tick(false); } - void Tick(bool isFixed) + private void Tick(bool isFixed) { if (NetworkManager.Singleton.IsServer || !m_RunServerOnly) { From 35815a355e0623618483f73e300265789d40730d Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Wed, 8 Sep 2021 18:40:29 -0400 Subject: [PATCH 050/113] cleanup, removing IInterpolator interface, removing other interpolators to centralize any future work inside the main interpolator --- .../BufferedLinearInterpolator.cs | 60 +++---- .../Prototyping/Interpolator/IInterpolator.cs | 17 -- .../Interpolator/IInterpolator.cs.meta | 11 -- .../Interpolator/NoInterpolator.cs | 54 ------- .../Interpolator/NoInterpolator.cs.meta | 11 -- .../Interpolator/SimpleInterpolator.cs | 86 ---------- .../Interpolator/SimpleInterpolator.cs.meta | 11 -- .../Prototyping/NetworkTransform.cs | 152 +++++------------- .../Tests/Editor/InterpolatorTests.cs | 49 ++---- 9 files changed, 74 insertions(+), 377 deletions(-) delete mode 100644 com.unity.netcode.gameobjects/Prototyping/Interpolator/IInterpolator.cs delete mode 100644 com.unity.netcode.gameobjects/Prototyping/Interpolator/IInterpolator.cs.meta delete mode 100644 com.unity.netcode.gameobjects/Prototyping/Interpolator/NoInterpolator.cs delete mode 100644 com.unity.netcode.gameobjects/Prototyping/Interpolator/NoInterpolator.cs.meta delete mode 100644 com.unity.netcode.gameobjects/Prototyping/Interpolator/SimpleInterpolator.cs delete mode 100644 com.unity.netcode.gameobjects/Prototyping/Interpolator/SimpleInterpolator.cs.meta diff --git a/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs b/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs index 9adc7afe94..bf7967bd4a 100644 --- a/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs +++ b/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs @@ -9,7 +9,7 @@ namespace Unity.Netcode /// Partially solves for message loss. Unclamped lerping helps hide this, but not completely /// /// - public abstract class BufferedLinearInterpolator : IInterpolator where T : struct + public abstract class BufferedLinearInterpolator where T : struct { // interface for mock testing, abstracting away external systems public interface IInterpolatorTime @@ -39,8 +39,9 @@ private struct BufferedItem /// /// Override this if you want configurable buffering, right now using ServerTick's own global buffering /// - protected virtual double ServerTimeBeingHandledForBuffering => UseFixedUpdate ? InterpolatorTimeProxy.BufferedServerFixedTime : InterpolatorTimeProxy.BufferedServerTime; - protected virtual double RenderTime => InterpolatorTimeProxy.BufferedServerTime - 1f / InterpolatorTimeProxy.TickRate; + private double ServerTimeBeingHandledForBuffering => UseFixedUpdate ? InterpolatorTimeProxy.BufferedServerFixedTime : InterpolatorTimeProxy.BufferedServerTime; + + private double RenderTime => InterpolatorTimeProxy.BufferedServerTime - 1f / InterpolatorTimeProxy.TickRate; private T m_InterpStartValue; private T m_CurrentInterpValue; @@ -54,22 +55,6 @@ private struct BufferedItem private int m_LifetimeConsumedCount; - public void Start() - { - } - - public void OnEnable() - { - } - - public void Awake() - { - } - - public void OnNetworkSpawn() - { - } - public void ResetTo(T targetValue) { m_LifetimeConsumedCount = 1; @@ -80,7 +65,7 @@ public void ResetTo(T targetValue) m_EndTimeConsumed = new NetworkTime(InterpolatorTimeProxy.TickRate, 0); m_StartTimeConsumed = new NetworkTime(InterpolatorTimeProxy.TickRate, 0); - SimpleInterpolator.ResetTo(targetValue); // for statically placed objects, so we don't interpolate from 0 to current position + // SimpleInterpolator.ResetTo(targetValue); // for statically placed objects, so we don't interpolate from 0 to current position Update(0); } @@ -161,17 +146,14 @@ public T Update(float deltaTime) Debug.Assert(t >= 0, $"t must be bigger than or equal to 0. range {range}, RenderTime {RenderTime}, Start time {FixedOrTime(m_StartTimeConsumed)}, end time {FixedOrTime(m_EndTimeConsumed)}"); } - SimpleInterpolator.AddMeasurement(Interpolate(m_InterpStartValue, m_InterpEndValue, t), default); // using simple interpolation so there's no jump - m_CurrentInterpValue = SimpleInterpolator.Update(deltaTime); + var target = InterpolateUnclamped(m_InterpStartValue, m_InterpEndValue, t); + float maxInterpTime = 0.1f; + m_CurrentInterpValue = Interpolate(m_CurrentInterpValue, target, deltaTime / maxInterpTime); } return m_CurrentInterpValue; } - public void FixedUpdate(float fixedDeltaTime) - { - } - public void AddMeasurement(T newMeasurement, NetworkTime sentTime) { if (m_Buffer.Count >= k_BufferSizeLimit) @@ -192,41 +174,39 @@ public T GetInterpolatedValue() return m_CurrentInterpValue; } - public void OnDestroy() - { - } - protected abstract T Interpolate(T start, T end, float time); + protected abstract T InterpolateUnclamped(T start, T end, float time); - protected abstract SimpleInterpolator SimpleInterpolator { get; } + // protected abstract SimpleInterpolator SimpleInterpolator { get; } } public class BufferedLinearInterpolatorFloat : BufferedLinearInterpolator { - protected override float Interpolate(float start, float end, float time) + protected override float InterpolateUnclamped(float start, float end, float time) { return Mathf.LerpUnclamped(start, end, time); } - protected override SimpleInterpolator SimpleInterpolator { get; } = new SimpleInterpolatorFloat(); - } - - public class BufferedLinearInterpolatorFloatForScale : BufferedLinearInterpolatorFloat - { protected override float Interpolate(float start, float end, float time) { - // scale can't be negative, stopping negative extrapolation - return Mathf.Max(Mathf.LerpUnclamped(start, end, time), 0); + return Mathf.Lerp(start, end, time); } + + // protected override SimpleInterpolator SimpleInterpolator { get; } = new SimpleInterpolatorFloat(); } public class BufferedLinearInterpolatorQuaternion : BufferedLinearInterpolator { + protected override Quaternion InterpolateUnclamped(Quaternion start, Quaternion end, float time) + { + return Quaternion.SlerpUnclamped(start, end, time); + } + protected override Quaternion Interpolate(Quaternion start, Quaternion end, float time) { return Quaternion.SlerpUnclamped(start, end, time); } - protected override SimpleInterpolator SimpleInterpolator { get; } = new SimpleInterpolatorQuaternion(); + // protected override SimpleInterpolator SimpleInterpolator { get; } = new SimpleInterpolatorQuaternion(); } } \ No newline at end of file diff --git a/com.unity.netcode.gameobjects/Prototyping/Interpolator/IInterpolator.cs b/com.unity.netcode.gameobjects/Prototyping/Interpolator/IInterpolator.cs deleted file mode 100644 index eb2700d632..0000000000 --- a/com.unity.netcode.gameobjects/Prototyping/Interpolator/IInterpolator.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace Unity.Netcode -{ - public interface IInterpolator - { - void Awake(); - void OnNetworkSpawn(); - void Start(); - void OnEnable(); - T Update(float deltaTime); - void FixedUpdate(float tickDeltaTime); - void AddMeasurement(T newMeasurement, NetworkTime sentTime); - T GetInterpolatedValue(); - void OnDestroy(); - void ResetTo(T targetValue); - bool UseFixedUpdate { get; set; } - } -} diff --git a/com.unity.netcode.gameobjects/Prototyping/Interpolator/IInterpolator.cs.meta b/com.unity.netcode.gameobjects/Prototyping/Interpolator/IInterpolator.cs.meta deleted file mode 100644 index dcef404a65..0000000000 --- a/com.unity.netcode.gameobjects/Prototyping/Interpolator/IInterpolator.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 071f976e9c2d74c5bb836da710fe368e -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.netcode.gameobjects/Prototyping/Interpolator/NoInterpolator.cs b/com.unity.netcode.gameobjects/Prototyping/Interpolator/NoInterpolator.cs deleted file mode 100644 index fb7c9e58b9..0000000000 --- a/com.unity.netcode.gameobjects/Prototyping/Interpolator/NoInterpolator.cs +++ /dev/null @@ -1,54 +0,0 @@ -namespace Unity.Netcode -{ - public class NoInterpolator : IInterpolator - { - private T m_Current; - - public void Awake() - { - } - - public void OnNetworkSpawn() - { - } - - public void Start() - { - } - - public void OnEnable() - { - } - - public T Update(float deltaTime) - { - // nothing - return GetInterpolatedValue(); - } - - public void FixedUpdate(float fixedDeltaTime) - { - } - - public void AddMeasurement(T newMeasurement, NetworkTime sentTick) - { - m_Current = newMeasurement; - } - - public T GetInterpolatedValue() - { - return m_Current; - } - - public void OnDestroy() - { - } - - public void ResetTo(T targetValue) - { - m_Current = targetValue; - } - - public bool UseFixedUpdate { get; set; } - } -} \ No newline at end of file diff --git a/com.unity.netcode.gameobjects/Prototyping/Interpolator/NoInterpolator.cs.meta b/com.unity.netcode.gameobjects/Prototyping/Interpolator/NoInterpolator.cs.meta deleted file mode 100644 index b5c15e25de..0000000000 --- a/com.unity.netcode.gameobjects/Prototyping/Interpolator/NoInterpolator.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 9f4a8ff3425ce44f1abd995d1a4f88cb -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.netcode.gameobjects/Prototyping/Interpolator/SimpleInterpolator.cs b/com.unity.netcode.gameobjects/Prototyping/Interpolator/SimpleInterpolator.cs deleted file mode 100644 index 397ac20dbb..0000000000 --- a/com.unity.netcode.gameobjects/Prototyping/Interpolator/SimpleInterpolator.cs +++ /dev/null @@ -1,86 +0,0 @@ -using UnityEngine; - -namespace Unity.Netcode -{ - public abstract class SimpleInterpolator : IInterpolator - { - private float m_CurrentTime; - private T m_Start; - private T m_End; - private T m_Updated; - - private const float k_MaxLerpTime = 0.1f; - - public void Awake() - { - Update(0); - } - - public void OnNetworkSpawn() - { - } - - public void Start() - { - } - - public void OnEnable() - { - } - - public T Update(float deltaTime) - { - m_CurrentTime += deltaTime; - m_Updated = Interpolate(m_Start, m_End, m_CurrentTime / k_MaxLerpTime); - return GetInterpolatedValue(); - } - - public void FixedUpdate(float fixedDeltaTime) - { - } - - public void AddMeasurement(T newMeasurement, NetworkTime sentTick) - { - m_End = newMeasurement; - m_CurrentTime = 0; - m_Start = m_Updated; - } - - public T GetInterpolatedValue() - { - return m_Updated; - } - - public void OnDestroy() - { - } - - public void ResetTo(T targetValue) - { - m_End = targetValue; - m_Start = targetValue; - m_Updated = targetValue; - m_CurrentTime = 0; - } - - protected abstract T Interpolate(T a, T b, float time); - - public bool UseFixedUpdate { get; set; } - } - - public class SimpleInterpolatorFloat : SimpleInterpolator - { - protected override float Interpolate(float a, float b, float time) - { - return Mathf.Lerp(a, b, time); - } - } - - public class SimpleInterpolatorQuaternion : SimpleInterpolator - { - protected override Quaternion Interpolate(Quaternion a, Quaternion b, float time) - { - return Quaternion.Slerp(a, b, time); - } - } -} \ No newline at end of file diff --git a/com.unity.netcode.gameobjects/Prototyping/Interpolator/SimpleInterpolator.cs.meta b/com.unity.netcode.gameobjects/Prototyping/Interpolator/SimpleInterpolator.cs.meta deleted file mode 100644 index 7856461e9c..0000000000 --- a/com.unity.netcode.gameobjects/Prototyping/Interpolator/SimpleInterpolator.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 461703a2c7500460db78a7231310592b -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs b/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs index 5ed5b6081c..005c872b9f 100644 --- a/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs @@ -211,47 +211,15 @@ public void NetworkSerialize(NetworkSerializer serializer) private const int k_DebugDrawLineTime = 10; - protected virtual IInterpolator PositionXInterpolator { get; set; } - protected virtual IInterpolator PositionYInterpolator { get; set; } - protected virtual IInterpolator PositionZInterpolator { get; set; } - protected virtual IInterpolator RotationInterpolator { get; set; } // rotation is a single Quaternion since each euler axis will affect the quaternion's final value - protected virtual IInterpolator ScaleXInterpolator { get; set; } - protected virtual IInterpolator ScaleYInterpolator { get; set; } - protected virtual IInterpolator ScaleZInterpolator { get; set; } - - public void InitializeInterpolator() where TPos : IInterpolator, new() where TRot : IInterpolator, new() where TScale : IInterpolator, new() - { - m_AllFloatInterpolators.Clear(); - if (Interpolate) - { - PositionXInterpolator = new TPos(); - PositionYInterpolator = new TPos(); - PositionZInterpolator = new TPos(); - RotationInterpolator = new TRot(); - ScaleXInterpolator = new TScale(); - ScaleYInterpolator = new TScale(); - ScaleZInterpolator = new TScale(); - } - else - { - PositionXInterpolator = new NoInterpolator(); - PositionYInterpolator = new NoInterpolator(); - PositionZInterpolator = new NoInterpolator(); - RotationInterpolator = new NoInterpolator(); - ScaleXInterpolator = new NoInterpolator(); - ScaleYInterpolator = new NoInterpolator(); - ScaleZInterpolator = new NoInterpolator(); - } - - m_AllFloatInterpolators.Add(PositionXInterpolator); - m_AllFloatInterpolators.Add(PositionYInterpolator); - m_AllFloatInterpolators.Add(PositionZInterpolator); - m_AllFloatInterpolators.Add(ScaleXInterpolator); - m_AllFloatInterpolators.Add(ScaleYInterpolator); - m_AllFloatInterpolators.Add(ScaleZInterpolator); - } + private BufferedLinearInterpolator m_PositionXInterpolator = new BufferedLinearInterpolatorFloat(); + private BufferedLinearInterpolator m_PositionYInterpolator = new BufferedLinearInterpolatorFloat(); + private BufferedLinearInterpolator m_PositionZInterpolator = new BufferedLinearInterpolatorFloat(); + private BufferedLinearInterpolator m_RotationInterpolator = new BufferedLinearInterpolatorQuaternion(); // rotation is a single Quaternion since each euler axis will affect the quaternion's final value + private BufferedLinearInterpolator m_ScaleXInterpolator = new BufferedLinearInterpolatorFloat(); + private BufferedLinearInterpolator m_ScaleYInterpolator = new BufferedLinearInterpolatorFloat(); + private BufferedLinearInterpolator m_ScaleZInterpolator = new BufferedLinearInterpolatorFloat(); - private readonly List> m_AllFloatInterpolators = new List>(6); + private readonly List> m_AllFloatInterpolators = new List>(6); private Transform m_Transform; // cache the transform component to reduce unnecessary bounce between managed and native @@ -261,15 +229,15 @@ public void NetworkSerialize(NetworkSerializer serializer) public void ResetCurrentInterpolatedState() { - PositionXInterpolator.ResetTo(ReplNetworkState.Value.PositionX); - PositionYInterpolator.ResetTo(ReplNetworkState.Value.PositionY); - PositionZInterpolator.ResetTo(ReplNetworkState.Value.PositionZ); + m_PositionXInterpolator.ResetTo(ReplNetworkState.Value.PositionX); + m_PositionYInterpolator.ResetTo(ReplNetworkState.Value.PositionY); + m_PositionZInterpolator.ResetTo(ReplNetworkState.Value.PositionZ); - RotationInterpolator.ResetTo(Quaternion.Euler(ReplNetworkState.Value.Rotation)); + m_RotationInterpolator.ResetTo(Quaternion.Euler(ReplNetworkState.Value.Rotation)); - ScaleXInterpolator.ResetTo(ReplNetworkState.Value.ScaleX); - ScaleYInterpolator.ResetTo(ReplNetworkState.Value.ScaleY); - ScaleZInterpolator.ResetTo(ReplNetworkState.Value.ScaleZ); + m_ScaleXInterpolator.ResetTo(ReplNetworkState.Value.ScaleX); + m_ScaleYInterpolator.ResetTo(ReplNetworkState.Value.ScaleY); + m_ScaleZInterpolator.ResetTo(ReplNetworkState.Value.ScaleZ); } // updates `NetworkState` properties if they need to and returns a `bool` indicating whether or not there was any changes made @@ -401,48 +369,48 @@ internal void ApplyNetworkStateFromAuthority(NetworkState networkState) // Position Read if (networkState.HasPositionX) { - interpolatedPosition.x = PositionXInterpolator.GetInterpolatedValue(); + interpolatedPosition.x = Interpolate ? m_PositionXInterpolator.GetInterpolatedValue() : networkState.Position.x; } if (networkState.HasPositionY) { - interpolatedPosition.y = PositionYInterpolator.GetInterpolatedValue(); + interpolatedPosition.y = Interpolate ? m_PositionYInterpolator.GetInterpolatedValue() : networkState.Position.y; } if (networkState.HasPositionZ) { - interpolatedPosition.z = PositionZInterpolator.GetInterpolatedValue(); + interpolatedPosition.z = Interpolate ? m_PositionZInterpolator.GetInterpolatedValue() : networkState.Position.z; } if (networkState.HasRotAngleX) { - interpolatedRotAngles.x = RotationInterpolator.GetInterpolatedValue().eulerAngles.x; + interpolatedRotAngles.x = Interpolate ? m_RotationInterpolator.GetInterpolatedValue().eulerAngles.x : networkState.Rotation.x; } if (networkState.HasRotAngleY) { - interpolatedRotAngles.y = RotationInterpolator.GetInterpolatedValue().eulerAngles.y; + interpolatedRotAngles.y = Interpolate ? m_RotationInterpolator.GetInterpolatedValue().eulerAngles.y : networkState.Rotation.y; } if (networkState.HasRotAngleZ) { - interpolatedRotAngles.z = RotationInterpolator.GetInterpolatedValue().eulerAngles.z; + interpolatedRotAngles.z = Interpolate ? m_RotationInterpolator.GetInterpolatedValue().eulerAngles.z : networkState.Rotation.z; } // Scale Read if (networkState.HasScaleX) { - interpolatedScale.x = ScaleXInterpolator.GetInterpolatedValue(); + interpolatedScale.x = Interpolate ? m_ScaleXInterpolator.GetInterpolatedValue() : networkState.Scale.x; } if (networkState.HasScaleY) { - interpolatedScale.y = ScaleYInterpolator.GetInterpolatedValue(); + interpolatedScale.y = Interpolate ? m_ScaleYInterpolator.GetInterpolatedValue() : networkState.Scale.y; } if (networkState.HasScaleZ) { - interpolatedScale.z = ScaleZInterpolator.GetInterpolatedValue(); + interpolatedScale.z = Interpolate ? m_ScaleZInterpolator.GetInterpolatedValue() : networkState.Scale.z; } // Position Apply @@ -511,34 +479,34 @@ private void OnNetworkStateChanged(NetworkState oldState, NetworkState newState) if (newState.HasPositionX) { - PositionXInterpolator.AddMeasurement(newState.PositionX, sentTime); + m_PositionXInterpolator.AddMeasurement(newState.PositionX, sentTime); } if (newState.HasPositionY) { - PositionYInterpolator.AddMeasurement(newState.PositionY, sentTime); + m_PositionYInterpolator.AddMeasurement(newState.PositionY, sentTime); } if (newState.HasPositionZ) { - PositionZInterpolator.AddMeasurement(newState.PositionZ, sentTime); + m_PositionZInterpolator.AddMeasurement(newState.PositionZ, sentTime); } - RotationInterpolator.AddMeasurement(Quaternion.Euler(newState.Rotation), sentTime); + m_RotationInterpolator.AddMeasurement(Quaternion.Euler(newState.Rotation), sentTime); if (newState.HasScaleX) { - ScaleXInterpolator.AddMeasurement(newState.ScaleX, sentTime); + m_ScaleXInterpolator.AddMeasurement(newState.ScaleX, sentTime); } if (newState.HasScaleY) { - ScaleYInterpolator.AddMeasurement(newState.ScaleY, sentTime); + m_ScaleYInterpolator.AddMeasurement(newState.ScaleY, sentTime); } if (newState.HasScaleZ) { - ScaleZInterpolator.AddMeasurement(newState.ScaleZ, sentTime); + m_ScaleZInterpolator.AddMeasurement(newState.ScaleZ, sentTime); } if (NetworkManager.Singleton.LogLevel == LogLevel.Developer) @@ -552,20 +520,22 @@ private void Awake() { m_Transform = transform; - if (m_AllFloatInterpolators.Count == 0) + if (m_AllFloatInterpolators.Count == 0/* && Interpolate*/) { - InitializeInterpolator(); + m_AllFloatInterpolators.Add(m_PositionXInterpolator); + m_AllFloatInterpolators.Add(m_PositionYInterpolator); + m_AllFloatInterpolators.Add(m_PositionZInterpolator); + m_AllFloatInterpolators.Add(m_ScaleXInterpolator); + m_AllFloatInterpolators.Add(m_ScaleYInterpolator); + m_AllFloatInterpolators.Add(m_ScaleZInterpolator); } foreach (var interpolator in m_AllFloatInterpolators) { - interpolator.Awake(); interpolator.UseFixedUpdate = UseFixedUpdate; } - RotationInterpolator.Awake(); - RotationInterpolator.UseFixedUpdate = UseFixedUpdate; - + m_RotationInterpolator.UseFixedUpdate = UseFixedUpdate; // ReplNetworkState.NetworkVariableChannel = NetworkChannel.PositionUpdate; // todo figure this out, talk with Matt/Fatih, this should be unreliable // set initial value for spawn @@ -585,25 +555,7 @@ private void Awake() ReplNetworkState.OnValueChanged += OnNetworkStateChanged; } - public void Start() - { - foreach (var interpolator in m_AllFloatInterpolators) - { - interpolator.Start(); - } - RotationInterpolator.Start(); - } - - public void OnEnable() - { - foreach (var interpolator in m_AllFloatInterpolators) - { - interpolator.OnEnable(); - } - - RotationInterpolator.OnEnable(); - } public override void OnNetworkSpawn() { @@ -611,14 +563,6 @@ public override void OnNetworkSpawn() { ResetCurrentInterpolatedState(); // useful for late joining - foreach (var interpolator in m_AllFloatInterpolators) - { - interpolator.OnNetworkSpawn(); - } - - // todo cache network manager to remove some of the time it takes to get it - RotationInterpolator.OnNetworkSpawn(); - ApplyNetworkStateFromAuthority(ReplNetworkState.Value); } } @@ -626,13 +570,6 @@ public override void OnNetworkSpawn() private void OnDestroy() { ReplNetworkState.OnValueChanged -= OnNetworkStateChanged; - - foreach (var interpolator in m_AllFloatInterpolators) - { - interpolator.OnDestroy(); - } - - RotationInterpolator.OnDestroy(); } private void DoUpdateToGhosts(double time) @@ -671,13 +608,6 @@ private void FixedUpdate() Debug.LogWarning($"A local change to {dirtyField} without authority detected, reverting back to latest interpolated network state!", this); ApplyNetworkStateFromAuthority(ReplNetworkState.Value); } - - foreach (var interpolator in m_AllFloatInterpolators) - { - interpolator.FixedUpdate(NetworkManager.ServerTime.FixedDeltaTime); - } - - RotationInterpolator.FixedUpdate(NetworkManager.ServerTime.FixedDeltaTime); } } @@ -701,11 +631,11 @@ private void Update() interpolator.Update(Time.deltaTime); } - RotationInterpolator.Update(Time.deltaTime); + m_RotationInterpolator.Update(Time.deltaTime); if (NetworkManager.Singleton.LogLevel == LogLevel.Developer) { - var interpolatedPosition = new Vector3(PositionXInterpolator.GetInterpolatedValue(), PositionYInterpolator.GetInterpolatedValue(), PositionZInterpolator.GetInterpolatedValue()); + var interpolatedPosition = new Vector3(m_PositionXInterpolator.GetInterpolatedValue(), m_PositionYInterpolator.GetInterpolatedValue(), m_PositionZInterpolator.GetInterpolatedValue()); Debug.DrawLine(interpolatedPosition, interpolatedPosition + Vector3.up, Color.magenta, k_DebugDrawLineTime, false); } diff --git a/com.unity.netcode.gameobjects/Tests/Editor/InterpolatorTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/InterpolatorTests.cs index bed79b1dc5..bde1199ba9 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/InterpolatorTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/InterpolatorTests.cs @@ -27,46 +27,23 @@ private NetworkTime T(float time, int tickRate = k_MockTickRate) return new NetworkTime(tickRate, timeSec: time); } - [Test] - public void TestSimpleInterpolator() - { - var interpolator = new SimpleInterpolatorFloat(); - interpolator.UseFixedUpdate = false; - - Assert.That(interpolator.GetInterpolatedValue(), Is.EqualTo(0f)); - - interpolator.AddMeasurement(10, default); - var val = interpolator.Update(0.05f); - Assert.That(val, Is.EqualTo(5f)); - } - [Test] public void TestReset() { - void DoTest(Action> specialAction = null) where TypeToTest : IInterpolator, new() - { - var interpolator = new TypeToTest(); - specialAction?.Invoke(interpolator); - interpolator.AddMeasurement(5, T(1.0f)); - var initVal = interpolator.Update(10); // big value - Assert.That(initVal, Is.EqualTo(5f)); - Assert.That(interpolator.GetInterpolatedValue(), Is.EqualTo(5f)); - - interpolator.ResetTo(100f); - Assert.That(interpolator.GetInterpolatedValue(), Is.EqualTo(100f)); - var val = interpolator.Update(1f); - Assert.That(val, Is.EqualTo(100f)); - } + var interpolator = new BufferedLinearInterpolatorFloat(); + var timeMock = new MockInterpolatorTime(0, k_MockTickRate); + interpolator.InterpolatorTimeProxy = timeMock; + timeMock.BufferedServerTime = 100f; + + interpolator.AddMeasurement(5, T(1.0f)); + var initVal = interpolator.Update(10); // big value + Assert.That(initVal, Is.EqualTo(5f)); + Assert.That(interpolator.GetInterpolatedValue(), Is.EqualTo(5f)); - DoTest>(); - DoTest(); - DoTest(interpolator => - { - var timeMock = new MockInterpolatorTime(0, k_MockTickRate); - ((BufferedLinearInterpolatorFloat) interpolator).InterpolatorTimeProxy = timeMock; - timeMock.BufferedServerTime = 100f; - } - ); + interpolator.ResetTo(100f); + Assert.That(interpolator.GetInterpolatedValue(), Is.EqualTo(100f)); + var val = interpolator.Update(1f); + Assert.That(val, Is.EqualTo(100f)); } [Test] From 5d4470a2d51c262ab52d7559d35be0d8bfa05442 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Wed, 8 Sep 2021 19:22:14 -0400 Subject: [PATCH 051/113] adding some comments --- .../Prototyping/Interpolator/BufferedLinearInterpolator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs b/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs index bf7967bd4a..af1ca4260d 100644 --- a/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs +++ b/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs @@ -148,7 +148,7 @@ public T Update(float deltaTime) var target = InterpolateUnclamped(m_InterpStartValue, m_InterpEndValue, t); float maxInterpTime = 0.1f; - m_CurrentInterpValue = Interpolate(m_CurrentInterpValue, target, deltaTime / maxInterpTime); + m_CurrentInterpValue = Interpolate(m_CurrentInterpValue, target, deltaTime / maxInterpTime); // second interpolate to smooth out extrapolation jumps } return m_CurrentInterpValue; From 0747544a7e833d08db832d727e7a0480d6f115ce Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Thu, 9 Sep 2021 13:17:02 -0400 Subject: [PATCH 052/113] comment cleanup fix for name --- .../Interpolator/BufferedLinearInterpolator.cs | 18 +++++++++--------- .../Prototyping/NetworkTransform.cs | 2 +- .../NetworkTransform/NetworkTransformTests.cs | 1 - 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs b/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs index af1ca4260d..a0a191c5fb 100644 --- a/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs +++ b/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs @@ -30,8 +30,8 @@ private class InterpolatorTime : IInterpolatorTime private struct BufferedItem { - public T item; - public NetworkTime timeSent; + public T Item; + public NetworkTime TimeSent; } public bool UseFixedUpdate { get; set; } @@ -86,12 +86,12 @@ private void TryConsumeFromBuffer() { var bufferedValue = m_Buffer[i]; // Consume when ready. This can consume multiple times - if (FixedOrTime(bufferedValue.timeSent) <= ServerTimeBeingHandledForBuffering) + if (FixedOrTime(bufferedValue.TimeSent) <= ServerTimeBeingHandledForBuffering) { if (m_LifetimeConsumedCount == 0) { - m_StartTimeConsumed = bufferedValue.timeSent; - m_InterpStartValue = bufferedValue.item; + m_StartTimeConsumed = bufferedValue.TimeSent; + m_InterpStartValue = bufferedValue.Item; } else if (consumedCount == 0) { @@ -99,8 +99,8 @@ private void TryConsumeFromBuffer() m_InterpStartValue = m_InterpEndValue; } - m_EndTimeConsumed = bufferedValue.timeSent; - m_InterpEndValue = bufferedValue.item; + m_EndTimeConsumed = bufferedValue.TimeSent; + m_InterpEndValue = bufferedValue.Item; m_Buffer.RemoveAt(i); consumedCount++; m_LifetimeConsumedCount++; @@ -164,8 +164,8 @@ public void AddMeasurement(T newMeasurement, NetworkTime sentTime) if (sentTime.Time > m_EndTimeConsumed.Time || m_LifetimeConsumedCount == 0) // treat only if value is newer than the one being interpolated to right now { - m_Buffer.Add(new BufferedItem {item = newMeasurement, timeSent = sentTime}); - m_Buffer.Sort((item1, item2) => item2.timeSent.Time.CompareTo(item1.timeSent.Time)); + m_Buffer.Add(new BufferedItem {Item = newMeasurement, TimeSent = sentTime}); + m_Buffer.Sort((item1, item2) => item2.TimeSent.Time.CompareTo(item1.TimeSent.Time)); } } diff --git a/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs b/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs index 005c872b9f..f8ff04fbd4 100644 --- a/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs @@ -6,7 +6,7 @@ namespace Unity.Netcode.Prototyping { /// - /// A prototype component for syncing transforms + /// A component for syncing transforms /// [AddComponentMenu("Netcode/" + nameof(NetworkTransform))] [DefaultExecutionOrder(1000)] // this is needed to catch the update time after the transform was updated by user scripts diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/NetworkTransformTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/NetworkTransformTests.cs index 13a4c8fb7e..783f90ace6 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/NetworkTransformTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/NetworkTransformTests.cs @@ -1,7 +1,6 @@ using System.Collections; using Unity.Netcode.Prototyping; using NUnit.Framework; -using UnityEngine; using UnityEngine.TestTools; namespace Unity.Netcode.RuntimeTests From b0cc99443f9a895a8b6e268f67fa2bc93a84df85 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Thu, 9 Sep 2021 17:28:50 -0400 Subject: [PATCH 053/113] after investigation, UseFixedUpdate isn't needed anymore with latest changes --- .../Editor/NetworkTransformEditor.cs | 3 --- .../BufferedLinearInterpolator.cs | 17 +++++------- .../Prototyping/NetworkTransform.cs | 26 ++----------------- .../Tests/Editor/InterpolatorTests.cs | 9 ------- 4 files changed, 9 insertions(+), 46 deletions(-) diff --git a/com.unity.netcode.gameobjects/Editor/NetworkTransformEditor.cs b/com.unity.netcode.gameobjects/Editor/NetworkTransformEditor.cs index c565c917f3..519b2a6f38 100644 --- a/com.unity.netcode.gameobjects/Editor/NetworkTransformEditor.cs +++ b/com.unity.netcode.gameobjects/Editor/NetworkTransformEditor.cs @@ -21,7 +21,6 @@ public class NetworkTransformEditor : UnityEditor.Editor private SerializedProperty m_ScaleThresholdProperty; private SerializedProperty m_InLocalSpaceProperty; private SerializedProperty m_InterpolateProperty; - private SerializedProperty m_UseFixedUpdateProperty; private static int s_ToggleOffset = 45; private static float s_MaxRowWidth = EditorGUIUtility.labelWidth + EditorGUIUtility.fieldWidth + 5; @@ -45,7 +44,6 @@ public void OnEnable() m_ScaleThresholdProperty = serializedObject.FindProperty(nameof(NetworkTransform.ScaleThreshold)); m_InLocalSpaceProperty = serializedObject.FindProperty(nameof(NetworkTransform.InLocalSpace)); m_InterpolateProperty = serializedObject.FindProperty(nameof(NetworkTransform.Interpolate)); - m_UseFixedUpdateProperty = serializedObject.FindProperty(nameof(NetworkTransform.UseFixedUpdate)); } public override void OnInspectorGUI() @@ -113,7 +111,6 @@ public override void OnInspectorGUI() EditorGUILayout.LabelField("Configurations", EditorStyles.boldLabel); EditorGUILayout.PropertyField(m_InLocalSpaceProperty); EditorGUILayout.PropertyField(m_InterpolateProperty); - EditorGUILayout.PropertyField(m_UseFixedUpdateProperty); serializedObject.ApplyModifiedProperties(); } diff --git a/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs b/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs index a0a191c5fb..6a5ab0f896 100644 --- a/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs +++ b/com.unity.netcode.gameobjects/Prototyping/Interpolator/BufferedLinearInterpolator.cs @@ -34,12 +34,11 @@ private struct BufferedItem public NetworkTime TimeSent; } - public bool UseFixedUpdate { get; set; } /// /// Override this if you want configurable buffering, right now using ServerTick's own global buffering /// - private double ServerTimeBeingHandledForBuffering => UseFixedUpdate ? InterpolatorTimeProxy.BufferedServerFixedTime : InterpolatorTimeProxy.BufferedServerTime; + private double ServerTimeBeingHandledForBuffering => InterpolatorTimeProxy.BufferedServerTime; private double RenderTime => InterpolatorTimeProxy.BufferedServerTime - 1f / InterpolatorTimeProxy.TickRate; @@ -69,10 +68,6 @@ public void ResetTo(T targetValue) Update(0); } - private double FixedOrTime(NetworkTime t) - { - return UseFixedUpdate ? t.FixedTime : t.Time; - } // todo if I have value 1, 2, 3 and I'm treating 1 to 3, I shouldn't interpolate between 1 and 3, I should interpolate from 1 to 2, then from 2 to 3 to get the best path private void TryConsumeFromBuffer() @@ -86,7 +81,7 @@ private void TryConsumeFromBuffer() { var bufferedValue = m_Buffer[i]; // Consume when ready. This can consume multiple times - if (FixedOrTime(bufferedValue.TimeSent) <= ServerTimeBeingHandledForBuffering) + if (bufferedValue.TimeSent.Time <= ServerTimeBeingHandledForBuffering) { if (m_LifetimeConsumedCount == 0) { @@ -125,7 +120,7 @@ public T Update(float deltaTime) if (m_LifetimeConsumedCount >= 1) // shouldn't interpolate between default values, let's wait to receive data first, should only interpolate between real measurements { - double range = FixedOrTime(m_EndTimeConsumed) - FixedOrTime(m_StartTimeConsumed); + double range = m_EndTimeConsumed.Time - m_StartTimeConsumed.Time; float t; if (range == 0) { @@ -133,17 +128,19 @@ public T Update(float deltaTime) } else { - t = (float) ((RenderTime - FixedOrTime(m_StartTimeConsumed)) / range); + t = (float) ((RenderTime - m_StartTimeConsumed.Time) / range); } if (t > 3) // max extrapolation { + // TODO this causes issues with teleport, investigate + // todo make this configurable t = 1; } if (Debug.isDebugBuild) { - Debug.Assert(t >= 0, $"t must be bigger than or equal to 0. range {range}, RenderTime {RenderTime}, Start time {FixedOrTime(m_StartTimeConsumed)}, end time {FixedOrTime(m_EndTimeConsumed)}"); + Debug.Assert(t >= 0, $"t must be bigger than or equal to 0. range {range}, RenderTime {RenderTime}, Start time {m_StartTimeConsumed.Time}, end time {m_EndTimeConsumed.Time}"); } var target = InterpolateUnclamped(m_InterpStartValue, m_InterpEndValue, t); diff --git a/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs b/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs index f8ff04fbd4..0dfac3a576 100644 --- a/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs @@ -207,7 +207,6 @@ public void NetworkSerialize(NetworkSerializer serializer) [SerializeField, Range(0, 120), Tooltip("The base amount of sends per seconds to use when range is disabled")] public float FixedSendsPerSecond = 30f; - public bool UseFixedUpdate = true; private const int k_DebugDrawLineTime = 10; @@ -530,33 +529,17 @@ private void Awake() m_AllFloatInterpolators.Add(m_ScaleZInterpolator); } - foreach (var interpolator in m_AllFloatInterpolators) - { - interpolator.UseFixedUpdate = UseFixedUpdate; - } - - m_RotationInterpolator.UseFixedUpdate = UseFixedUpdate; // ReplNetworkState.NetworkVariableChannel = NetworkChannel.PositionUpdate; // todo figure this out, talk with Matt/Fatih, this should be unreliable // set initial value for spawn if (IsServer) { - if (UseFixedUpdate) - { - // try to update local NetworkState - DoUpdateToGhosts(NetworkManager.LocalTime.FixedTime); - } - else - { - DoUpdateToGhosts(NetworkManager.LocalTime.Time); - } + DoUpdateToGhosts(NetworkManager.LocalTime.Time); } ReplNetworkState.OnValueChanged += OnNetworkStateChanged; } - - public override void OnNetworkSpawn() { if (!IsServer) @@ -588,11 +571,6 @@ private void FixedUpdate() return; } - if (IsServer && UseFixedUpdate) // todo change IsServer for HasAuthority check - { - // try to update local NetworkState - DoUpdateToGhosts(NetworkManager.LocalTime.FixedTime); - } // try to update previously consumed NetworkState // if we have any changes, that means made some updates locally @@ -618,7 +596,7 @@ private void Update() return; } - if (IsServer && !UseFixedUpdate) + if (IsServer) { DoUpdateToGhosts(NetworkManager.LocalTime.Time); } diff --git a/com.unity.netcode.gameobjects/Tests/Editor/InterpolatorTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/InterpolatorTests.cs index bde1199ba9..69656dcbd8 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/InterpolatorTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/InterpolatorTests.cs @@ -52,7 +52,6 @@ public void NormalUsage() // Testing float instead of Vector3. The only difference with Vector3 is the lerp method used. var interpolator = new BufferedLinearInterpolatorFloat(); - interpolator.UseFixedUpdate = false; var mockBufferedTime = new MockInterpolatorTime(0, k_MockTickRate); interpolator.InterpolatorTimeProxy = mockBufferedTime; @@ -99,7 +98,6 @@ public void NormalUsage() public void OutOfOrderShouldStillWork() { var interpolator = new BufferedLinearInterpolatorFloat(); - interpolator.UseFixedUpdate = false; var mockBufferedTime = new MockInterpolatorTime(0, k_MockTickRate); interpolator.InterpolatorTimeProxy = mockBufferedTime; @@ -130,7 +128,6 @@ public void OutOfOrderShouldStillWork() public void MessageLoss() { var interpolator = new BufferedLinearInterpolatorFloat(); - interpolator.UseFixedUpdate = false; var mockBufferedTime = new MockInterpolatorTime(0, k_MockTickRate); interpolator.InterpolatorTimeProxy = mockBufferedTime; @@ -198,7 +195,6 @@ public void MessageLoss() public void AddFirstMeasurement() { var interpolator = new BufferedLinearInterpolatorFloat(); - interpolator.UseFixedUpdate = false; var mockBufferedTime = new MockInterpolatorTime(0, k_MockTickRate); interpolator.InterpolatorTimeProxy = mockBufferedTime; @@ -227,7 +223,6 @@ public void AddFirstMeasurement() public void JumpToEachValueIfDeltaTimeTooBig() { var interpolator = new BufferedLinearInterpolatorFloat(); - interpolator.UseFixedUpdate = false; var mockBufferedTime = new MockInterpolatorTime(0, k_MockTickRate); interpolator.InterpolatorTimeProxy = mockBufferedTime; @@ -247,7 +242,6 @@ public void JumpToEachValueIfDeltaTimeTooBig() public void JumpToLastValueFromStart() { var interpolator = new BufferedLinearInterpolatorFloat(); - interpolator.UseFixedUpdate = false; var mockBufferedTime = new MockInterpolatorTime(0, k_MockTickRate); interpolator.InterpolatorTimeProxy = mockBufferedTime; @@ -279,7 +273,6 @@ public void JumpToLastValueFromStart() public void TestBufferSizeLimit() { var interpolator = new BufferedLinearInterpolatorFloat(); - interpolator.UseFixedUpdate = false; var mockBufferedTime = new MockInterpolatorTime(0, k_MockTickRate); interpolator.InterpolatorTimeProxy = mockBufferedTime; @@ -313,7 +306,6 @@ public void TestBufferSizeLimit() public void TestUpdatingInterpolatorWithNoData() { var interpolator = new BufferedLinearInterpolatorFloat(); - interpolator.UseFixedUpdate = false; var mockBufferedTime = new MockInterpolatorTime(0, k_MockTickRate); interpolator.InterpolatorTimeProxy = mockBufferedTime; @@ -325,7 +317,6 @@ public void TestUpdatingInterpolatorWithNoData() public void TestDuplicatedValues() { var interpolator = new BufferedLinearInterpolatorFloat(); - interpolator.UseFixedUpdate = false; var mockBufferedTime = new MockInterpolatorTime(0, k_MockTickRate); interpolator.InterpolatorTimeProxy = mockBufferedTime; From 41aeef08e25483d27d32481cbd2205918953dc25 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Thu, 9 Sep 2021 23:28:27 -0400 Subject: [PATCH 054/113] Fix axis sync issue. Fix interpolate option issue --- .../Prototyping/NetworkTransform.cs | 129 +++++++++++++----- 1 file changed, 93 insertions(+), 36 deletions(-) diff --git a/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs b/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs index 0dfac3a576..e19ec2e47e 100644 --- a/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs @@ -31,64 +31,104 @@ internal struct NetworkState : INetworkSerializable public bool InLocalSpace { get => (Bitset & (1 << InLocalSpaceBit)) != 0; - set => Bitset |= (ushort) ((value ? 1 : 0) << InLocalSpaceBit); + set + { + if (value) Bitset = (ushort) (Bitset | (1 << InLocalSpaceBit)); + else Bitset = (ushort) (Bitset & ~(1 << InLocalSpaceBit)); + } } // Position public bool HasPositionX { get => (Bitset & (1 << PositionXBit)) != 0; - set => Bitset |= (ushort) ((value ? 1 : 0) << PositionXBit); + set + { + if (value) Bitset = (ushort) (Bitset | (1 << PositionXBit)); + else Bitset = (ushort) (Bitset & ~(1 << PositionXBit)); + } } public bool HasPositionY { get => (Bitset & (1 << PositionYBit)) != 0; - set => Bitset |= (ushort) ((value ? 1 : 0) << PositionYBit); + set + { + if (value) Bitset = (ushort) (Bitset | (1 << PositionYBit)); + else Bitset = (ushort) (Bitset & ~(1 << PositionYBit)); + } } public bool HasPositionZ { get => (Bitset & (1 << PositionZBit)) != 0; - set => Bitset |= (ushort) ((value ? 1 : 0) << PositionZBit); + set + { + if (value) Bitset = (ushort) (Bitset | (1 << PositionZBit)); + else Bitset = (ushort) (Bitset & ~(1 << PositionZBit)); + } } // RotAngles public bool HasRotAngleX { get => (Bitset & (1 << RotAngleXBit)) != 0; - set => Bitset |= (ushort) ((value ? 1 : 0) << RotAngleXBit); + set + { + if (value) Bitset = (ushort) (Bitset | (1 << RotAngleXBit)); + else Bitset = (ushort) (Bitset & ~(1 << RotAngleXBit)); + } } public bool HasRotAngleY { get => (Bitset & (1 << RotAngleYBit)) != 0; - set => Bitset |= (ushort) ((value ? 1 : 0) << RotAngleYBit); + set + { + if (value) Bitset = (ushort) (Bitset | (1 << RotAngleYBit)); + else Bitset = (ushort) (Bitset & ~(1 << RotAngleYBit)); + } } public bool HasRotAngleZ { get => (Bitset & (1 << RotAngleZBit)) != 0; - set => Bitset |= (ushort) ((value ? 1 : 0) << RotAngleZBit); + set + { + if (value) Bitset = (ushort) (Bitset | (1 << RotAngleZBit)); + else Bitset = (ushort) (Bitset & ~(1 << RotAngleZBit)); + } } // Scale public bool HasScaleX { get => (Bitset & (1 << ScaleXBit)) != 0; - set => Bitset |= (ushort) ((value ? 1 : 0) << ScaleXBit); + set + { + if (value) Bitset = (ushort) (Bitset | (1 << ScaleXBit)); + else Bitset = (ushort) (Bitset & ~(1 << ScaleXBit)); + } } public bool HasScaleY { get => (Bitset & (1 << ScaleYBit)) != 0; - set => Bitset |= (ushort) ((value ? 1 : 0) << ScaleYBit); + set + { + if (value) Bitset = (ushort) (Bitset | (1 << ScaleYBit)); + else Bitset = (ushort) (Bitset & ~(1 << ScaleYBit)); + } } public bool HasScaleZ { get => (Bitset & (1 << ScaleZBit)) != 0; - set => Bitset |= (ushort) ((value ? 1 : 0) << ScaleZBit); + set + { + if (value) Bitset = (ushort) (Bitset | (1 << ScaleZBit)); + else Bitset = (ushort) (Bitset & ~(1 << ScaleZBit)); + } } public float PositionX, PositionY, PositionZ; @@ -242,25 +282,25 @@ public void ResetCurrentInterpolatedState() // updates `NetworkState` properties if they need to and returns a `bool` indicating whether or not there was any changes made // returned boolean would be useful to change encapsulating `NetworkVariable`'s dirty state, e.g. ReplNetworkState.SetDirty(isDirty); internal bool UpdateNetworkStateCheckDirty(ref NetworkState networkState, double dirtyTime) - { - return UpdateNetworkStateCheckDirtyWithInfo(ref networkState, dirtyTime).isDirty; - } - - private (bool isDirty, bool isPositionDirty, bool isRotationDirty, bool isScaleDirty) UpdateNetworkStateCheckDirtyWithInfo(ref NetworkState networkState, double dirtyTime) { var position = InLocalSpace ? m_Transform.localPosition : m_Transform.position; var rotAngles = InLocalSpace ? m_Transform.localEulerAngles : m_Transform.eulerAngles; var scale = InLocalSpace ? m_Transform.localScale : m_Transform.lossyScale; - bool isDirty = false; - bool isPositionDirty = false; - bool isRotationDirty = false; - bool isScaleDirty = false; + networkState.HasPositionX = false; + networkState.HasPositionY = false; + networkState.HasPositionZ = false; + networkState.HasRotAngleX = false; + networkState.HasRotAngleY = false; + networkState.HasRotAngleZ = false; + networkState.HasScaleX = false; + networkState.HasScaleY = false; + networkState.HasScaleZ = false; + if (InLocalSpace != networkState.InLocalSpace) { networkState.InLocalSpace = InLocalSpace; - isDirty = true; } if (SyncPositionX && @@ -269,7 +309,6 @@ internal bool UpdateNetworkStateCheckDirty(ref NetworkState networkState, double { networkState.PositionX = position.x; networkState.HasPositionX = true; - isPositionDirty = true; } if (SyncPositionY && @@ -278,7 +317,6 @@ internal bool UpdateNetworkStateCheckDirty(ref NetworkState networkState, double { networkState.PositionY = position.y; networkState.HasPositionY = true; - isPositionDirty = true; } if (SyncPositionZ && @@ -287,7 +325,6 @@ internal bool UpdateNetworkStateCheckDirty(ref NetworkState networkState, double { networkState.PositionZ = position.z; networkState.HasPositionZ = true; - isPositionDirty = true; } if (SyncRotAngleX && @@ -296,7 +333,6 @@ internal bool UpdateNetworkStateCheckDirty(ref NetworkState networkState, double { networkState.RotAngleX = rotAngles.x; networkState.HasRotAngleX = true; - isRotationDirty = true; } if (SyncRotAngleY && @@ -305,7 +341,6 @@ internal bool UpdateNetworkStateCheckDirty(ref NetworkState networkState, double { networkState.RotAngleY = rotAngles.y; networkState.HasRotAngleY = true; - isRotationDirty = true; } if (SyncRotAngleZ && @@ -314,7 +349,6 @@ internal bool UpdateNetworkStateCheckDirty(ref NetworkState networkState, double { networkState.RotAngleZ = rotAngles.z; networkState.HasRotAngleZ = true; - isRotationDirty = true; } if (SyncScaleX && @@ -323,7 +357,6 @@ internal bool UpdateNetworkStateCheckDirty(ref NetworkState networkState, double { networkState.ScaleX = scale.x; networkState.HasScaleX = true; - isScaleDirty = true; } if (SyncScaleY && @@ -332,7 +365,6 @@ internal bool UpdateNetworkStateCheckDirty(ref NetworkState networkState, double { networkState.ScaleY = scale.y; networkState.HasScaleY = true; - isScaleDirty = true; } if (SyncScaleZ && @@ -341,10 +373,11 @@ internal bool UpdateNetworkStateCheckDirty(ref NetworkState networkState, double { networkState.ScaleZ = scale.z; networkState.HasScaleZ = true; - isScaleDirty = true; } - isDirty |= isPositionDirty || isRotationDirty || isScaleDirty; + bool isDirty = networkState.HasScaleX || networkState.HasScaleY || networkState.HasScaleZ || + networkState.HasRotAngleX || networkState.HasRotAngleY || networkState.HasRotAngleZ || + networkState.HasPositionX || networkState.HasPositionY || networkState.HasPositionZ; if (isDirty) { @@ -352,7 +385,7 @@ internal bool UpdateNetworkStateCheckDirty(ref NetworkState networkState, double } - return (isDirty, isPositionDirty, isRotationDirty, isScaleDirty); + return isDirty; } internal void ApplyNetworkStateFromAuthority(NetworkState networkState) @@ -479,33 +512,55 @@ private void OnNetworkStateChanged(NetworkState oldState, NetworkState newState) if (newState.HasPositionX) { m_PositionXInterpolator.AddMeasurement(newState.PositionX, sentTime); + LocalAuthoritativeNetworkState.PositionX = newState.PositionX; } if (newState.HasPositionY) { m_PositionYInterpolator.AddMeasurement(newState.PositionY, sentTime); + LocalAuthoritativeNetworkState.PositionY = newState.PositionY; } if (newState.HasPositionZ) { m_PositionZInterpolator.AddMeasurement(newState.PositionZ, sentTime); + LocalAuthoritativeNetworkState.PositionZ = newState.PositionZ; + } + + if (newState.HasRotAngleX) + { + m_RotationInterpolator.AddMeasurement(Quaternion.Euler(newState.RotAngleX, LocalAuthoritativeNetworkState.RotAngleY, LocalAuthoritativeNetworkState.RotAngleZ), sentTime); + LocalAuthoritativeNetworkState.RotAngleX = newState.RotAngleX; } - m_RotationInterpolator.AddMeasurement(Quaternion.Euler(newState.Rotation), sentTime); + if (newState.HasRotAngleY) + { + m_RotationInterpolator.AddMeasurement(Quaternion.Euler(LocalAuthoritativeNetworkState.RotAngleX, newState.RotAngleY, LocalAuthoritativeNetworkState.RotAngleZ), sentTime); + LocalAuthoritativeNetworkState.RotAngleY = newState.RotAngleY; + } + + if (newState.HasRotAngleZ) + { + m_RotationInterpolator.AddMeasurement(Quaternion.Euler(LocalAuthoritativeNetworkState.RotAngleX, LocalAuthoritativeNetworkState.RotAngleY, newState.RotAngleZ), sentTime); + LocalAuthoritativeNetworkState.RotAngleZ = newState.RotAngleZ; + } if (newState.HasScaleX) { m_ScaleXInterpolator.AddMeasurement(newState.ScaleX, sentTime); + LocalAuthoritativeNetworkState.ScaleX = newState.ScaleX; } if (newState.HasScaleY) { m_ScaleYInterpolator.AddMeasurement(newState.ScaleY, sentTime); + LocalAuthoritativeNetworkState.ScaleY = newState.ScaleY; } if (newState.HasScaleZ) { m_ScaleZInterpolator.AddMeasurement(newState.ScaleZ, sentTime); + LocalAuthoritativeNetworkState.ScaleZ = newState.ScaleZ; } if (NetworkManager.Singleton.LogLevel == LogLevel.Developer) @@ -519,7 +574,7 @@ private void Awake() { m_Transform = transform; - if (m_AllFloatInterpolators.Count == 0/* && Interpolate*/) + if (m_AllFloatInterpolators.Count == 0) { m_AllFloatInterpolators.Add(m_PositionXInterpolator); m_AllFloatInterpolators.Add(m_PositionYInterpolator); @@ -577,12 +632,14 @@ private void FixedUpdate() // we apply the latest ReplNetworkState again to revert our changes if (!IsServer) { - var oldStateDirtyInfo = UpdateNetworkStateCheckDirtyWithInfo(ref PrevNetworkState, 0); - if (oldStateDirtyInfo.isDirty && !oldStateDirtyInfo.isRotationDirty) + var isDirty = UpdateNetworkStateCheckDirty(ref PrevNetworkState, 0); + bool isRotationDirty = PrevNetworkState.HasRotAngleX || PrevNetworkState.HasRotAngleY || PrevNetworkState.HasRotAngleZ; + if (isDirty && !isRotationDirty) { // ignoring rotation dirty since quaternions will mess with euler angles, making this impossible to determine if the change to a single axis comes // from an unauthorized transform change or euler to quaternion conversion artifacts. - var dirtyField = oldStateDirtyInfo.isPositionDirty ? "position" : "scale"; + var isPositionDirty = PrevNetworkState.HasPositionX || PrevNetworkState.HasPositionY || PrevNetworkState.HasPositionZ; + var dirtyField = isPositionDirty ? "position" : "scale"; Debug.LogWarning($"A local change to {dirtyField} without authority detected, reverting back to latest interpolated network state!", this); ApplyNetworkStateFromAuthority(ReplNetworkState.Value); } From d92cc1e604aae094ef0202b15a029bb242ce3597 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Fri, 10 Sep 2021 15:46:15 -0400 Subject: [PATCH 055/113] reverting back hasXX changes, we still need isDirty checks since hasXX is never set to false (and can't really be for this current iteration) --- .../Prototyping/NetworkTransform.cs | 77 ++++++++----------- 1 file changed, 31 insertions(+), 46 deletions(-) diff --git a/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs b/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs index e19ec2e47e..3ef0871fac 100644 --- a/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs @@ -282,25 +282,28 @@ public void ResetCurrentInterpolatedState() // updates `NetworkState` properties if they need to and returns a `bool` indicating whether or not there was any changes made // returned boolean would be useful to change encapsulating `NetworkVariable`'s dirty state, e.g. ReplNetworkState.SetDirty(isDirty); internal bool UpdateNetworkStateCheckDirty(ref NetworkState networkState, double dirtyTime) + { + return UpdateNetworkStateCheckDirtyWithInfo(ref networkState, dirtyTime).isDirty; + } + + private (bool isDirty, bool isPositionDirty, bool isRotationDirty, bool isScaleDirty) UpdateNetworkStateCheckDirtyWithInfo(ref NetworkState networkState, double dirtyTime) { var position = InLocalSpace ? m_Transform.localPosition : m_Transform.position; var rotAngles = InLocalSpace ? m_Transform.localEulerAngles : m_Transform.eulerAngles; var scale = InLocalSpace ? m_Transform.localScale : m_Transform.lossyScale; - networkState.HasPositionX = false; - networkState.HasPositionY = false; - networkState.HasPositionZ = false; - networkState.HasRotAngleX = false; - networkState.HasRotAngleY = false; - networkState.HasRotAngleZ = false; - networkState.HasScaleX = false; - networkState.HasScaleY = false; - networkState.HasScaleZ = false; + bool isDirty = false; + bool isPositionDirty = false; + bool isRotationDirty = false; + bool isScaleDirty = false; + + // todo come back to using custom isDirty check for checking if we have unauthorized modif client side? if (InLocalSpace != networkState.InLocalSpace) { networkState.InLocalSpace = InLocalSpace; + isDirty = true; } if (SyncPositionX && @@ -309,6 +312,7 @@ internal bool UpdateNetworkStateCheckDirty(ref NetworkState networkState, double { networkState.PositionX = position.x; networkState.HasPositionX = true; + isPositionDirty = true; } if (SyncPositionY && @@ -317,6 +321,7 @@ internal bool UpdateNetworkStateCheckDirty(ref NetworkState networkState, double { networkState.PositionY = position.y; networkState.HasPositionY = true; + isPositionDirty = true; } if (SyncPositionZ && @@ -325,6 +330,7 @@ internal bool UpdateNetworkStateCheckDirty(ref NetworkState networkState, double { networkState.PositionZ = position.z; networkState.HasPositionZ = true; + isPositionDirty = true; } if (SyncRotAngleX && @@ -333,6 +339,7 @@ internal bool UpdateNetworkStateCheckDirty(ref NetworkState networkState, double { networkState.RotAngleX = rotAngles.x; networkState.HasRotAngleX = true; + isRotationDirty = true; } if (SyncRotAngleY && @@ -341,6 +348,7 @@ internal bool UpdateNetworkStateCheckDirty(ref NetworkState networkState, double { networkState.RotAngleY = rotAngles.y; networkState.HasRotAngleY = true; + isRotationDirty = true; } if (SyncRotAngleZ && @@ -349,6 +357,7 @@ internal bool UpdateNetworkStateCheckDirty(ref NetworkState networkState, double { networkState.RotAngleZ = rotAngles.z; networkState.HasRotAngleZ = true; + isRotationDirty = true; } if (SyncScaleX && @@ -357,6 +366,7 @@ internal bool UpdateNetworkStateCheckDirty(ref NetworkState networkState, double { networkState.ScaleX = scale.x; networkState.HasScaleX = true; + isScaleDirty = true; } if (SyncScaleY && @@ -365,6 +375,7 @@ internal bool UpdateNetworkStateCheckDirty(ref NetworkState networkState, double { networkState.ScaleY = scale.y; networkState.HasScaleY = true; + isScaleDirty = true; } if (SyncScaleZ && @@ -373,19 +384,17 @@ internal bool UpdateNetworkStateCheckDirty(ref NetworkState networkState, double { networkState.ScaleZ = scale.z; networkState.HasScaleZ = true; + isScaleDirty = true; } - bool isDirty = networkState.HasScaleX || networkState.HasScaleY || networkState.HasScaleZ || - networkState.HasRotAngleX || networkState.HasRotAngleY || networkState.HasRotAngleZ || - networkState.HasPositionX || networkState.HasPositionY || networkState.HasPositionZ; + isDirty |= isPositionDirty || isRotationDirty || isScaleDirty; if (isDirty) { networkState.SentTime = dirtyTime; } - - return isDirty; + return (isDirty, isPositionDirty, isRotationDirty, isScaleDirty); } internal void ApplyNetworkStateFromAuthority(NetworkState networkState) @@ -512,55 +521,33 @@ private void OnNetworkStateChanged(NetworkState oldState, NetworkState newState) if (newState.HasPositionX) { m_PositionXInterpolator.AddMeasurement(newState.PositionX, sentTime); - LocalAuthoritativeNetworkState.PositionX = newState.PositionX; } if (newState.HasPositionY) { m_PositionYInterpolator.AddMeasurement(newState.PositionY, sentTime); - LocalAuthoritativeNetworkState.PositionY = newState.PositionY; } if (newState.HasPositionZ) { m_PositionZInterpolator.AddMeasurement(newState.PositionZ, sentTime); - LocalAuthoritativeNetworkState.PositionZ = newState.PositionZ; } - if (newState.HasRotAngleX) - { - m_RotationInterpolator.AddMeasurement(Quaternion.Euler(newState.RotAngleX, LocalAuthoritativeNetworkState.RotAngleY, LocalAuthoritativeNetworkState.RotAngleZ), sentTime); - LocalAuthoritativeNetworkState.RotAngleX = newState.RotAngleX; - } - - if (newState.HasRotAngleY) - { - m_RotationInterpolator.AddMeasurement(Quaternion.Euler(LocalAuthoritativeNetworkState.RotAngleX, newState.RotAngleY, LocalAuthoritativeNetworkState.RotAngleZ), sentTime); - LocalAuthoritativeNetworkState.RotAngleY = newState.RotAngleY; - } - - if (newState.HasRotAngleZ) - { - m_RotationInterpolator.AddMeasurement(Quaternion.Euler(LocalAuthoritativeNetworkState.RotAngleX, LocalAuthoritativeNetworkState.RotAngleY, newState.RotAngleZ), sentTime); - LocalAuthoritativeNetworkState.RotAngleZ = newState.RotAngleZ; - } + m_RotationInterpolator.AddMeasurement(Quaternion.Euler(newState.Rotation), sentTime); if (newState.HasScaleX) { m_ScaleXInterpolator.AddMeasurement(newState.ScaleX, sentTime); - LocalAuthoritativeNetworkState.ScaleX = newState.ScaleX; } if (newState.HasScaleY) { m_ScaleYInterpolator.AddMeasurement(newState.ScaleY, sentTime); - LocalAuthoritativeNetworkState.ScaleY = newState.ScaleY; } if (newState.HasScaleZ) { m_ScaleZInterpolator.AddMeasurement(newState.ScaleZ, sentTime); - LocalAuthoritativeNetworkState.ScaleZ = newState.ScaleZ; } if (NetworkManager.Singleton.LogLevel == LogLevel.Developer) @@ -589,7 +576,7 @@ private void Awake() // set initial value for spawn if (IsServer) { - DoUpdateToGhosts(NetworkManager.LocalTime.Time); + DoUpdateToGhosts(); } ReplNetworkState.OnValueChanged += OnNetworkStateChanged; @@ -610,9 +597,9 @@ private void OnDestroy() ReplNetworkState.OnValueChanged -= OnNetworkStateChanged; } - private void DoUpdateToGhosts(double time) + private void DoUpdateToGhosts() { - if (UpdateNetworkStateCheckDirty(ref LocalAuthoritativeNetworkState, time)) + if (UpdateNetworkStateCheckDirty(ref LocalAuthoritativeNetworkState, NetworkManager.LocalTime.Time)) { ReplNetworkState.Value = LocalAuthoritativeNetworkState; ReplNetworkState.SetDirty(true); @@ -632,14 +619,12 @@ private void FixedUpdate() // we apply the latest ReplNetworkState again to revert our changes if (!IsServer) { - var isDirty = UpdateNetworkStateCheckDirty(ref PrevNetworkState, 0); - bool isRotationDirty = PrevNetworkState.HasRotAngleX || PrevNetworkState.HasRotAngleY || PrevNetworkState.HasRotAngleZ; - if (isDirty && !isRotationDirty) + var oldStateDirtyInfo = UpdateNetworkStateCheckDirtyWithInfo(ref PrevNetworkState, 0); + if (oldStateDirtyInfo.isDirty && !oldStateDirtyInfo.isRotationDirty) { // ignoring rotation dirty since quaternions will mess with euler angles, making this impossible to determine if the change to a single axis comes // from an unauthorized transform change or euler to quaternion conversion artifacts. - var isPositionDirty = PrevNetworkState.HasPositionX || PrevNetworkState.HasPositionY || PrevNetworkState.HasPositionZ; - var dirtyField = isPositionDirty ? "position" : "scale"; + var dirtyField = oldStateDirtyInfo.isPositionDirty ? "position" : "scale"; Debug.LogWarning($"A local change to {dirtyField} without authority detected, reverting back to latest interpolated network state!", this); ApplyNetworkStateFromAuthority(ReplNetworkState.Value); } @@ -655,7 +640,7 @@ private void Update() if (IsServer) { - DoUpdateToGhosts(NetworkManager.LocalTime.Time); + DoUpdateToGhosts(); } // apply interpolated value From 33751fe615760433b7138e688b10e88e9b25865a Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Fri, 10 Sep 2021 19:37:37 -0400 Subject: [PATCH 056/113] using "SyncXX" instead of "HasXX". HasXX is never reset to false and is set to true only in certain situations. If a default value is used (for example posZ is set to 0 on spawn) hasPosZ will be false, even if we do want to apply it's value because we sync it. --- .../Prototyping/NetworkTransform.cs | 24 +++++++++---------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs b/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs index 3ef0871fac..3315e9381b 100644 --- a/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs @@ -297,8 +297,7 @@ internal bool UpdateNetworkStateCheckDirty(ref NetworkState networkState, double bool isRotationDirty = false; bool isScaleDirty = false; - - // todo come back to using custom isDirty check for checking if we have unauthorized modif client side? + // hasPositionZ set to false when it should be true? if (InLocalSpace != networkState.InLocalSpace) { @@ -408,48 +407,48 @@ internal void ApplyNetworkStateFromAuthority(NetworkState networkState) // InLocalSpace Read InLocalSpace = networkState.InLocalSpace; // Position Read - if (networkState.HasPositionX) + if (SyncPositionX) { interpolatedPosition.x = Interpolate ? m_PositionXInterpolator.GetInterpolatedValue() : networkState.Position.x; } - if (networkState.HasPositionY) + if (SyncPositionY) { interpolatedPosition.y = Interpolate ? m_PositionYInterpolator.GetInterpolatedValue() : networkState.Position.y; } - if (networkState.HasPositionZ) + if (SyncPositionZ) { interpolatedPosition.z = Interpolate ? m_PositionZInterpolator.GetInterpolatedValue() : networkState.Position.z; } - if (networkState.HasRotAngleX) + if (SyncRotAngleX) { interpolatedRotAngles.x = Interpolate ? m_RotationInterpolator.GetInterpolatedValue().eulerAngles.x : networkState.Rotation.x; } - if (networkState.HasRotAngleY) + if (SyncRotAngleY) { interpolatedRotAngles.y = Interpolate ? m_RotationInterpolator.GetInterpolatedValue().eulerAngles.y : networkState.Rotation.y; } - if (networkState.HasRotAngleZ) + if (SyncRotAngleZ) { interpolatedRotAngles.z = Interpolate ? m_RotationInterpolator.GetInterpolatedValue().eulerAngles.z : networkState.Rotation.z; } // Scale Read - if (networkState.HasScaleX) + if (SyncScaleX) { interpolatedScale.x = Interpolate ? m_ScaleXInterpolator.GetInterpolatedValue() : networkState.Scale.x; } - if (networkState.HasScaleY) + if (SyncScaleY) { interpolatedScale.y = Interpolate ? m_ScaleYInterpolator.GetInterpolatedValue() : networkState.Scale.y; } - if (networkState.HasScaleZ) + if (SyncScaleZ) { interpolatedScale.z = Interpolate ? m_ScaleZInterpolator.GetInterpolatedValue() : networkState.Scale.z; } @@ -613,14 +612,13 @@ private void FixedUpdate() return; } - // try to update previously consumed NetworkState // if we have any changes, that means made some updates locally // we apply the latest ReplNetworkState again to revert our changes if (!IsServer) { var oldStateDirtyInfo = UpdateNetworkStateCheckDirtyWithInfo(ref PrevNetworkState, 0); - if (oldStateDirtyInfo.isDirty && !oldStateDirtyInfo.isRotationDirty) + if (oldStateDirtyInfo.isPositionDirty || oldStateDirtyInfo.isScaleDirty || (oldStateDirtyInfo.isRotationDirty && SyncRotAngleX && SyncRotAngleY && SyncRotAngleZ)) { // ignoring rotation dirty since quaternions will mess with euler angles, making this impossible to determine if the change to a single axis comes // from an unauthorized transform change or euler to quaternion conversion artifacts. From 93e8be7b57d159b38b2c15868d61c863f7712bd7 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Fri, 10 Sep 2021 19:50:01 -0400 Subject: [PATCH 057/113] fixing issue where we needed to do a first movement to get over network state initial values and to get per axis syncing properly --- .../Prototyping/NetworkTransform.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs b/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs index 3315e9381b..5066f3f5f9 100644 --- a/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Prototyping/NetworkTransform.cs @@ -454,7 +454,7 @@ internal void ApplyNetworkStateFromAuthority(NetworkState networkState) } // Position Apply - if (networkState.HasPositionX || networkState.HasPositionY || networkState.HasPositionZ) + if (SyncPositionX || SyncPositionY || SyncPositionZ) { if (InLocalSpace) { @@ -469,7 +469,7 @@ internal void ApplyNetworkStateFromAuthority(NetworkState networkState) } // RotAngles Apply - if (networkState.HasRotAngleX || networkState.HasRotAngleY || networkState.HasRotAngleZ) + if (SyncRotAngleX || SyncRotAngleY || SyncRotAngleZ) { if (InLocalSpace) { @@ -484,7 +484,7 @@ internal void ApplyNetworkStateFromAuthority(NetworkState networkState) } // Scale Apply - if (networkState.HasScaleX || networkState.HasScaleY || networkState.HasScaleZ) + if (SyncScaleX || SyncScaleY || SyncScaleZ) { if (InLocalSpace) { @@ -622,7 +622,7 @@ private void FixedUpdate() { // ignoring rotation dirty since quaternions will mess with euler angles, making this impossible to determine if the change to a single axis comes // from an unauthorized transform change or euler to quaternion conversion artifacts. - var dirtyField = oldStateDirtyInfo.isPositionDirty ? "position" : "scale"; + var dirtyField = oldStateDirtyInfo.isPositionDirty ? "position" : oldStateDirtyInfo.isRotationDirty ? "rotation" : "scale"; Debug.LogWarning($"A local change to {dirtyField} without authority detected, reverting back to latest interpolated network state!", this); ApplyNetworkStateFromAuthority(ReplNetworkState.Value); } From f2078203c837b5be4eb892343c68794b60de259f Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Mon, 13 Sep 2021 09:34:53 -0400 Subject: [PATCH 058/113] updating zoosam with latest changes --- testproject/Assets/Scenes/ZooSam.unity | 107 +++++++++++++++++++++---- 1 file changed, 93 insertions(+), 14 deletions(-) diff --git a/testproject/Assets/Scenes/ZooSam.unity b/testproject/Assets/Scenes/ZooSam.unity index 4cec43f1f1..c8c284a60f 100644 --- a/testproject/Assets/Scenes/ZooSam.unity +++ b/testproject/Assets/Scenes/ZooSam.unity @@ -1225,9 +1225,8 @@ MonoBehaviour: RotAngleThreshold: 0 ScaleThreshold: 0 InLocalSpace: 1 - Interpolate: 0 + Interpolate: 1 FixedSendsPerSecond: 50 - UseFixedUpdate: 1 --- !u!114 &108150026 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1335,7 +1334,7 @@ Transform: m_Children: - {fileID: 153211162} m_Father: {fileID: 0} - m_RootOrder: 10 + m_RootOrder: 11 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &110121429 GameObject: @@ -3401,7 +3400,6 @@ MonoBehaviour: InLocalSpace: 0 Interpolate: 1 FixedSendsPerSecond: 30 - UseFixedUpdate: 1 --- !u!114 &240282451 MonoBehaviour: m_ObjectHideFlags: 0 @@ -3509,7 +3507,7 @@ Transform: m_Children: - {fileID: 1551181949} m_Father: {fileID: 0} - m_RootOrder: 8 + m_RootOrder: 9 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &250510712 GameObject: @@ -4180,7 +4178,7 @@ Transform: m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 5 + m_RootOrder: 6 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &351881178 GameObject: @@ -6816,7 +6814,7 @@ MonoBehaviour: LogLevel: 1 NetworkConfig: ProtocolVersion: 0 - NetworkTransport: {fileID: 620561613} + NetworkTransport: {fileID: 620561610} PlayerPrefab: {fileID: 4700706668509470175, guid: 7eeaaf9e50c0afc4dab93584a54fb0d6, type: 3} NetworkPrefabs: [] @@ -7943,7 +7941,7 @@ Transform: m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 7 + m_RootOrder: 8 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &674940303 GameObject: @@ -8078,7 +8076,7 @@ MonoBehaviour: m_MoveSpeed: 5 m_RotationSpeed: 30 m_RunServerOnly: 1 - m_RunInUpdate: 1 + m_RunInUpdate: 0 --- !u!114 &678326394 MonoBehaviour: m_ObjectHideFlags: 0 @@ -8122,7 +8120,6 @@ MonoBehaviour: InLocalSpace: 1 Interpolate: 1 FixedSendsPerSecond: 50 - UseFixedUpdate: 1 --- !u!65 &678326396 BoxCollider: m_ObjectHideFlags: 0 @@ -8199,7 +8196,7 @@ Transform: - {fileID: 702051986} - {fileID: 36747677} m_Father: {fileID: 0} - m_RootOrder: 4 + m_RootOrder: 5 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &680150732 GameObject: @@ -8393,6 +8390,89 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 687753481} m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &693991909 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 693991912} + - component: {fileID: 693991911} + - component: {fileID: 693991910} + m_Layer: 0 + m_Name: Camera (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &693991910 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 693991909} + m_Enabled: 1 +--- !u!20 &693991911 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 693991909} + 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: 0 + 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 &693991912 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 693991909} + m_LocalRotation: {x: 0.5, y: -0, z: -0, w: 0.8660254} + m_LocalPosition: {x: 0, y: 20, z: -16} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 60, y: 0, z: 0} --- !u!1 &695189437 GameObject: m_ObjectHideFlags: 0 @@ -9333,7 +9413,7 @@ Transform: - {fileID: 398540133} - {fileID: 1399839515} m_Father: {fileID: 0} - m_RootOrder: 6 + m_RootOrder: 7 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &731245575 GameObject: @@ -25049,7 +25129,6 @@ MonoBehaviour: InLocalSpace: 0 Interpolate: 1 FixedSendsPerSecond: 50 - UseFixedUpdate: 1 --- !u!114 &1934616766 MonoBehaviour: m_ObjectHideFlags: 0 @@ -25142,7 +25221,7 @@ Transform: - {fileID: 557794668} - {fileID: 491088867} m_Father: {fileID: 0} - m_RootOrder: 9 + m_RootOrder: 10 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1949195315 GameObject: From ee5b308b128376b0ddf248a0dcc8c0d17fcec509 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Mon, 13 Sep 2021 09:34:53 -0400 Subject: [PATCH 059/113] updating zoosam with latest changes --- testproject/Assets/Scenes/ZooSam.unity | 107 +++++++++++++++--- .../ProjectSettings/EditorBuildSettings.asset | 6 +- 2 files changed, 96 insertions(+), 17 deletions(-) diff --git a/testproject/Assets/Scenes/ZooSam.unity b/testproject/Assets/Scenes/ZooSam.unity index 4cec43f1f1..c8c284a60f 100644 --- a/testproject/Assets/Scenes/ZooSam.unity +++ b/testproject/Assets/Scenes/ZooSam.unity @@ -1225,9 +1225,8 @@ MonoBehaviour: RotAngleThreshold: 0 ScaleThreshold: 0 InLocalSpace: 1 - Interpolate: 0 + Interpolate: 1 FixedSendsPerSecond: 50 - UseFixedUpdate: 1 --- !u!114 &108150026 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1335,7 +1334,7 @@ Transform: m_Children: - {fileID: 153211162} m_Father: {fileID: 0} - m_RootOrder: 10 + m_RootOrder: 11 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &110121429 GameObject: @@ -3401,7 +3400,6 @@ MonoBehaviour: InLocalSpace: 0 Interpolate: 1 FixedSendsPerSecond: 30 - UseFixedUpdate: 1 --- !u!114 &240282451 MonoBehaviour: m_ObjectHideFlags: 0 @@ -3509,7 +3507,7 @@ Transform: m_Children: - {fileID: 1551181949} m_Father: {fileID: 0} - m_RootOrder: 8 + m_RootOrder: 9 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &250510712 GameObject: @@ -4180,7 +4178,7 @@ Transform: m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 5 + m_RootOrder: 6 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &351881178 GameObject: @@ -6816,7 +6814,7 @@ MonoBehaviour: LogLevel: 1 NetworkConfig: ProtocolVersion: 0 - NetworkTransport: {fileID: 620561613} + NetworkTransport: {fileID: 620561610} PlayerPrefab: {fileID: 4700706668509470175, guid: 7eeaaf9e50c0afc4dab93584a54fb0d6, type: 3} NetworkPrefabs: [] @@ -7943,7 +7941,7 @@ Transform: m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 7 + m_RootOrder: 8 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &674940303 GameObject: @@ -8078,7 +8076,7 @@ MonoBehaviour: m_MoveSpeed: 5 m_RotationSpeed: 30 m_RunServerOnly: 1 - m_RunInUpdate: 1 + m_RunInUpdate: 0 --- !u!114 &678326394 MonoBehaviour: m_ObjectHideFlags: 0 @@ -8122,7 +8120,6 @@ MonoBehaviour: InLocalSpace: 1 Interpolate: 1 FixedSendsPerSecond: 50 - UseFixedUpdate: 1 --- !u!65 &678326396 BoxCollider: m_ObjectHideFlags: 0 @@ -8199,7 +8196,7 @@ Transform: - {fileID: 702051986} - {fileID: 36747677} m_Father: {fileID: 0} - m_RootOrder: 4 + m_RootOrder: 5 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &680150732 GameObject: @@ -8393,6 +8390,89 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 687753481} m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &693991909 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 693991912} + - component: {fileID: 693991911} + - component: {fileID: 693991910} + m_Layer: 0 + m_Name: Camera (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &693991910 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 693991909} + m_Enabled: 1 +--- !u!20 &693991911 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 693991909} + 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: 0 + 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 &693991912 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 693991909} + m_LocalRotation: {x: 0.5, y: -0, z: -0, w: 0.8660254} + m_LocalPosition: {x: 0, y: 20, z: -16} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 60, y: 0, z: 0} --- !u!1 &695189437 GameObject: m_ObjectHideFlags: 0 @@ -9333,7 +9413,7 @@ Transform: - {fileID: 398540133} - {fileID: 1399839515} m_Father: {fileID: 0} - m_RootOrder: 6 + m_RootOrder: 7 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &731245575 GameObject: @@ -25049,7 +25129,6 @@ MonoBehaviour: InLocalSpace: 0 Interpolate: 1 FixedSendsPerSecond: 50 - UseFixedUpdate: 1 --- !u!114 &1934616766 MonoBehaviour: m_ObjectHideFlags: 0 @@ -25142,7 +25221,7 @@ Transform: - {fileID: 557794668} - {fileID: 491088867} m_Father: {fileID: 0} - m_RootOrder: 9 + m_RootOrder: 10 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1949195315 GameObject: diff --git a/testproject/ProjectSettings/EditorBuildSettings.asset b/testproject/ProjectSettings/EditorBuildSettings.asset index e03fd43770..47e80671ee 100644 --- a/testproject/ProjectSettings/EditorBuildSettings.asset +++ b/testproject/ProjectSettings/EditorBuildSettings.asset @@ -5,12 +5,12 @@ EditorBuildSettings: m_ObjectHideFlags: 0 serializedVersion: 2 m_Scenes: - - enabled: 1 - path: Assets/MainMenu.unity - guid: 21c7fd68cda9dd9488fc0cc01f885e39 - enabled: 1 path: Assets/Scenes/ZooSam.unity guid: 4683469c9a191411fbda5e426765b2fc + - enabled: 1 + path: Assets/MainMenu.unity + guid: 21c7fd68cda9dd9488fc0cc01f885e39 - enabled: 1 path: Assets/Samples/SamplesMenu.unity guid: 037562c9b1a469f498dfb34256ddf86f From 7dfecfd673093e095ae96501e68880f56bf8ebac Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Mon, 13 Sep 2021 10:18:03 -0400 Subject: [PATCH 060/113] fixing bad ref --- .../Tests/Editor/com.unity.netcode.editortests.asmdef | 2 +- testproject/Assets/Scenes/ZooSam.unity | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/com.unity.netcode.gameobjects/Tests/Editor/com.unity.netcode.editortests.asmdef b/com.unity.netcode.gameobjects/Tests/Editor/com.unity.netcode.editortests.asmdef index 4cb7b05b21..205383573a 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/com.unity.netcode.editortests.asmdef +++ b/com.unity.netcode.gameobjects/Tests/Editor/com.unity.netcode.editortests.asmdef @@ -4,7 +4,7 @@ "references": [ "Unity.Netcode.Runtime", "Unity.Netcode.Editor", - "Unity.Netcode.Prototyping", + "Unity.Netcode.Components", "Unity.Multiplayer.MetricTypes", "Unity.Multiplayer.NetStats" ], diff --git a/testproject/Assets/Scenes/ZooSam.unity b/testproject/Assets/Scenes/ZooSam.unity index c8c284a60f..2b5074dd13 100644 --- a/testproject/Assets/Scenes/ZooSam.unity +++ b/testproject/Assets/Scenes/ZooSam.unity @@ -6795,7 +6795,6 @@ MonoBehaviour: ConnectAddress: 127.0.0.1 ConnectPort: 7777 ServerListenPort: 7777 - Channels: [] MessageSendMode: 0 --- !u!114 &620561611 MonoBehaviour: @@ -6814,7 +6813,7 @@ MonoBehaviour: LogLevel: 1 NetworkConfig: ProtocolVersion: 0 - NetworkTransport: {fileID: 620561610} + NetworkTransport: {fileID: 620561613} PlayerPrefab: {fileID: 4700706668509470175, guid: 7eeaaf9e50c0afc4dab93584a54fb0d6, type: 3} NetworkPrefabs: [] @@ -6866,7 +6865,6 @@ MonoBehaviour: DisconnectTimeout: 5 ReconnectDelay: 0.5 MaxConnectAttempts: 10 - channels: [] MessageBufferSize: 5120 SimulatePacketLossChance: 0 SimulateMinLatency: 70 From 4fb11ac66de1f37de16fe1753387220848fdcf01 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Mon, 13 Sep 2021 11:23:52 -0400 Subject: [PATCH 061/113] work in progress for client network transform, still some issues with tests not having access to stuff anymore --- .../Components/NetworkTransform.cs | 36 +++++---- .../Scripts/ClientNetworkTransform.cs | 22 +++++- .../NetworkTransformStateTests.cs | 75 +++++++++++-------- testproject/Assets/Scenes/ZooSam.unity | 45 ++++++++++- 4 files changed, 128 insertions(+), 50 deletions(-) diff --git a/com.unity.netcode.gameobjects/Components/NetworkTransform.cs b/com.unity.netcode.gameobjects/Components/NetworkTransform.cs index d5baeb3204..1d27291bc3 100644 --- a/com.unity.netcode.gameobjects/Components/NetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Components/NetworkTransform.cs @@ -12,7 +12,7 @@ namespace Unity.Netcode.Components [DefaultExecutionOrder(1000)] // this is needed to catch the update time after the transform was updated by user scripts public class NetworkTransform : NetworkBehaviour { - internal struct NetworkState : INetworkSerializable + protected struct NetworkState : INetworkSerializable { internal const int InLocalSpaceBit = 0; internal const int PositionXBit = 1; @@ -262,9 +262,11 @@ public void NetworkSerialize(NetworkSerializer serializer) private Transform m_Transform; // cache the transform component to reduce unnecessary bounce between managed and native - internal readonly NetworkVariable ReplNetworkState = new NetworkVariable(new NetworkState()); - internal NetworkState PrevNetworkState; - internal NetworkState LocalAuthoritativeNetworkState; + protected readonly NetworkVariable ReplNetworkState = new NetworkVariable(new NetworkState()); + protected NetworkState PrevNetworkState; + protected NetworkState LocalAuthoritativeNetworkState; + + protected virtual bool CanWriteToTransform => IsServer; public void ResetCurrentInterpolatedState() { @@ -281,7 +283,7 @@ public void ResetCurrentInterpolatedState() // updates `NetworkState` properties if they need to and returns a `bool` indicating whether or not there was any changes made // returned boolean would be useful to change encapsulating `NetworkVariable`'s dirty state, e.g. ReplNetworkState.SetDirty(isDirty); - internal bool UpdateNetworkStateCheckDirty(ref NetworkState networkState, double dirtyTime) + protected bool UpdateNetworkStateCheckDirty(ref NetworkState networkState, double dirtyTime) { return UpdateNetworkStateCheckDirtyWithInfo(ref networkState, dirtyTime).isDirty; } @@ -396,7 +398,7 @@ internal bool UpdateNetworkStateCheckDirty(ref NetworkState networkState, double return (isDirty, isPositionDirty, isRotationDirty, isScaleDirty); } - internal void ApplyNetworkStateFromAuthority(NetworkState networkState) + protected void ApplyNetworkStateFromAuthority(NetworkState networkState) { PrevNetworkState = networkState; @@ -510,9 +512,10 @@ private void OnNetworkStateChanged(NetworkState oldState, NetworkState newState) return; } - if (IsServer) + if (CanWriteToTransform) { - return; // todo use authority + // we're the authority, we ignore incoming changes + return; } var sentTime = new NetworkTime(NetworkManager.Singleton.ServerTime.TickRate, newState.SentTime); @@ -573,7 +576,7 @@ private void Awake() // ReplNetworkState.NetworkVariableChannel = NetworkChannel.PositionUpdate; // todo figure this out, talk with Matt/Fatih, this should be unreliable // set initial value for spawn - if (IsServer) + if (CanWriteToTransform) { DoUpdateToGhosts(); } @@ -583,7 +586,7 @@ private void Awake() public override void OnNetworkSpawn() { - if (!IsServer) + if (!CanWriteToTransform) { ResetCurrentInterpolatedState(); // useful for late joining @@ -596,7 +599,12 @@ private void OnDestroy() ReplNetworkState.OnValueChanged -= OnNetworkStateChanged; } - private void DoUpdateToGhosts() + protected virtual void DoUpdateToGhosts() + { + UpdateNetworkVariable(); + } + + protected void UpdateNetworkVariable() { if (UpdateNetworkStateCheckDirty(ref LocalAuthoritativeNetworkState, NetworkManager.LocalTime.Time)) { @@ -615,7 +623,7 @@ private void FixedUpdate() // try to update previously consumed NetworkState // if we have any changes, that means made some updates locally // we apply the latest ReplNetworkState again to revert our changes - if (!IsServer) + if (!CanWriteToTransform) { var oldStateDirtyInfo = UpdateNetworkStateCheckDirtyWithInfo(ref PrevNetworkState, 0); if (oldStateDirtyInfo.isPositionDirty || oldStateDirtyInfo.isScaleDirty || (oldStateDirtyInfo.isRotationDirty && SyncRotAngleX && SyncRotAngleY && SyncRotAngleZ)) @@ -636,13 +644,13 @@ private void Update() return; } - if (IsServer) + if (CanWriteToTransform) { DoUpdateToGhosts(); } // apply interpolated value - if (!IsServer && (NetworkManager.Singleton.IsConnectedClient || NetworkManager.Singleton.IsListening)) + if (!CanWriteToTransform && (NetworkManager.Singleton.IsConnectedClient || NetworkManager.Singleton.IsListening)) { foreach (var interpolator in m_AllFloatInterpolators) { diff --git a/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs b/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs index d4feec6548..17830f027f 100644 --- a/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs @@ -4,6 +4,26 @@ namespace Unity.Netcode.Samples { public class ClientNetworkTransform : NetworkTransform { - // todo + protected override bool CanWriteToTransform => IsClient && IsOwner; + + protected override void DoUpdateToGhosts() + { + if (UpdateNetworkStateCheckDirty(ref LocalAuthoritativeNetworkState, NetworkManager.LocalTime.Time)) + { + SubmitNetworkStateServerRpc(LocalAuthoritativeNetworkState); + } + } + + [ServerRpc] + private void SubmitNetworkStateServerRpc(NetworkState networkState) + { + LocalAuthoritativeNetworkState = networkState; + + // as a server, apply whatever networkstate owner client sent to us, to make NetworkTransform move locally on the server + ApplyNetworkStateFromAuthority(networkState); + + // as a server, update netvar to cause it to be replicated down to other non-owner clients + UpdateNetworkVariable(); + } } } diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/NetworkTransformStateTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/NetworkTransformStateTests.cs index e06045a1fd..a8494aee73 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/NetworkTransformStateTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/NetworkTransformStateTests.cs @@ -6,6 +6,15 @@ namespace Unity.Netcode.RuntimeTests { public class NetworkTransformStateTests { + private class TestNetworkTransform : NetworkTransform + { + // needed to test protected methods + public bool ExposedUpdateNetworkStateCheckDirty(ref NetworkState networkState, double dirtyTime) + { + return UpdateNetworkStateCheckDirty(ref networkState, dirtyTime); + } + } + [Test] public void TestSyncAxes( [Values] bool inLocalSpace, @@ -15,7 +24,7 @@ public void TestSyncAxes( { var gameObject = new GameObject($"Test-{nameof(NetworkTransformStateTests)}.{nameof(TestSyncAxes)}"); var networkObject = gameObject.AddComponent(); - var networkTransform = gameObject.AddComponent(); + var networkTransform = gameObject.AddComponent(); networkTransform.enabled = false; // do not tick `FixedUpdate()` or `Update()` var initialPosition = Vector3.zero; @@ -36,7 +45,7 @@ public void TestSyncAxes( networkTransform.SyncScaleZ = syncScaZ; networkTransform.InLocalSpace = inLocalSpace; - var networkTransformState = new NetworkTransform.NetworkState + var networkTransformState = new TestNetworkTransform.NetworkState { PositionX = initialPosition.x, PositionY = initialPosition.y, @@ -67,7 +76,7 @@ public void TestSyncAxes( if (syncPosX || syncPosY || syncPosZ || syncRotX || syncRotY || syncRotZ || syncScaX || syncScaY || syncScaZ) { - Assert.IsTrue(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsTrue(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); } } @@ -84,7 +93,7 @@ public void TestSyncAxes( position.x++; networkTransform.transform.position = position; - Assert.IsFalse(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsFalse(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); } // SyncPositionY { @@ -93,7 +102,7 @@ public void TestSyncAxes( position.y++; networkTransform.transform.position = position; - Assert.IsFalse(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsFalse(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); } // SyncPositionZ { @@ -102,7 +111,7 @@ public void TestSyncAxes( position.z++; networkTransform.transform.position = position; - Assert.IsFalse(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsFalse(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); } // SyncRotAngleX @@ -112,7 +121,7 @@ public void TestSyncAxes( rotAngles.x++; networkTransform.transform.eulerAngles = rotAngles; - Assert.IsFalse(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsFalse(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); } // SyncRotAngleY { @@ -121,7 +130,7 @@ public void TestSyncAxes( rotAngles.y++; networkTransform.transform.eulerAngles = rotAngles; - Assert.IsFalse(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsFalse(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); } // SyncRotAngleZ { @@ -130,7 +139,7 @@ public void TestSyncAxes( rotAngles.z++; networkTransform.transform.eulerAngles = rotAngles; - Assert.IsFalse(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsFalse(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); } // SyncScaleX @@ -140,7 +149,7 @@ public void TestSyncAxes( scale.x++; networkTransform.transform.localScale = scale; - Assert.IsFalse(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsFalse(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); } // SyncScaleY { @@ -149,7 +158,7 @@ public void TestSyncAxes( scale.y++; networkTransform.transform.localScale = scale; - Assert.IsFalse(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsFalse(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); } // SyncScaleZ { @@ -158,7 +167,7 @@ public void TestSyncAxes( scale.z++; networkTransform.transform.localScale = scale; - Assert.IsFalse(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsFalse(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); } } @@ -174,7 +183,7 @@ public void TestThresholds( { var gameObject = new GameObject($"Test-{nameof(NetworkTransformStateTests)}.{nameof(TestThresholds)}"); var networkObject = gameObject.AddComponent(); - var networkTransform = gameObject.AddComponent(); + var networkTransform = gameObject.AddComponent(); networkTransform.enabled = false; // do not tick `FixedUpdate()` or `Update()` var initialPosition = Vector3.zero; @@ -198,7 +207,7 @@ public void TestThresholds( networkTransform.RotAngleThreshold = rotAngleThreshold; networkTransform.ScaleThreshold = scaleThreshold; - var networkTransformState = new NetworkTransform.NetworkState + var networkTransformState = new TestNetworkTransform.NetworkState { PositionX = initialPosition.x, PositionY = initialPosition.y, @@ -218,7 +227,7 @@ public void TestThresholds( networkTransform.transform.eulerAngles = new Vector3(30, 45, 90); networkTransform.transform.localScale = new Vector3(1.1f, 0.5f, 2.5f); - Assert.IsTrue(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsTrue(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); } // Step 2: make changes below and above thresholds @@ -234,33 +243,33 @@ public void TestThresholds( { position.x += positionThreshold / 2; networkTransform.transform.position = position; - Assert.IsFalse(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsFalse(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); position.x += positionThreshold * 2; networkTransform.transform.position = position; - Assert.IsTrue(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsTrue(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); } // PositionY { position.y += positionThreshold / 2; networkTransform.transform.position = position; - Assert.IsFalse(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsFalse(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); position.y += positionThreshold * 2; networkTransform.transform.position = position; - Assert.IsTrue(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsTrue(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); } // PositionZ { position.z += positionThreshold / 2; networkTransform.transform.position = position; - Assert.IsFalse(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsFalse(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); position.z += positionThreshold * 2; networkTransform.transform.position = position; - Assert.IsTrue(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsTrue(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); } } @@ -273,33 +282,33 @@ public void TestThresholds( { rotAngles.x += rotAngleThreshold / 2; networkTransform.transform.eulerAngles = rotAngles; - Assert.IsFalse(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsFalse(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); rotAngles.x += rotAngleThreshold * 2; networkTransform.transform.eulerAngles = rotAngles; - Assert.IsTrue(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsTrue(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); } // RotAngleY { rotAngles.y += rotAngleThreshold / 2; networkTransform.transform.eulerAngles = rotAngles; - Assert.IsFalse(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsFalse(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); rotAngles.y += rotAngleThreshold * 2; networkTransform.transform.eulerAngles = rotAngles; - Assert.IsTrue(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsTrue(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); } // RotAngleZ { rotAngles.z += rotAngleThreshold / 2; networkTransform.transform.eulerAngles = rotAngles; - Assert.IsFalse(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsFalse(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); rotAngles.z += rotAngleThreshold * 2; networkTransform.transform.eulerAngles = rotAngles; - Assert.IsTrue(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsTrue(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); } } @@ -312,33 +321,33 @@ public void TestThresholds( { scale.x += scaleThreshold / 2; networkTransform.transform.localScale = scale; - Assert.IsFalse(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsFalse(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); scale.x += scaleThreshold * 2; networkTransform.transform.localScale = scale; - Assert.IsTrue(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsTrue(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); } // ScaleY { scale.y += scaleThreshold / 2; networkTransform.transform.localScale = scale; - Assert.IsFalse(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsFalse(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); scale.y += scaleThreshold * 2; networkTransform.transform.localScale = scale; - Assert.IsTrue(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsTrue(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); } // ScaleZ { scale.z += scaleThreshold / 2; networkTransform.transform.localScale = scale; - Assert.IsFalse(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsFalse(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); scale.z += scaleThreshold * 2; networkTransform.transform.localScale = scale; - Assert.IsTrue(networkTransform.UpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsTrue(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); } } } diff --git a/testproject/Assets/Scenes/ZooSam.unity b/testproject/Assets/Scenes/ZooSam.unity index 2b5074dd13..ae7e79cd73 100644 --- a/testproject/Assets/Scenes/ZooSam.unity +++ b/testproject/Assets/Scenes/ZooSam.unity @@ -1193,6 +1193,8 @@ GameObject: - component: {fileID: 108150027} - component: {fileID: 108150026} - component: {fileID: 108150025} + - component: {fileID: 108150032} + - component: {fileID: 108150033} m_Layer: 0 m_Name: NetworkTransformBuffered (2) m_TagString: Untagged @@ -1207,7 +1209,7 @@ MonoBehaviour: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 108150024} - m_Enabled: 1 + m_Enabled: 0 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3} m_Name: @@ -1336,6 +1338,45 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 11 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &108150032 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 108150024} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 54c9647dc784a46bca664910f182491e, type: 3} + m_Name: + m_EditorClassIdentifier: + SyncPositionX: 1 + SyncPositionY: 1 + SyncPositionZ: 1 + SyncRotAngleX: 1 + SyncRotAngleY: 1 + SyncRotAngleZ: 1 + SyncScaleX: 1 + SyncScaleY: 1 + SyncScaleZ: 1 + PositionThreshold: 0 + RotAngleThreshold: 0 + ScaleThreshold: 0 + InLocalSpace: 0 + Interpolate: 1 + FixedSendsPerSecond: 30 +--- !u!114 &108150033 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 108150024} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e6aa2a85582344e32ac05a32f869a764, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1 &110121429 GameObject: m_ObjectHideFlags: 0 @@ -8058,7 +8099,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!114 &678326393 MonoBehaviour: m_ObjectHideFlags: 0 From 3167e520186807a9be6facc55003959e945085a6 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Mon, 13 Sep 2021 11:25:16 -0400 Subject: [PATCH 062/113] restricting access to buffered interpolator --- com.unity.netcode.gameobjects/Components/Interpolator.meta | 2 +- .../Components/Interpolator/BufferedLinearInterpolator.cs | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/com.unity.netcode.gameobjects/Components/Interpolator.meta b/com.unity.netcode.gameobjects/Components/Interpolator.meta index 0bfe5f770f..9f11f71626 100644 --- a/com.unity.netcode.gameobjects/Components/Interpolator.meta +++ b/com.unity.netcode.gameobjects/Components/Interpolator.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 32190d476d5de4dc8b7ee8208bde82a0 +guid: eea326f149a9947ff9c89d0374e7b524 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/com.unity.netcode.gameobjects/Components/Interpolator/BufferedLinearInterpolator.cs b/com.unity.netcode.gameobjects/Components/Interpolator/BufferedLinearInterpolator.cs index 6a5ab0f896..221958df36 100644 --- a/com.unity.netcode.gameobjects/Components/Interpolator/BufferedLinearInterpolator.cs +++ b/com.unity.netcode.gameobjects/Components/Interpolator/BufferedLinearInterpolator.cs @@ -9,7 +9,7 @@ namespace Unity.Netcode /// Partially solves for message loss. Unclamped lerping helps hide this, but not completely /// /// - public abstract class BufferedLinearInterpolator where T : struct + internal abstract class BufferedLinearInterpolator where T : struct { // interface for mock testing, abstracting away external systems public interface IInterpolatorTime @@ -177,7 +177,7 @@ public T GetInterpolatedValue() // protected abstract SimpleInterpolator SimpleInterpolator { get; } } - public class BufferedLinearInterpolatorFloat : BufferedLinearInterpolator + internal class BufferedLinearInterpolatorFloat : BufferedLinearInterpolator { protected override float InterpolateUnclamped(float start, float end, float time) { @@ -192,7 +192,7 @@ protected override float Interpolate(float start, float end, float time) // protected override SimpleInterpolator SimpleInterpolator { get; } = new SimpleInterpolatorFloat(); } - public class BufferedLinearInterpolatorQuaternion : BufferedLinearInterpolator + internal class BufferedLinearInterpolatorQuaternion : BufferedLinearInterpolator { protected override Quaternion InterpolateUnclamped(Quaternion start, Quaternion end, float time) { From 8845a594b7643163a2b3ce143715ce13a9c9c9a3 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Mon, 13 Sep 2021 11:32:09 -0400 Subject: [PATCH 063/113] adding jira to todo --- com.unity.netcode.gameobjects/Components/NetworkTransform.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.netcode.gameobjects/Components/NetworkTransform.cs b/com.unity.netcode.gameobjects/Components/NetworkTransform.cs index d5baeb3204..ecd9eb5d42 100644 --- a/com.unity.netcode.gameobjects/Components/NetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Components/NetworkTransform.cs @@ -494,7 +494,7 @@ internal void ApplyNetworkStateFromAuthority(NetworkState networkState) { m_Transform.localScale = Vector3.one; var lossyScale = m_Transform.lossyScale; - // todo this conversion is messing with interpolation. local scale interpolates fine, lossy scale is jittery. must investigate + // todo this conversion is messing with interpolation. local scale interpolates fine, lossy scale is jittery. must investigate. MTT-1208 m_Transform.localScale = new Vector3(networkState.ScaleX / lossyScale.x, networkState.ScaleY / lossyScale.y, networkState.ScaleZ / lossyScale.z); } From 84d2bebca6a408552af852c9a8a2ed9d6fe94bd1 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Mon, 13 Sep 2021 17:09:55 -0400 Subject: [PATCH 064/113] fix compile errors, trying to not have too much public APIs --- .../Components/Interpolator.meta | 2 +- .../Components/NetworkTransform.cs | 60 +++++++++---------- .../Scripts/ClientNetworkTransform.cs | 18 +++--- .../NetworkTransformStateTests.cs | 6 +- testproject/Assets/Scenes/ZooSam.unity | 2 +- 5 files changed, 45 insertions(+), 43 deletions(-) diff --git a/com.unity.netcode.gameobjects/Components/Interpolator.meta b/com.unity.netcode.gameobjects/Components/Interpolator.meta index 0bfe5f770f..15aee65a55 100644 --- a/com.unity.netcode.gameobjects/Components/Interpolator.meta +++ b/com.unity.netcode.gameobjects/Components/Interpolator.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 32190d476d5de4dc8b7ee8208bde82a0 +guid: 8eb56856ab05d41fa9e422a92acbc109 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/com.unity.netcode.gameobjects/Components/NetworkTransform.cs b/com.unity.netcode.gameobjects/Components/NetworkTransform.cs index 1d27291bc3..6f046c0f16 100644 --- a/com.unity.netcode.gameobjects/Components/NetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Components/NetworkTransform.cs @@ -12,7 +12,7 @@ namespace Unity.Netcode.Components [DefaultExecutionOrder(1000)] // this is needed to catch the update time after the transform was updated by user scripts public class NetworkTransform : NetworkBehaviour { - protected struct NetworkState : INetworkSerializable + public struct NetworkTransformState : INetworkSerializable { internal const int InLocalSpaceBit = 0; internal const int PositionXBit = 1; @@ -262,9 +262,9 @@ public void NetworkSerialize(NetworkSerializer serializer) private Transform m_Transform; // cache the transform component to reduce unnecessary bounce between managed and native - protected readonly NetworkVariable ReplNetworkState = new NetworkVariable(new NetworkState()); - protected NetworkState PrevNetworkState; - protected NetworkState LocalAuthoritativeNetworkState; + protected readonly NetworkVariable ReplNetworkState = new NetworkVariable(new NetworkTransformState()); + protected NetworkTransformState PrevNetworkState; + protected NetworkTransformState LocalAuthoritativeNetworkState; protected virtual bool CanWriteToTransform => IsServer; @@ -283,12 +283,12 @@ public void ResetCurrentInterpolatedState() // updates `NetworkState` properties if they need to and returns a `bool` indicating whether or not there was any changes made // returned boolean would be useful to change encapsulating `NetworkVariable`'s dirty state, e.g. ReplNetworkState.SetDirty(isDirty); - protected bool UpdateNetworkStateCheckDirty(ref NetworkState networkState, double dirtyTime) + protected bool UpdateNetworkStateCheckDirty(ref NetworkTransformState networkState, double dirtyTime) { return UpdateNetworkStateCheckDirtyWithInfo(ref networkState, dirtyTime).isDirty; } - private (bool isDirty, bool isPositionDirty, bool isRotationDirty, bool isScaleDirty) UpdateNetworkStateCheckDirtyWithInfo(ref NetworkState networkState, double dirtyTime) + private (bool isDirty, bool isPositionDirty, bool isRotationDirty, bool isScaleDirty) UpdateNetworkStateCheckDirtyWithInfo(ref NetworkTransformState networkState, double dirtyTime) { var position = InLocalSpace ? m_Transform.localPosition : m_Transform.position; var rotAngles = InLocalSpace ? m_Transform.localEulerAngles : m_Transform.eulerAngles; @@ -398,7 +398,7 @@ protected bool UpdateNetworkStateCheckDirty(ref NetworkState networkState, doubl return (isDirty, isPositionDirty, isRotationDirty, isScaleDirty); } - protected void ApplyNetworkStateFromAuthority(NetworkState networkState) + protected void ApplyNetworkStateFromAuthority(NetworkTransformState networkState) { PrevNetworkState = networkState; @@ -504,20 +504,8 @@ protected void ApplyNetworkStateFromAuthority(NetworkState networkState) } } - private void OnNetworkStateChanged(NetworkState oldState, NetworkState newState) + protected void AddInterpolatedState(NetworkTransformState newState) { - if (!NetworkObject.IsSpawned) - { - // todo MTT-849 should never happen but yet it does! maybe revisit/dig after NetVar updates and snapshot system lands? - return; - } - - if (CanWriteToTransform) - { - // we're the authority, we ignore incoming changes - return; - } - var sentTime = new NetworkTime(NetworkManager.Singleton.ServerTime.TickRate, newState.SentTime); if (newState.HasPositionX) @@ -551,6 +539,23 @@ private void OnNetworkStateChanged(NetworkState oldState, NetworkState newState) { m_ScaleZInterpolator.AddMeasurement(newState.ScaleZ, sentTime); } + } + + private void OnNetworkStateChanged(NetworkTransformState oldState, NetworkTransformState newState) + { + if (!NetworkObject.IsSpawned) + { + // todo MTT-849 should never happen but yet it does! maybe revisit/dig after NetVar updates and snapshot system lands? + return; + } + + if (CanWriteToTransform) + { + // we're the authority, we ignore incoming changes + return; + } + + AddInterpolatedState(newState); if (NetworkManager.Singleton.LogLevel == LogLevel.Developer) { @@ -578,7 +583,7 @@ private void Awake() // set initial value for spawn if (CanWriteToTransform) { - DoUpdateToGhosts(); + UpdateNetworkVariable(); } ReplNetworkState.OnValueChanged += OnNetworkStateChanged; @@ -599,12 +604,7 @@ private void OnDestroy() ReplNetworkState.OnValueChanged -= OnNetworkStateChanged; } - protected virtual void DoUpdateToGhosts() - { - UpdateNetworkVariable(); - } - - protected void UpdateNetworkVariable() + private void UpdateNetworkVariable() { if (UpdateNetworkStateCheckDirty(ref LocalAuthoritativeNetworkState, NetworkManager.LocalTime.Time)) { @@ -637,16 +637,16 @@ private void FixedUpdate() } } - private void Update() + protected virtual void Update() { if (!NetworkObject.IsSpawned) { return; } - if (CanWriteToTransform) + if (IsServer) { - DoUpdateToGhosts(); + UpdateNetworkVariable(); } // apply interpolated value diff --git a/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs b/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs index 17830f027f..9ba797ddf5 100644 --- a/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs @@ -6,24 +6,26 @@ public class ClientNetworkTransform : NetworkTransform { protected override bool CanWriteToTransform => IsClient && IsOwner; - protected override void DoUpdateToGhosts() + protected override void Update() { - if (UpdateNetworkStateCheckDirty(ref LocalAuthoritativeNetworkState, NetworkManager.LocalTime.Time)) + base.Update(); + if (NetworkManager.Singleton != null && (NetworkManager.Singleton.IsConnectedClient || NetworkManager.Singleton.IsListening)) { - SubmitNetworkStateServerRpc(LocalAuthoritativeNetworkState); + if (CanWriteToTransform && UpdateNetworkStateCheckDirty(ref LocalAuthoritativeNetworkState, NetworkManager.LocalTime.Time)) + { + SubmitNetworkStateServerRpc(LocalAuthoritativeNetworkState); + } } } [ServerRpc] - private void SubmitNetworkStateServerRpc(NetworkState networkState) + private void SubmitNetworkStateServerRpc(NetworkTransformState networkState) { LocalAuthoritativeNetworkState = networkState; - // as a server, apply whatever networkstate owner client sent to us, to make NetworkTransform move locally on the server - ApplyNetworkStateFromAuthority(networkState); + AddInterpolatedState(networkState); - // as a server, update netvar to cause it to be replicated down to other non-owner clients - UpdateNetworkVariable(); + // state application and state sending to other clients will be done in next update } } } diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/NetworkTransformStateTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/NetworkTransformStateTests.cs index a8494aee73..da71713cb0 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/NetworkTransformStateTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/NetworkTransformStateTests.cs @@ -9,7 +9,7 @@ public class NetworkTransformStateTests private class TestNetworkTransform : NetworkTransform { // needed to test protected methods - public bool ExposedUpdateNetworkStateCheckDirty(ref NetworkState networkState, double dirtyTime) + public bool ExposedUpdateNetworkStateCheckDirty(ref NetworkTransformState networkState, double dirtyTime) { return UpdateNetworkStateCheckDirty(ref networkState, dirtyTime); } @@ -45,7 +45,7 @@ public void TestSyncAxes( networkTransform.SyncScaleZ = syncScaZ; networkTransform.InLocalSpace = inLocalSpace; - var networkTransformState = new TestNetworkTransform.NetworkState + var networkTransformState = new TestNetworkTransform.NetworkTransformState { PositionX = initialPosition.x, PositionY = initialPosition.y, @@ -207,7 +207,7 @@ public void TestThresholds( networkTransform.RotAngleThreshold = rotAngleThreshold; networkTransform.ScaleThreshold = scaleThreshold; - var networkTransformState = new TestNetworkTransform.NetworkState + var networkTransformState = new TestNetworkTransform.NetworkTransformState { PositionX = initialPosition.x, PositionY = initialPosition.y, diff --git a/testproject/Assets/Scenes/ZooSam.unity b/testproject/Assets/Scenes/ZooSam.unity index ae7e79cd73..3cdbd5dd61 100644 --- a/testproject/Assets/Scenes/ZooSam.unity +++ b/testproject/Assets/Scenes/ZooSam.unity @@ -6854,7 +6854,7 @@ MonoBehaviour: LogLevel: 1 NetworkConfig: ProtocolVersion: 0 - NetworkTransport: {fileID: 620561613} + NetworkTransport: {fileID: 620561610} PlayerPrefab: {fileID: 4700706668509470175, guid: 7eeaaf9e50c0afc4dab93584a54fb0d6, type: 3} NetworkPrefabs: [] From 3883bfba4fa5246de0eccab0db1caf91d9581c05 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Mon, 13 Sep 2021 17:10:35 -0400 Subject: [PATCH 065/113] removing commented lines --- .../Components/Interpolator/BufferedLinearInterpolator.cs | 7 ------- 1 file changed, 7 deletions(-) diff --git a/com.unity.netcode.gameobjects/Components/Interpolator/BufferedLinearInterpolator.cs b/com.unity.netcode.gameobjects/Components/Interpolator/BufferedLinearInterpolator.cs index 221958df36..0c19afa1bd 100644 --- a/com.unity.netcode.gameobjects/Components/Interpolator/BufferedLinearInterpolator.cs +++ b/com.unity.netcode.gameobjects/Components/Interpolator/BufferedLinearInterpolator.cs @@ -64,7 +64,6 @@ public void ResetTo(T targetValue) m_EndTimeConsumed = new NetworkTime(InterpolatorTimeProxy.TickRate, 0); m_StartTimeConsumed = new NetworkTime(InterpolatorTimeProxy.TickRate, 0); - // SimpleInterpolator.ResetTo(targetValue); // for statically placed objects, so we don't interpolate from 0 to current position Update(0); } @@ -173,8 +172,6 @@ public T GetInterpolatedValue() protected abstract T Interpolate(T start, T end, float time); protected abstract T InterpolateUnclamped(T start, T end, float time); - - // protected abstract SimpleInterpolator SimpleInterpolator { get; } } internal class BufferedLinearInterpolatorFloat : BufferedLinearInterpolator @@ -188,8 +185,6 @@ protected override float Interpolate(float start, float end, float time) { return Mathf.Lerp(start, end, time); } - - // protected override SimpleInterpolator SimpleInterpolator { get; } = new SimpleInterpolatorFloat(); } internal class BufferedLinearInterpolatorQuaternion : BufferedLinearInterpolator @@ -203,7 +198,5 @@ protected override Quaternion Interpolate(Quaternion start, Quaternion end, floa { return Quaternion.SlerpUnclamped(start, end, time); } - - // protected override SimpleInterpolator SimpleInterpolator { get; } = new SimpleInterpolatorQuaternion(); } } \ No newline at end of file From 92b9a55841cd1e674634c168341351e0e577277d Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Mon, 13 Sep 2021 17:13:54 -0400 Subject: [PATCH 066/113] removing useless lines --- testproject/Assets/Scripts/MoveInCircle.cs | 6 ------ 1 file changed, 6 deletions(-) diff --git a/testproject/Assets/Scripts/MoveInCircle.cs b/testproject/Assets/Scripts/MoveInCircle.cs index f440e6f55a..c8b2fc440a 100644 --- a/testproject/Assets/Scripts/MoveInCircle.cs +++ b/testproject/Assets/Scripts/MoveInCircle.cs @@ -15,9 +15,6 @@ public class MoveInCircle : NetworkBehaviour [SerializeField] private bool m_RunInUpdate; - private Vector3 m_DebugOldPosition; - private float m_DebugLastTime; - public override void OnNetworkSpawn() { base.OnNetworkSpawn(); @@ -46,11 +43,8 @@ private void Tick(bool isFixed) { if (NetworkManager.Singleton.IsServer || !m_RunServerOnly) { - m_DebugOldPosition = transform.position; var deltaTime = isFixed ? Time.fixedDeltaTime : Time.deltaTime; transform.position = transform.position + transform.forward * (m_MoveSpeed * deltaTime); - // Debug.Log($"ewqqwe {Math.Round((transform.position - debug_oldPosition).magnitude, 2)} time diff {Math.Round(Time.time - lastTime, 2)}"); - m_DebugLastTime = Time.time; transform.Rotate(0, m_RotationSpeed * deltaTime, 0); transform.localScale = ((Mathf.Sin(isFixed ? Time.fixedTime : Time.time)+1) * Vector3.one); } From ae2bc6640668f8178ae4f1f1567597b53d2b8a05 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Mon, 13 Sep 2021 18:25:26 -0400 Subject: [PATCH 067/113] client auth works without interpolation, on to interpolation now --- .../Components/NetworkTransform.cs | 6 +++--- .../Scripts/ClientNetworkTransform.cs | 5 ++--- testproject/Assets/Scenes/ZooSam.unity | 2 +- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/com.unity.netcode.gameobjects/Components/NetworkTransform.cs b/com.unity.netcode.gameobjects/Components/NetworkTransform.cs index 6f046c0f16..d4843881b1 100644 --- a/com.unity.netcode.gameobjects/Components/NetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Components/NetworkTransform.cs @@ -604,9 +604,9 @@ private void OnDestroy() ReplNetworkState.OnValueChanged -= OnNetworkStateChanged; } - private void UpdateNetworkVariable() + protected void UpdateNetworkVariable() { - if (UpdateNetworkStateCheckDirty(ref LocalAuthoritativeNetworkState, NetworkManager.LocalTime.Time)) + if (CanWriteToTransform && UpdateNetworkStateCheckDirty(ref LocalAuthoritativeNetworkState, NetworkManager.LocalTime.Time)) { ReplNetworkState.Value = LocalAuthoritativeNetworkState; ReplNetworkState.SetDirty(true); @@ -644,7 +644,7 @@ protected virtual void Update() return; } - if (IsServer) + if (CanWriteToTransform && IsServer) { UpdateNetworkVariable(); } diff --git a/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs b/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs index 9ba797ddf5..2fbc55999a 100644 --- a/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs @@ -22,10 +22,9 @@ protected override void Update() private void SubmitNetworkStateServerRpc(NetworkTransformState networkState) { LocalAuthoritativeNetworkState = networkState; - + ReplNetworkState.Value = networkState; + ReplNetworkState.SetDirty(true); AddInterpolatedState(networkState); - - // state application and state sending to other clients will be done in next update } } } diff --git a/testproject/Assets/Scenes/ZooSam.unity b/testproject/Assets/Scenes/ZooSam.unity index 3cdbd5dd61..8639f0560b 100644 --- a/testproject/Assets/Scenes/ZooSam.unity +++ b/testproject/Assets/Scenes/ZooSam.unity @@ -1363,7 +1363,7 @@ MonoBehaviour: RotAngleThreshold: 0 ScaleThreshold: 0 InLocalSpace: 0 - Interpolate: 1 + Interpolate: 0 FixedSendsPerSecond: 30 --- !u!114 &108150033 MonoBehaviour: From 0271bce4ca7c4c36f5098c477d38c2dd36892b93 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Mon, 13 Sep 2021 19:45:06 -0400 Subject: [PATCH 068/113] closing down public api --- .../Components/NetworkTransform.cs | 140 +++++++++--------- .../Scripts/ClientNetworkTransform.cs | 10 +- testproject/Assets/Scenes/ZooSam.unity | 2 +- 3 files changed, 76 insertions(+), 76 deletions(-) diff --git a/com.unity.netcode.gameobjects/Components/NetworkTransform.cs b/com.unity.netcode.gameobjects/Components/NetworkTransform.cs index d4843881b1..e0ad795b40 100644 --- a/com.unity.netcode.gameobjects/Components/NetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Components/NetworkTransform.cs @@ -14,120 +14,120 @@ public class NetworkTransform : NetworkBehaviour { public struct NetworkTransformState : INetworkSerializable { - internal const int InLocalSpaceBit = 0; - internal const int PositionXBit = 1; - internal const int PositionYBit = 2; - internal const int PositionZBit = 3; - internal const int RotAngleXBit = 4; - internal const int RotAngleYBit = 5; - internal const int RotAngleZBit = 6; - internal const int ScaleXBit = 7; - internal const int ScaleYBit = 8; - internal const int ScaleZBit = 9; + private const int k_InLocalSpaceBit = 0; + private const int k_PositionXBit = 1; + private const int k_PositionYBit = 2; + private const int k_PositionZBit = 3; + private const int k_RotAngleXBit = 4; + private const int k_RotAngleYBit = 5; + private const int k_RotAngleZBit = 6; + private const int k_ScaleXBit = 7; + private const int k_ScaleYBit = 8; + private const int k_ScaleZBit = 9; // 10-15: - public ushort Bitset; + private ushort m_Bitset; public bool InLocalSpace { - get => (Bitset & (1 << InLocalSpaceBit)) != 0; + get => (m_Bitset & (1 << k_InLocalSpaceBit)) != 0; set { - if (value) Bitset = (ushort) (Bitset | (1 << InLocalSpaceBit)); - else Bitset = (ushort) (Bitset & ~(1 << InLocalSpaceBit)); + if (value) m_Bitset = (ushort) (m_Bitset | (1 << k_InLocalSpaceBit)); + else m_Bitset = (ushort) (m_Bitset & ~(1 << k_InLocalSpaceBit)); } } // Position public bool HasPositionX { - get => (Bitset & (1 << PositionXBit)) != 0; + get => (m_Bitset & (1 << k_PositionXBit)) != 0; set { - if (value) Bitset = (ushort) (Bitset | (1 << PositionXBit)); - else Bitset = (ushort) (Bitset & ~(1 << PositionXBit)); + if (value) m_Bitset = (ushort) (m_Bitset | (1 << k_PositionXBit)); + else m_Bitset = (ushort) (m_Bitset & ~(1 << k_PositionXBit)); } } public bool HasPositionY { - get => (Bitset & (1 << PositionYBit)) != 0; + get => (m_Bitset & (1 << k_PositionYBit)) != 0; set { - if (value) Bitset = (ushort) (Bitset | (1 << PositionYBit)); - else Bitset = (ushort) (Bitset & ~(1 << PositionYBit)); + if (value) m_Bitset = (ushort) (m_Bitset | (1 << k_PositionYBit)); + else m_Bitset = (ushort) (m_Bitset & ~(1 << k_PositionYBit)); } } public bool HasPositionZ { - get => (Bitset & (1 << PositionZBit)) != 0; + get => (m_Bitset & (1 << k_PositionZBit)) != 0; set { - if (value) Bitset = (ushort) (Bitset | (1 << PositionZBit)); - else Bitset = (ushort) (Bitset & ~(1 << PositionZBit)); + if (value) m_Bitset = (ushort) (m_Bitset | (1 << k_PositionZBit)); + else m_Bitset = (ushort) (m_Bitset & ~(1 << k_PositionZBit)); } } // RotAngles public bool HasRotAngleX { - get => (Bitset & (1 << RotAngleXBit)) != 0; + get => (m_Bitset & (1 << k_RotAngleXBit)) != 0; set { - if (value) Bitset = (ushort) (Bitset | (1 << RotAngleXBit)); - else Bitset = (ushort) (Bitset & ~(1 << RotAngleXBit)); + if (value) m_Bitset = (ushort) (m_Bitset | (1 << k_RotAngleXBit)); + else m_Bitset = (ushort) (m_Bitset & ~(1 << k_RotAngleXBit)); } } public bool HasRotAngleY { - get => (Bitset & (1 << RotAngleYBit)) != 0; + get => (m_Bitset & (1 << k_RotAngleYBit)) != 0; set { - if (value) Bitset = (ushort) (Bitset | (1 << RotAngleYBit)); - else Bitset = (ushort) (Bitset & ~(1 << RotAngleYBit)); + if (value) m_Bitset = (ushort) (m_Bitset | (1 << k_RotAngleYBit)); + else m_Bitset = (ushort) (m_Bitset & ~(1 << k_RotAngleYBit)); } } public bool HasRotAngleZ { - get => (Bitset & (1 << RotAngleZBit)) != 0; + get => (m_Bitset & (1 << k_RotAngleZBit)) != 0; set { - if (value) Bitset = (ushort) (Bitset | (1 << RotAngleZBit)); - else Bitset = (ushort) (Bitset & ~(1 << RotAngleZBit)); + if (value) m_Bitset = (ushort) (m_Bitset | (1 << k_RotAngleZBit)); + else m_Bitset = (ushort) (m_Bitset & ~(1 << k_RotAngleZBit)); } } // Scale public bool HasScaleX { - get => (Bitset & (1 << ScaleXBit)) != 0; + get => (m_Bitset & (1 << k_ScaleXBit)) != 0; set { - if (value) Bitset = (ushort) (Bitset | (1 << ScaleXBit)); - else Bitset = (ushort) (Bitset & ~(1 << ScaleXBit)); + if (value) m_Bitset = (ushort) (m_Bitset | (1 << k_ScaleXBit)); + else m_Bitset = (ushort) (m_Bitset & ~(1 << k_ScaleXBit)); } } public bool HasScaleY { - get => (Bitset & (1 << ScaleYBit)) != 0; + get => (m_Bitset & (1 << k_ScaleYBit)) != 0; set { - if (value) Bitset = (ushort) (Bitset | (1 << ScaleYBit)); - else Bitset = (ushort) (Bitset & ~(1 << ScaleYBit)); + if (value) m_Bitset = (ushort) (m_Bitset | (1 << k_ScaleYBit)); + else m_Bitset = (ushort) (m_Bitset & ~(1 << k_ScaleYBit)); } } public bool HasScaleZ { - get => (Bitset & (1 << ScaleZBit)) != 0; + get => (m_Bitset & (1 << k_ScaleZBit)) != 0; set { - if (value) Bitset = (ushort) (Bitset | (1 << ScaleZBit)); - else Bitset = (ushort) (Bitset & ~(1 << ScaleZBit)); + if (value) m_Bitset = (ushort) (m_Bitset | (1 << k_ScaleZBit)); + else m_Bitset = (ushort) (m_Bitset & ~(1 << k_ScaleZBit)); } } @@ -173,7 +173,7 @@ public void NetworkSerialize(NetworkSerializer serializer) { serializer.Serialize(ref SentTime); // InLocalSpace + HasXXX Bits - serializer.Serialize(ref Bitset); + serializer.Serialize(ref m_Bitset); // Position Values if (HasPositionX) { @@ -247,6 +247,12 @@ public void NetworkSerialize(NetworkSerializer serializer) [SerializeField, Range(0, 120), Tooltip("The base amount of sends per seconds to use when range is disabled")] public float FixedSendsPerSecond = 30f; + protected virtual bool CanWriteToTransform => IsServer; + + protected readonly NetworkVariable m_ReplicatedNetworkState = new NetworkVariable(new NetworkTransformState()); + protected NetworkTransformState m_LocalAuthoritativeNetworkState; + + private NetworkTransformState m_PrevNetworkState; private const int k_DebugDrawLineTime = 10; @@ -262,23 +268,17 @@ public void NetworkSerialize(NetworkSerializer serializer) private Transform m_Transform; // cache the transform component to reduce unnecessary bounce between managed and native - protected readonly NetworkVariable ReplNetworkState = new NetworkVariable(new NetworkTransformState()); - protected NetworkTransformState PrevNetworkState; - protected NetworkTransformState LocalAuthoritativeNetworkState; - - protected virtual bool CanWriteToTransform => IsServer; - public void ResetCurrentInterpolatedState() { - m_PositionXInterpolator.ResetTo(ReplNetworkState.Value.PositionX); - m_PositionYInterpolator.ResetTo(ReplNetworkState.Value.PositionY); - m_PositionZInterpolator.ResetTo(ReplNetworkState.Value.PositionZ); + m_PositionXInterpolator.ResetTo(m_ReplicatedNetworkState.Value.PositionX); + m_PositionYInterpolator.ResetTo(m_ReplicatedNetworkState.Value.PositionY); + m_PositionZInterpolator.ResetTo(m_ReplicatedNetworkState.Value.PositionZ); - m_RotationInterpolator.ResetTo(Quaternion.Euler(ReplNetworkState.Value.Rotation)); + m_RotationInterpolator.ResetTo(Quaternion.Euler(m_ReplicatedNetworkState.Value.Rotation)); - m_ScaleXInterpolator.ResetTo(ReplNetworkState.Value.ScaleX); - m_ScaleYInterpolator.ResetTo(ReplNetworkState.Value.ScaleY); - m_ScaleZInterpolator.ResetTo(ReplNetworkState.Value.ScaleZ); + m_ScaleXInterpolator.ResetTo(m_ReplicatedNetworkState.Value.ScaleX); + m_ScaleYInterpolator.ResetTo(m_ReplicatedNetworkState.Value.ScaleY); + m_ScaleZInterpolator.ResetTo(m_ReplicatedNetworkState.Value.ScaleZ); } // updates `NetworkState` properties if they need to and returns a `bool` indicating whether or not there was any changes made @@ -398,9 +398,9 @@ protected bool UpdateNetworkStateCheckDirty(ref NetworkTransformState networkSta return (isDirty, isPositionDirty, isRotationDirty, isScaleDirty); } - protected void ApplyNetworkStateFromAuthority(NetworkTransformState networkState) + private void ApplyNetworkStateFromAuthority(NetworkTransformState networkState) { - PrevNetworkState = networkState; + m_PrevNetworkState = networkState; var interpolatedPosition = InLocalSpace ? m_Transform.localPosition : m_Transform.position; var interpolatedRotAngles = InLocalSpace ? m_Transform.localEulerAngles : m_Transform.eulerAngles; @@ -467,7 +467,7 @@ protected void ApplyNetworkStateFromAuthority(NetworkTransformState networkState m_Transform.position = interpolatedPosition; } - PrevNetworkState.Position = interpolatedPosition; + m_PrevNetworkState.Position = interpolatedPosition; } // RotAngles Apply @@ -482,7 +482,7 @@ protected void ApplyNetworkStateFromAuthority(NetworkTransformState networkState m_Transform.rotation = Quaternion.Euler(interpolatedRotAngles); } - PrevNetworkState.Rotation = interpolatedRotAngles; + m_PrevNetworkState.Rotation = interpolatedRotAngles; } // Scale Apply @@ -500,7 +500,7 @@ protected void ApplyNetworkStateFromAuthority(NetworkTransformState networkState m_Transform.localScale = new Vector3(networkState.ScaleX / lossyScale.x, networkState.ScaleY / lossyScale.y, networkState.ScaleZ / lossyScale.z); } - PrevNetworkState.Scale = interpolatedScale; + m_PrevNetworkState.Scale = interpolatedScale; } } @@ -586,7 +586,7 @@ private void Awake() UpdateNetworkVariable(); } - ReplNetworkState.OnValueChanged += OnNetworkStateChanged; + m_ReplicatedNetworkState.OnValueChanged += OnNetworkStateChanged; } public override void OnNetworkSpawn() @@ -595,21 +595,21 @@ public override void OnNetworkSpawn() { ResetCurrentInterpolatedState(); // useful for late joining - ApplyNetworkStateFromAuthority(ReplNetworkState.Value); + ApplyNetworkStateFromAuthority(m_ReplicatedNetworkState.Value); } } private void OnDestroy() { - ReplNetworkState.OnValueChanged -= OnNetworkStateChanged; + m_ReplicatedNetworkState.OnValueChanged -= OnNetworkStateChanged; } - protected void UpdateNetworkVariable() + private void UpdateNetworkVariable() { - if (CanWriteToTransform && UpdateNetworkStateCheckDirty(ref LocalAuthoritativeNetworkState, NetworkManager.LocalTime.Time)) + if (CanWriteToTransform && UpdateNetworkStateCheckDirty(ref m_LocalAuthoritativeNetworkState, NetworkManager.LocalTime.Time)) { - ReplNetworkState.Value = LocalAuthoritativeNetworkState; - ReplNetworkState.SetDirty(true); + m_ReplicatedNetworkState.Value = m_LocalAuthoritativeNetworkState; + m_ReplicatedNetworkState.SetDirty(true); } } @@ -625,14 +625,14 @@ private void FixedUpdate() // we apply the latest ReplNetworkState again to revert our changes if (!CanWriteToTransform) { - var oldStateDirtyInfo = UpdateNetworkStateCheckDirtyWithInfo(ref PrevNetworkState, 0); + var oldStateDirtyInfo = UpdateNetworkStateCheckDirtyWithInfo(ref m_PrevNetworkState, 0); if (oldStateDirtyInfo.isPositionDirty || oldStateDirtyInfo.isScaleDirty || (oldStateDirtyInfo.isRotationDirty && SyncRotAngleX && SyncRotAngleY && SyncRotAngleZ)) { // ignoring rotation dirty since quaternions will mess with euler angles, making this impossible to determine if the change to a single axis comes // from an unauthorized transform change or euler to quaternion conversion artifacts. var dirtyField = oldStateDirtyInfo.isPositionDirty ? "position" : oldStateDirtyInfo.isRotationDirty ? "rotation" : "scale"; Debug.LogWarning($"A local change to {dirtyField} without authority detected, reverting back to latest interpolated network state!", this); - ApplyNetworkStateFromAuthority(ReplNetworkState.Value); + ApplyNetworkStateFromAuthority(m_ReplicatedNetworkState.Value); } } } @@ -665,7 +665,7 @@ protected virtual void Update() Debug.DrawLine(interpolatedPosition, interpolatedPosition + Vector3.up, Color.magenta, k_DebugDrawLineTime, false); } - ApplyNetworkStateFromAuthority(ReplNetworkState.Value); + ApplyNetworkStateFromAuthority(m_ReplicatedNetworkState.Value); } } diff --git a/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs b/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs index 2fbc55999a..83d4fb53be 100644 --- a/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs @@ -11,9 +11,9 @@ protected override void Update() base.Update(); if (NetworkManager.Singleton != null && (NetworkManager.Singleton.IsConnectedClient || NetworkManager.Singleton.IsListening)) { - if (CanWriteToTransform && UpdateNetworkStateCheckDirty(ref LocalAuthoritativeNetworkState, NetworkManager.LocalTime.Time)) + if (CanWriteToTransform && UpdateNetworkStateCheckDirty(ref m_LocalAuthoritativeNetworkState, NetworkManager.LocalTime.Time)) { - SubmitNetworkStateServerRpc(LocalAuthoritativeNetworkState); + SubmitNetworkStateServerRpc(m_LocalAuthoritativeNetworkState); } } } @@ -21,9 +21,9 @@ protected override void Update() [ServerRpc] private void SubmitNetworkStateServerRpc(NetworkTransformState networkState) { - LocalAuthoritativeNetworkState = networkState; - ReplNetworkState.Value = networkState; - ReplNetworkState.SetDirty(true); + m_LocalAuthoritativeNetworkState = networkState; + m_ReplicatedNetworkState.Value = networkState; + m_ReplicatedNetworkState.SetDirty(true); AddInterpolatedState(networkState); } } diff --git a/testproject/Assets/Scenes/ZooSam.unity b/testproject/Assets/Scenes/ZooSam.unity index 8639f0560b..3cdbd5dd61 100644 --- a/testproject/Assets/Scenes/ZooSam.unity +++ b/testproject/Assets/Scenes/ZooSam.unity @@ -1363,7 +1363,7 @@ MonoBehaviour: RotAngleThreshold: 0 ScaleThreshold: 0 InLocalSpace: 0 - Interpolate: 0 + Interpolate: 1 FixedSendsPerSecond: 30 --- !u!114 &108150033 MonoBehaviour: From bdecea93170d0b68789e76666cdddfc52c3b34df Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Mon, 13 Sep 2021 21:51:30 -0400 Subject: [PATCH 069/113] adding missing script --- testproject/Assets/SetIsOwner.cs | 46 +++++++++++++++++++++++++++ testproject/Assets/SetIsOwner.cs.meta | 11 +++++++ 2 files changed, 57 insertions(+) create mode 100644 testproject/Assets/SetIsOwner.cs create mode 100644 testproject/Assets/SetIsOwner.cs.meta diff --git a/testproject/Assets/SetIsOwner.cs b/testproject/Assets/SetIsOwner.cs new file mode 100644 index 0000000000..7aeb85d417 --- /dev/null +++ b/testproject/Assets/SetIsOwner.cs @@ -0,0 +1,46 @@ +using System; +using Unity.Netcode; +using UnityEditor; +using UnityEngine; + +public class SetIsOwner : MonoBehaviour +{ + public void Set(ulong clientID) + { + GetComponent().ChangeOwnership(clientID); + } + + [CustomEditor(typeof(SetIsOwner))] + public class GameEventEditor : UnityEditor.Editor + { + private string clientID = "clientID (ulong)"; + public override void OnInspectorGUI() + { + base.OnInspectorGUI(); + + var gameEvent = (SetIsOwner) target; + + + if (NetworkManager.Singleton != null && (NetworkManager.Singleton.IsConnectedClient || NetworkManager.Singleton.IsListening)) + { + GUILayout.TextArea($"Current owner: {gameEvent.GetComponent().OwnerClientId}"); + clientID = GUILayout.TextField(clientID); + } + + if (GUILayout.Button("Set")) + { + gameEvent.Set(Convert.ToUInt64(clientID)); + } + } + } + + void Update() + { + if (NetworkManager.Singleton != null && (NetworkManager.Singleton.IsConnectedClient || NetworkManager.Singleton.IsListening)) + { + Debug.Log(NetworkManager.Singleton.LocalClientId); + } + } +} + + diff --git a/testproject/Assets/SetIsOwner.cs.meta b/testproject/Assets/SetIsOwner.cs.meta new file mode 100644 index 0000000000..4c0e6b8ce6 --- /dev/null +++ b/testproject/Assets/SetIsOwner.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e6aa2a85582344e32ac05a32f869a764 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From 5ccc78bbddd35015a4dc1b287d5ad4faba42c426 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Mon, 13 Sep 2021 22:28:32 -0400 Subject: [PATCH 070/113] fixed init issue, now can switch owner at runtime with no issues --- .../BufferedLinearInterpolator.cs | 4 +- .../Components/NetworkTransform.cs | 39 ++++++++++++++----- .../Scripts/ClientNetworkTransform.cs | 15 ++++--- testproject/Assets/Scenes/ZooSam.unity | 28 ------------- 4 files changed, 41 insertions(+), 45 deletions(-) diff --git a/com.unity.netcode.gameobjects/Components/Interpolator/BufferedLinearInterpolator.cs b/com.unity.netcode.gameobjects/Components/Interpolator/BufferedLinearInterpolator.cs index 6a5ab0f896..4080835014 100644 --- a/com.unity.netcode.gameobjects/Components/Interpolator/BufferedLinearInterpolator.cs +++ b/com.unity.netcode.gameobjects/Components/Interpolator/BufferedLinearInterpolator.cs @@ -108,7 +108,7 @@ public T Update(float deltaTime) { TryConsumeFromBuffer(); - if (m_LifetimeConsumedCount == 0 && m_Buffer.Count == 0) + if (InvalidState) { throw new InvalidOperationException("trying to update interpolator when no data has been added to it yet"); } @@ -166,6 +166,8 @@ public void AddMeasurement(T newMeasurement, NetworkTime sentTime) } } + public bool InvalidState => m_Buffer.Count == 0 && m_LifetimeConsumedCount == 0; + public T GetInterpolatedValue() { return m_CurrentInterpValue; diff --git a/com.unity.netcode.gameobjects/Components/NetworkTransform.cs b/com.unity.netcode.gameobjects/Components/NetworkTransform.cs index e0ad795b40..79fc747941 100644 --- a/com.unity.netcode.gameobjects/Components/NetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Components/NetworkTransform.cs @@ -268,7 +268,7 @@ public void NetworkSerialize(NetworkSerializer serializer) private Transform m_Transform; // cache the transform component to reduce unnecessary bounce between managed and native - public void ResetCurrentInterpolatedState() + public void ResetInterpolatedStateToCurrentNetworkState() { m_PositionXInterpolator.ResetTo(m_ReplicatedNetworkState.Value.PositionX); m_PositionYInterpolator.ResetTo(m_ReplicatedNetworkState.Value.PositionY); @@ -591,10 +591,24 @@ private void Awake() public override void OnNetworkSpawn() { - if (!CanWriteToTransform) - { - ResetCurrentInterpolatedState(); // useful for late joining + Initialize(); + } + public override void OnGainedOwnership() + { + Initialize(); + } + + private void Initialize() + { + ResetInterpolatedStateToCurrentNetworkState(); // useful for late joining + + if (CanWriteToTransform) + { + m_ReplicatedNetworkState.SetDirty(true); + } + else + { ApplyNetworkStateFromAuthority(m_ReplicatedNetworkState.Value); } } @@ -608,8 +622,10 @@ private void UpdateNetworkVariable() { if (CanWriteToTransform && UpdateNetworkStateCheckDirty(ref m_LocalAuthoritativeNetworkState, NetworkManager.LocalTime.Time)) { + m_PrevNetworkState = m_LocalAuthoritativeNetworkState; m_ReplicatedNetworkState.Value = m_LocalAuthoritativeNetworkState; m_ReplicatedNetworkState.SetDirty(true); + AddInterpolatedState(m_LocalAuthoritativeNetworkState); } } @@ -650,7 +666,7 @@ protected virtual void Update() } // apply interpolated value - if (!CanWriteToTransform && (NetworkManager.Singleton.IsConnectedClient || NetworkManager.Singleton.IsListening)) + if ((NetworkManager.Singleton.IsConnectedClient || NetworkManager.Singleton.IsListening)) { foreach (var interpolator in m_AllFloatInterpolators) { @@ -659,13 +675,16 @@ protected virtual void Update() m_RotationInterpolator.Update(Time.deltaTime); - if (NetworkManager.Singleton.LogLevel == LogLevel.Developer) + if (!CanWriteToTransform) { - var interpolatedPosition = new Vector3(m_PositionXInterpolator.GetInterpolatedValue(), m_PositionYInterpolator.GetInterpolatedValue(), m_PositionZInterpolator.GetInterpolatedValue()); - Debug.DrawLine(interpolatedPosition, interpolatedPosition + Vector3.up, Color.magenta, k_DebugDrawLineTime, false); - } + if (NetworkManager.Singleton.LogLevel == LogLevel.Developer) + { + var interpolatedPosition = new Vector3(m_PositionXInterpolator.GetInterpolatedValue(), m_PositionYInterpolator.GetInterpolatedValue(), m_PositionZInterpolator.GetInterpolatedValue()); + Debug.DrawLine(interpolatedPosition, interpolatedPosition + Vector3.up, Color.magenta, k_DebugDrawLineTime, false); + } - ApplyNetworkStateFromAuthority(m_ReplicatedNetworkState.Value); + ApplyNetworkStateFromAuthority(m_ReplicatedNetworkState.Value); + } } } diff --git a/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs b/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs index 83d4fb53be..71a2c41441 100644 --- a/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs @@ -18,13 +18,16 @@ protected override void Update() } } - [ServerRpc] - private void SubmitNetworkStateServerRpc(NetworkTransformState networkState) + [ServerRpc(RequireOwnership = false)] + private void SubmitNetworkStateServerRpc(NetworkTransformState networkState, ServerRpcParams serverParams = default) { - m_LocalAuthoritativeNetworkState = networkState; - m_ReplicatedNetworkState.Value = networkState; - m_ReplicatedNetworkState.SetDirty(true); - AddInterpolatedState(networkState); + if (serverParams.Receive.SenderClientId == OwnerClientId) // RPC call when not authorized to write could happen during the RTT interval during which a server's ownership change hasn't reached the client yet + { + m_LocalAuthoritativeNetworkState = networkState; + m_ReplicatedNetworkState.Value = networkState; + m_ReplicatedNetworkState.SetDirty(true); + AddInterpolatedState(networkState); + } } } } diff --git a/testproject/Assets/Scenes/ZooSam.unity b/testproject/Assets/Scenes/ZooSam.unity index 3cdbd5dd61..6a6507b7ed 100644 --- a/testproject/Assets/Scenes/ZooSam.unity +++ b/testproject/Assets/Scenes/ZooSam.unity @@ -1192,7 +1192,6 @@ GameObject: - component: {fileID: 108150028} - component: {fileID: 108150027} - component: {fileID: 108150026} - - component: {fileID: 108150025} - component: {fileID: 108150032} - component: {fileID: 108150033} m_Layer: 0 @@ -1202,33 +1201,6 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!114 &108150025 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 108150024} - m_Enabled: 0 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3} - m_Name: - m_EditorClassIdentifier: - SyncPositionX: 1 - SyncPositionY: 1 - SyncPositionZ: 1 - SyncRotAngleX: 1 - SyncRotAngleY: 1 - SyncRotAngleZ: 1 - SyncScaleX: 1 - SyncScaleY: 1 - SyncScaleZ: 1 - PositionThreshold: 0 - RotAngleThreshold: 0 - ScaleThreshold: 0 - InLocalSpace: 1 - Interpolate: 1 - FixedSendsPerSecond: 50 --- !u!114 &108150026 MonoBehaviour: m_ObjectHideFlags: 0 From 2e3f566b1a9d18cbc91a76a5837971858265c021 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Tue, 14 Sep 2021 10:34:57 -0400 Subject: [PATCH 071/113] fixing default scene for builds --- testproject/ProjectSettings/EditorBuildSettings.asset | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/testproject/ProjectSettings/EditorBuildSettings.asset b/testproject/ProjectSettings/EditorBuildSettings.asset index 47e80671ee..e03fd43770 100644 --- a/testproject/ProjectSettings/EditorBuildSettings.asset +++ b/testproject/ProjectSettings/EditorBuildSettings.asset @@ -5,12 +5,12 @@ EditorBuildSettings: m_ObjectHideFlags: 0 serializedVersion: 2 m_Scenes: - - enabled: 1 - path: Assets/Scenes/ZooSam.unity - guid: 4683469c9a191411fbda5e426765b2fc - enabled: 1 path: Assets/MainMenu.unity guid: 21c7fd68cda9dd9488fc0cc01f885e39 + - enabled: 1 + path: Assets/Scenes/ZooSam.unity + guid: 4683469c9a191411fbda5e426765b2fc - enabled: 1 path: Assets/Samples/SamplesMenu.unity guid: 037562c9b1a469f498dfb34256ddf86f From 67689eb515f13bd153523aeb8f27c2f76198cb3b Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Tue, 14 Sep 2021 10:36:39 -0400 Subject: [PATCH 072/113] adding missing meta files --- com.unity.netcode.gameobjects/Prototyping.meta | 8 ++++++++ .../Prototyping/Interpolator.meta | 8 ++++++++ 2 files changed, 16 insertions(+) create mode 100644 com.unity.netcode.gameobjects/Prototyping.meta create mode 100644 com.unity.netcode.gameobjects/Prototyping/Interpolator.meta diff --git a/com.unity.netcode.gameobjects/Prototyping.meta b/com.unity.netcode.gameobjects/Prototyping.meta new file mode 100644 index 0000000000..a536014db1 --- /dev/null +++ b/com.unity.netcode.gameobjects/Prototyping.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4f9f645c043894b81ab326fe4703f4c8 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.netcode.gameobjects/Prototyping/Interpolator.meta b/com.unity.netcode.gameobjects/Prototyping/Interpolator.meta new file mode 100644 index 0000000000..0bfe5f770f --- /dev/null +++ b/com.unity.netcode.gameobjects/Prototyping/Interpolator.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 32190d476d5de4dc8b7ee8208bde82a0 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: From 03c87f3020169c7380b9d75eb4efba4d2488df28 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Tue, 14 Sep 2021 10:51:04 -0400 Subject: [PATCH 073/113] Removing already deleted SyncTransform from Player. Switch player to ClientNetworkTransform --- testproject/Assets/Prefabs/PlayerCube.prefab | 33 +++-- testproject/Assets/Scenes/SampleScene.unity | 142 +++++++++++-------- 2 files changed, 99 insertions(+), 76 deletions(-) diff --git a/testproject/Assets/Prefabs/PlayerCube.prefab b/testproject/Assets/Prefabs/PlayerCube.prefab index 4dd75f78c3..4ed7640c5b 100644 --- a/testproject/Assets/Prefabs/PlayerCube.prefab +++ b/testproject/Assets/Prefabs/PlayerCube.prefab @@ -18,7 +18,7 @@ GameObject: - component: {fileID: 8685790303553767876} - component: {fileID: 3809075828520557319} - component: {fileID: 7138389085065872747} - - component: {fileID: 5715768330125915997} + - component: {fileID: 8585540885791567915} m_Layer: 0 m_Name: PlayerCube m_TagString: Target @@ -271,19 +271,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Range: 10 ---- !u!114 &-4978466230159947418 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8685790303553767886} - m_Enabled: 0 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9548116c10df1486ea12b7329b77c5cf, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!114 &5715768330125915997 +--- !u!114 &8585540885791567915 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -292,10 +280,21 @@ MonoBehaviour: m_GameObject: {fileID: 8685790303553767886} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3} + m_Script: {fileID: 11500000, guid: 54c9647dc784a46bca664910f182491e, type: 3} m_Name: m_EditorClassIdentifier: - Authority: 1 + SyncPositionX: 1 + SyncPositionY: 1 + SyncPositionZ: 1 + SyncRotAngleX: 1 + SyncRotAngleY: 1 + SyncRotAngleZ: 1 + SyncScaleX: 1 + SyncScaleY: 1 + SyncScaleZ: 1 + PositionThreshold: 0 + RotAngleThreshold: 0 + ScaleThreshold: 0 InLocalSpace: 0 + Interpolate: 1 FixedSendsPerSecond: 30 - m_PositionInterpolatorFactory: {fileID: 0} diff --git a/testproject/Assets/Scenes/SampleScene.unity b/testproject/Assets/Scenes/SampleScene.unity index fbcfdb36d3..34b82ff305 100644 --- a/testproject/Assets/Scenes/SampleScene.unity +++ b/testproject/Assets/Scenes/SampleScene.unity @@ -533,9 +533,20 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3} m_Name: m_EditorClassIdentifier: - Authority: 0 - Channel: 10 + SyncPositionX: 1 + SyncPositionY: 1 + SyncPositionZ: 1 + SyncRotAngleX: 1 + SyncRotAngleY: 1 + SyncRotAngleZ: 1 + SyncScaleX: 1 + SyncScaleY: 1 + SyncScaleZ: 1 + PositionThreshold: 0 + RotAngleThreshold: 0 + ScaleThreshold: 0 InLocalSpace: 0 + Interpolate: 1 FixedSendsPerSecond: 30 --- !u!1 &403665142 GameObject: @@ -854,12 +865,6 @@ MonoBehaviour: ConnectAddress: 127.0.0.1 ConnectPort: 7777 ServerListenPort: 7777 - ServerWebsocketListenPort: 8887 - SupportWebsocket: 0 - Channels: [] - UseNetcodeRelay: 0 - NetcodeRelayAddress: 127.0.0.1 - NetcodeRelayPort: 8888 MessageSendMode: 0 --- !u!114 &620561611 MonoBehaviour: @@ -879,9 +884,6 @@ MonoBehaviour: NetworkConfig: ProtocolVersion: 0 NetworkTransport: {fileID: 620561613} - RegisteredScenes: - - SampleScene - AllowRuntimeSceneChanges: 0 PlayerPrefab: {fileID: 8685790303553767886, guid: 96e0a72e30d0c46c8a5c9a750e8f5807, type: 3} NetworkPrefabs: [] @@ -933,9 +935,8 @@ MonoBehaviour: DisconnectTimeout: 5 ReconnectDelay: 0.5 MaxConnectAttempts: 10 - channels: [] MessageBufferSize: 5120 - SimulatePacketLossChance: 5 + SimulatePacketLossChance: 0 SimulateMinLatency: 60 SimulateMaxLatency: 100 --- !u!1001 &627808638 @@ -1166,6 +1167,8 @@ MonoBehaviour: m_EditorClassIdentifier: m_MoveSpeed: 5 m_RotationSpeed: 30 + m_RunServerOnly: 0 + m_RunInUpdate: 0 --- !u!114 &678326394 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1194,9 +1197,20 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3} m_Name: m_EditorClassIdentifier: - Authority: 0 - Channel: 6 + SyncPositionX: 1 + SyncPositionY: 1 + SyncPositionZ: 1 + SyncRotAngleX: 1 + SyncRotAngleY: 1 + SyncRotAngleZ: 1 + SyncScaleX: 1 + SyncScaleY: 1 + SyncScaleZ: 1 + PositionThreshold: 0 + RotAngleThreshold: 0 + ScaleThreshold: 0 InLocalSpace: 0 + Interpolate: 1 FixedSendsPerSecond: 30 --- !u!65 &678326396 BoxCollider: @@ -1954,9 +1968,20 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3} m_Name: m_EditorClassIdentifier: - Authority: 0 - Channel: 10 + SyncPositionX: 1 + SyncPositionY: 1 + SyncPositionZ: 1 + SyncRotAngleX: 1 + SyncRotAngleY: 1 + SyncRotAngleZ: 1 + SyncScaleX: 1 + SyncScaleY: 1 + SyncScaleZ: 1 + PositionThreshold: 0 + RotAngleThreshold: 0 + ScaleThreshold: 0 InLocalSpace: 0 + Interpolate: 1 FixedSendsPerSecond: 30 --- !u!114 &963826006 MonoBehaviour: @@ -2410,9 +2435,20 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3} m_Name: m_EditorClassIdentifier: - Authority: 0 - Channel: 10 + SyncPositionX: 1 + SyncPositionY: 1 + SyncPositionZ: 1 + SyncRotAngleX: 1 + SyncRotAngleY: 1 + SyncRotAngleZ: 1 + SyncScaleX: 1 + SyncScaleY: 1 + SyncScaleZ: 1 + PositionThreshold: 0 + RotAngleThreshold: 0 + ScaleThreshold: 0 InLocalSpace: 0 + Interpolate: 1 FixedSendsPerSecond: 30 --- !u!114 &1397037319 MonoBehaviour: @@ -2667,9 +2703,20 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3} m_Name: m_EditorClassIdentifier: - Authority: 0 - Channel: 10 + SyncPositionX: 1 + SyncPositionY: 1 + SyncPositionZ: 1 + SyncRotAngleX: 1 + SyncRotAngleY: 1 + SyncRotAngleZ: 1 + SyncScaleX: 1 + SyncScaleY: 1 + SyncScaleZ: 1 + PositionThreshold: 0 + RotAngleThreshold: 0 + ScaleThreshold: 0 InLocalSpace: 0 + Interpolate: 1 FixedSendsPerSecond: 30 --- !u!114 &1402467446 MonoBehaviour: @@ -3110,9 +3157,20 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3} m_Name: m_EditorClassIdentifier: - Authority: 0 - Channel: 10 + SyncPositionX: 1 + SyncPositionY: 1 + SyncPositionZ: 1 + SyncRotAngleX: 1 + SyncRotAngleY: 1 + SyncRotAngleZ: 1 + SyncScaleX: 1 + SyncScaleY: 1 + SyncScaleZ: 1 + PositionThreshold: 0 + RotAngleThreshold: 0 + ScaleThreshold: 0 InLocalSpace: 0 + Interpolate: 1 FixedSendsPerSecond: 30 --- !u!224 &1536251758 stripped RectTransform: @@ -3329,42 +3387,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: df4fbe773fc544428171994e08b0483f, type: 3} m_Name: m_EditorClassIdentifier: - FixedSendsPerSecond: 20 - AssumeSyncedSends: 1 - InterpolatePosition: 1 - SnapDistance: 10 - InterpolateServer: 1 - MinMeters: 0.15 - MinDegrees: 1.5 - ExtrapolatePosition: 0 - MaxSendsToExtrapolate: 5 - Channel: - EnableRange: 0 - EnableNonProvokedResendChecks: 0 - DistanceSendrate: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 20 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 500 - value: 20 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 --- !u!65 &1643885208 BoxCollider: m_ObjectHideFlags: 0 @@ -3471,6 +3493,8 @@ MonoBehaviour: m_EditorClassIdentifier: m_MoveSpeed: 5 m_RotationSpeed: 30 + m_RunServerOnly: 0 + m_RunInUpdate: 0 --- !u!1 &1815329519 GameObject: m_ObjectHideFlags: 0 From 2c4e6d116a27781218442d48e6123b6ffeb2e3fc Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Tue, 14 Sep 2021 10:55:46 -0400 Subject: [PATCH 074/113] reverting changes to samplescene, it was already in ZooSam --- testproject/Assets/Scenes/SampleScene.unity | 409 ++++---------------- 1 file changed, 67 insertions(+), 342 deletions(-) diff --git a/testproject/Assets/Scenes/SampleScene.unity b/testproject/Assets/Scenes/SampleScene.unity index fbcfdb36d3..63064c6d3d 100644 --- a/testproject/Assets/Scenes/SampleScene.unity +++ b/testproject/Assets/Scenes/SampleScene.unity @@ -533,9 +533,20 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3} m_Name: m_EditorClassIdentifier: - Authority: 0 - Channel: 10 + SyncPositionX: 1 + SyncPositionY: 1 + SyncPositionZ: 1 + SyncRotAngleX: 1 + SyncRotAngleY: 1 + SyncRotAngleZ: 1 + SyncScaleX: 1 + SyncScaleY: 1 + SyncScaleZ: 1 + PositionThreshold: 0 + RotAngleThreshold: 0 + ScaleThreshold: 0 InLocalSpace: 0 + Interpolate: 1 FixedSendsPerSecond: 30 --- !u!1 &403665142 GameObject: @@ -854,12 +865,6 @@ MonoBehaviour: ConnectAddress: 127.0.0.1 ConnectPort: 7777 ServerListenPort: 7777 - ServerWebsocketListenPort: 8887 - SupportWebsocket: 0 - Channels: [] - UseNetcodeRelay: 0 - NetcodeRelayAddress: 127.0.0.1 - NetcodeRelayPort: 8888 MessageSendMode: 0 --- !u!114 &620561611 MonoBehaviour: @@ -879,9 +884,6 @@ MonoBehaviour: NetworkConfig: ProtocolVersion: 0 NetworkTransport: {fileID: 620561613} - RegisteredScenes: - - SampleScene - AllowRuntimeSceneChanges: 0 PlayerPrefab: {fileID: 8685790303553767886, guid: 96e0a72e30d0c46c8a5c9a750e8f5807, type: 3} NetworkPrefabs: [] @@ -933,7 +935,6 @@ MonoBehaviour: DisconnectTimeout: 5 ReconnectDelay: 0.5 MaxConnectAttempts: 10 - channels: [] MessageBufferSize: 5120 SimulatePacketLossChance: 5 SimulateMinLatency: 60 @@ -1130,150 +1131,6 @@ LightingSettings: m_PVRFilteringAtrousPositionSigmaDirect: 0.5 m_PVRFilteringAtrousPositionSigmaIndirect: 2 m_PVRFilteringAtrousPositionSigmaAO: 1 ---- !u!1 &678326392 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 678326399} - - component: {fileID: 678326398} - - component: {fileID: 678326397} - - component: {fileID: 678326396} - - component: {fileID: 678326394} - - component: {fileID: 678326393} - - component: {fileID: 678326395} - m_Layer: 0 - m_Name: NetworkTransformBuffered - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &678326393 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 678326392} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 307c40a41954948e7a36bb6b64b4b9cb, type: 3} - m_Name: - m_EditorClassIdentifier: - m_MoveSpeed: 5 - m_RotationSpeed: 30 ---- !u!114 &678326394 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 678326392} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} - m_Name: - m_EditorClassIdentifier: - GlobalObjectIdHash: 1079447764 - AlwaysReplicateAsRoot: 0 - DontDestroyWithOwner: 0 - AutoObjectParentSync: 1 ---- !u!114 &678326395 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 678326392} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3} - m_Name: - m_EditorClassIdentifier: - Authority: 0 - Channel: 6 - InLocalSpace: 0 - FixedSendsPerSecond: 30 ---- !u!65 &678326396 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 678326392} - 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 &678326397 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 678326392} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - 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 &678326398 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 678326392} - m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!4 &678326399 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 678326392} - m_LocalRotation: {x: 0, y: 1, z: 0, w: 0} - m_LocalPosition: {x: 7.71, y: 1.55, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 12 - m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} --- !u!1 &702051983 GameObject: m_ObjectHideFlags: 0 @@ -1954,9 +1811,20 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3} m_Name: m_EditorClassIdentifier: - Authority: 0 - Channel: 10 + SyncPositionX: 1 + SyncPositionY: 1 + SyncPositionZ: 1 + SyncRotAngleX: 1 + SyncRotAngleY: 1 + SyncRotAngleZ: 1 + SyncScaleX: 1 + SyncScaleY: 1 + SyncScaleZ: 1 + PositionThreshold: 0 + RotAngleThreshold: 0 + ScaleThreshold: 0 InLocalSpace: 0 + Interpolate: 1 FixedSendsPerSecond: 30 --- !u!114 &963826006 MonoBehaviour: @@ -2410,9 +2278,20 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3} m_Name: m_EditorClassIdentifier: - Authority: 0 - Channel: 10 + SyncPositionX: 1 + SyncPositionY: 1 + SyncPositionZ: 1 + SyncRotAngleX: 1 + SyncRotAngleY: 1 + SyncRotAngleZ: 1 + SyncScaleX: 1 + SyncScaleY: 1 + SyncScaleZ: 1 + PositionThreshold: 0 + RotAngleThreshold: 0 + ScaleThreshold: 0 InLocalSpace: 0 + Interpolate: 1 FixedSendsPerSecond: 30 --- !u!114 &1397037319 MonoBehaviour: @@ -2633,8 +2512,8 @@ GameObject: - component: {fileID: 1402467448} - component: {fileID: 1402467447} - component: {fileID: 1402467446} - - component: {fileID: 1402467445} - component: {fileID: 1402467444} + - component: {fileID: 1402467445} m_Layer: 0 m_Name: GrabbableBallClientAuthoritative m_TagString: Untagged @@ -2664,12 +2543,23 @@ MonoBehaviour: m_GameObject: {fileID: 1402467443} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3} + m_Script: {fileID: 11500000, guid: 54c9647dc784a46bca664910f182491e, type: 3} m_Name: m_EditorClassIdentifier: - Authority: 0 - Channel: 10 + SyncPositionX: 1 + SyncPositionY: 1 + SyncPositionZ: 1 + SyncRotAngleX: 1 + SyncRotAngleY: 1 + SyncRotAngleZ: 1 + SyncScaleX: 1 + SyncScaleY: 1 + SyncScaleZ: 1 + PositionThreshold: 0 + RotAngleThreshold: 0 + ScaleThreshold: 0 InLocalSpace: 0 + Interpolate: 1 FixedSendsPerSecond: 30 --- !u!114 &1402467446 MonoBehaviour: @@ -3110,9 +3000,20 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3} m_Name: m_EditorClassIdentifier: - Authority: 0 - Channel: 10 + SyncPositionX: 1 + SyncPositionY: 1 + SyncPositionZ: 1 + SyncRotAngleX: 1 + SyncRotAngleY: 1 + SyncRotAngleZ: 1 + SyncScaleX: 1 + SyncScaleY: 1 + SyncScaleZ: 1 + PositionThreshold: 0 + RotAngleThreshold: 0 + ScaleThreshold: 0 InLocalSpace: 0 + Interpolate: 1 FixedSendsPerSecond: 30 --- !u!224 &1536251758 stripped RectTransform: @@ -3295,182 +3196,6 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1636734282} m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &1643885206 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1643885211} - - component: {fileID: 1643885210} - - component: {fileID: 1643885209} - - component: {fileID: 1643885208} - - component: {fileID: 1643885207} - - component: {fileID: 1643885212} - - component: {fileID: 1643885213} - m_Layer: 0 - m_Name: NetworkTransformLegacy - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1643885207 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1643885206} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: df4fbe773fc544428171994e08b0483f, type: 3} - m_Name: - m_EditorClassIdentifier: - FixedSendsPerSecond: 20 - AssumeSyncedSends: 1 - InterpolatePosition: 1 - SnapDistance: 10 - InterpolateServer: 1 - MinMeters: 0.15 - MinDegrees: 1.5 - ExtrapolatePosition: 0 - MaxSendsToExtrapolate: 5 - Channel: - EnableRange: 0 - EnableNonProvokedResendChecks: 0 - DistanceSendrate: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 20 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 500 - value: 20 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 ---- !u!65 &1643885208 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1643885206} - 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 &1643885209 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1643885206} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - 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 &1643885210 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1643885206} - m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!4 &1643885211 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1643885206} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -10.29, y: 1.55, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 11 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1643885212 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1643885206} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} - m_Name: - m_EditorClassIdentifier: - GlobalObjectIdHash: 1649186279 - AlwaysReplicateAsRoot: 0 - DontDestroyWithOwner: 0 - AutoObjectParentSync: 1 ---- !u!114 &1643885213 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1643885206} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 307c40a41954948e7a36bb6b64b4b9cb, type: 3} - m_Name: - m_EditorClassIdentifier: - m_MoveSpeed: 5 - m_RotationSpeed: 30 --- !u!1 &1815329519 GameObject: m_ObjectHideFlags: 0 From 2f6fa0b5d118256ed7aded4d6f108c95d2de9308 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Tue, 14 Sep 2021 18:38:46 -0400 Subject: [PATCH 075/113] scale error fixed, wasn't used interpolation for some reason... --- .../Components/NetworkTransform.cs | 69 +++++++++++-------- .../Scripts/ClientNetworkTransform.cs | 4 ++ testproject/Assets/Scenes/ZooSam.unity | 2 +- 3 files changed, 46 insertions(+), 29 deletions(-) diff --git a/com.unity.netcode.gameobjects/Components/NetworkTransform.cs b/com.unity.netcode.gameobjects/Components/NetworkTransform.cs index 42ae3319f0..f2d0fca210 100644 --- a/com.unity.netcode.gameobjects/Components/NetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Components/NetworkTransform.cs @@ -497,7 +497,7 @@ private void ApplyNetworkStateFromAuthority(NetworkTransformState networkState) m_Transform.localScale = Vector3.one; var lossyScale = m_Transform.lossyScale; // todo this conversion is messing with interpolation. local scale interpolates fine, lossy scale is jittery. must investigate. MTT-1208 - m_Transform.localScale = new Vector3(networkState.ScaleX / lossyScale.x, networkState.ScaleY / lossyScale.y, networkState.ScaleZ / lossyScale.z); + m_Transform.localScale = new Vector3(interpolatedScale.x / lossyScale.x, interpolatedScale.y / lossyScale.y, interpolatedScale.z / lossyScale.z); } m_PrevNetworkState.Scale = interpolatedScale; @@ -618,41 +618,38 @@ private void OnDestroy() m_ReplicatedNetworkState.OnValueChanged -= OnNetworkStateChanged; } + private bool hasSentLastValue = false; private void UpdateNetworkVariable() { - if (CanWriteToTransform && UpdateNetworkStateCheckDirty(ref m_LocalAuthoritativeNetworkState, NetworkManager.LocalTime.Time)) - { - m_PrevNetworkState = m_LocalAuthoritativeNetworkState; - m_ReplicatedNetworkState.Value = m_LocalAuthoritativeNetworkState; - m_ReplicatedNetworkState.SetDirty(true); - AddInterpolatedState(m_LocalAuthoritativeNetworkState); - } - } - - private void FixedUpdate() - { - if (!NetworkObject.IsSpawned) - { - return; - } - - // try to update previously consumed NetworkState - // if we have any changes, that means made some updates locally - // we apply the latest ReplNetworkState again to revert our changes - if (!CanWriteToTransform) + if (CanWriteToTransform) { - var oldStateDirtyInfo = UpdateNetworkStateCheckDirtyWithInfo(ref m_PrevNetworkState, 0); - if (oldStateDirtyInfo.isPositionDirty || oldStateDirtyInfo.isScaleDirty || (oldStateDirtyInfo.isRotationDirty && SyncRotAngleX && SyncRotAngleY && SyncRotAngleZ)) + // if dirty, send + // if not dirty anymore, but hasn't sent last value for extrapolation, still set isDirty + // if not dirty and has already sent last value, don't do anything + void Send() { - // ignoring rotation dirty since quaternions will mess with euler angles, making this impossible to determine if the change to a single axis comes - // from an unauthorized transform change or euler to quaternion conversion artifacts. - var dirtyField = oldStateDirtyInfo.isPositionDirty ? "position" : oldStateDirtyInfo.isRotationDirty ? "rotation" : "scale"; - Debug.LogWarning($"A local change to {dirtyField} without authority detected, reverting back to latest interpolated network state!", this); - ApplyNetworkStateFromAuthority(m_ReplicatedNetworkState.Value); + m_PrevNetworkState = m_LocalAuthoritativeNetworkState; + m_ReplicatedNetworkState.Value = m_LocalAuthoritativeNetworkState; + m_ReplicatedNetworkState.SetDirty(true); + AddInterpolatedState(m_LocalAuthoritativeNetworkState); + } + var isDirty = UpdateNetworkStateCheckDirty(ref m_LocalAuthoritativeNetworkState, NetworkManager.LocalTime.Time); + if (isDirty) + { + Send(); + hasSentLastValue = false; + } + else if (!hasSentLastValue && !m_ReplicatedNetworkState.IsDirty()) // check for state.IsDirty since update can happen more than once per tick + { + m_LocalAuthoritativeNetworkState.SentTime = NetworkManager.LocalTime.Time; // time one tick later + Send(); + hasSentLastValue = true; } } } + // todo this is currently in update, to be able to catch any transform changes. A FixedUpdate mode could be added to be less intense, but it'd be + // conditional to users only making transform update changes in FixedUpdate. protected virtual void Update() { if (!NetworkObject.IsSpawned) @@ -683,7 +680,23 @@ protected virtual void Update() Debug.DrawLine(interpolatedPosition, interpolatedPosition + Vector3.up, Color.magenta, k_DebugDrawLineTime, false); } + // Apply updated interpolated value ApplyNetworkStateFromAuthority(m_ReplicatedNetworkState.Value); + + // try to update previously consumed NetworkState + // if we have any changes, that means made some updates locally + // we apply the latest ReplNetworkState again to revert our changes + Debug.Log($"updating dadou prev {m_PrevNetworkState.ScaleZ}, transform is now {transform.localScale.z}"); + var oldStateDirtyInfo = UpdateNetworkStateCheckDirtyWithInfo(ref m_PrevNetworkState, 0); + Debug.Log($"now is dadou prev {m_PrevNetworkState.ScaleZ}, tansform is nwo {transform.localScale.z}"); + + if (oldStateDirtyInfo.isPositionDirty || oldStateDirtyInfo.isScaleDirty || (oldStateDirtyInfo.isRotationDirty && SyncRotAngleX && SyncRotAngleY && SyncRotAngleZ)) + { + // ignoring rotation dirty since quaternions will mess with euler angles, making this impossible to determine if the change to a single axis comes + // from an unauthorized transform change or euler to quaternion conversion artifacts. + var dirtyField = oldStateDirtyInfo.isPositionDirty ? "position" : oldStateDirtyInfo.isRotationDirty ? "rotation" : "scale"; + Debug.LogWarning($"A local change to {dirtyField} without authority detected, reverting back to latest interpolated network state!", this); + } } } } diff --git a/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs b/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs index 71a2c41441..b0aeabe98e 100644 --- a/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs @@ -2,6 +2,10 @@ namespace Unity.Netcode.Samples { + /// + /// Used for syncing a transform with client side changes. This includes host. Pure server as owner isn't supported by this. Please use NetworkTransform + /// for transforms that'll always be owned by the server. + /// public class ClientNetworkTransform : NetworkTransform { protected override bool CanWriteToTransform => IsClient && IsOwner; diff --git a/testproject/Assets/Scenes/ZooSam.unity b/testproject/Assets/Scenes/ZooSam.unity index 6a6507b7ed..51d22bb60e 100644 --- a/testproject/Assets/Scenes/ZooSam.unity +++ b/testproject/Assets/Scenes/ZooSam.unity @@ -1304,7 +1304,7 @@ Transform: m_GameObject: {fileID: 108150024} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: -8.25, y: 1.55, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} + m_LocalScale: {x: 5, y: 1, z: 1} m_Children: - {fileID: 153211162} m_Father: {fileID: 0} From c3fc31be27a52335687c9285f5682847eb94f3de Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Tue, 14 Sep 2021 18:45:49 -0400 Subject: [PATCH 076/113] fix for warning to triggering removing debug logs --- .../Components/NetworkTransform.cs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/com.unity.netcode.gameobjects/Components/NetworkTransform.cs b/com.unity.netcode.gameobjects/Components/NetworkTransform.cs index f2d0fca210..d7972df7a5 100644 --- a/com.unity.netcode.gameobjects/Components/NetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Components/NetworkTransform.cs @@ -680,16 +680,10 @@ protected virtual void Update() Debug.DrawLine(interpolatedPosition, interpolatedPosition + Vector3.up, Color.magenta, k_DebugDrawLineTime, false); } - // Apply updated interpolated value - ApplyNetworkStateFromAuthority(m_ReplicatedNetworkState.Value); - // try to update previously consumed NetworkState // if we have any changes, that means made some updates locally // we apply the latest ReplNetworkState again to revert our changes - Debug.Log($"updating dadou prev {m_PrevNetworkState.ScaleZ}, transform is now {transform.localScale.z}"); var oldStateDirtyInfo = UpdateNetworkStateCheckDirtyWithInfo(ref m_PrevNetworkState, 0); - Debug.Log($"now is dadou prev {m_PrevNetworkState.ScaleZ}, tansform is nwo {transform.localScale.z}"); - if (oldStateDirtyInfo.isPositionDirty || oldStateDirtyInfo.isScaleDirty || (oldStateDirtyInfo.isRotationDirty && SyncRotAngleX && SyncRotAngleY && SyncRotAngleZ)) { // ignoring rotation dirty since quaternions will mess with euler angles, making this impossible to determine if the change to a single axis comes @@ -697,6 +691,9 @@ protected virtual void Update() var dirtyField = oldStateDirtyInfo.isPositionDirty ? "position" : oldStateDirtyInfo.isRotationDirty ? "rotation" : "scale"; Debug.LogWarning($"A local change to {dirtyField} without authority detected, reverting back to latest interpolated network state!", this); } + + // Apply updated interpolated value + ApplyNetworkStateFromAuthority(m_ReplicatedNetworkState.Value); } } } From 62f25dd09e026351207f0203f7e16b7a0980ad16 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Tue, 14 Sep 2021 18:57:18 -0400 Subject: [PATCH 077/113] cleanup removing useless FixedUpdateRate --- .../Components/NetworkTransform.cs | 24 ++++++++----------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/com.unity.netcode.gameobjects/Components/NetworkTransform.cs b/com.unity.netcode.gameobjects/Components/NetworkTransform.cs index d7972df7a5..b0df09f9f4 100644 --- a/com.unity.netcode.gameobjects/Components/NetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Components/NetworkTransform.cs @@ -241,12 +241,6 @@ public void NetworkSerialize(NetworkSerializer serializer) public bool Interpolate = true; - /// - /// The base amount of sends per seconds to use when range is disabled - /// - [SerializeField, Range(0, 120), Tooltip("The base amount of sends per seconds to use when range is disabled")] - public float FixedSendsPerSecond = 30f; - protected virtual bool CanWriteToTransform => IsServer; protected readonly NetworkVariable m_ReplicatedNetworkState = new NetworkVariable(new NetworkTransformState()); @@ -256,6 +250,8 @@ public void NetworkSerialize(NetworkSerializer serializer) private const int k_DebugDrawLineTime = 10; + private bool m_HasSentLastValue = false; // used to send one last value, so clients can make the difference between lost replication data (clients extrapolate) and no more data to send. + private BufferedLinearInterpolator m_PositionXInterpolator = new BufferedLinearInterpolatorFloat(); private BufferedLinearInterpolator m_PositionYInterpolator = new BufferedLinearInterpolatorFloat(); private BufferedLinearInterpolator m_PositionZInterpolator = new BufferedLinearInterpolatorFloat(); @@ -294,10 +290,10 @@ protected bool UpdateNetworkStateCheckDirty(ref NetworkTransformState networkSta var rotAngles = InLocalSpace ? m_Transform.localEulerAngles : m_Transform.eulerAngles; var scale = InLocalSpace ? m_Transform.localScale : m_Transform.lossyScale; - bool isDirty = false; - bool isPositionDirty = false; - bool isRotationDirty = false; - bool isScaleDirty = false; + var isDirty = false; + var isPositionDirty = false; + var isRotationDirty = false; + var isScaleDirty = false; // hasPositionZ set to false when it should be true? @@ -618,7 +614,6 @@ private void OnDestroy() m_ReplicatedNetworkState.OnValueChanged -= OnNetworkStateChanged; } - private bool hasSentLastValue = false; private void UpdateNetworkVariable() { if (CanWriteToTransform) @@ -633,17 +628,18 @@ void Send() m_ReplicatedNetworkState.SetDirty(true); AddInterpolatedState(m_LocalAuthoritativeNetworkState); } + var isDirty = UpdateNetworkStateCheckDirty(ref m_LocalAuthoritativeNetworkState, NetworkManager.LocalTime.Time); if (isDirty) { Send(); - hasSentLastValue = false; + m_HasSentLastValue = false; } - else if (!hasSentLastValue && !m_ReplicatedNetworkState.IsDirty()) // check for state.IsDirty since update can happen more than once per tick + else if (!m_HasSentLastValue && !m_ReplicatedNetworkState.IsDirty()) // check for state.IsDirty since update can happen more than once per tick { m_LocalAuthoritativeNetworkState.SentTime = NetworkManager.LocalTime.Time; // time one tick later Send(); - hasSentLastValue = true; + m_HasSentLastValue = true; } } } From 474ca808a48fd40f42bd18d4cdf27e6680a2e62f Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Tue, 14 Sep 2021 19:58:22 -0400 Subject: [PATCH 078/113] restricting protected API, now more encapsulated --- .../Components/NetworkTransform.cs | 42 +++++++++++++------ .../Scripts/ClientNetworkTransform.cs | 11 ++--- 2 files changed, 36 insertions(+), 17 deletions(-) diff --git a/com.unity.netcode.gameobjects/Components/NetworkTransform.cs b/com.unity.netcode.gameobjects/Components/NetworkTransform.cs index b0df09f9f4..f2fd76c63a 100644 --- a/com.unity.netcode.gameobjects/Components/NetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Components/NetworkTransform.cs @@ -243,7 +243,8 @@ public void NetworkSerialize(NetworkSerializer serializer) protected virtual bool CanWriteToTransform => IsServer; - protected readonly NetworkVariable m_ReplicatedNetworkState = new NetworkVariable(new NetworkTransformState()); + private readonly NetworkVariable m_ReplicatedNetworkState = new NetworkVariable(new NetworkTransformState()); + protected NetworkTransformState m_LocalAuthoritativeNetworkState; private NetworkTransformState m_PrevNetworkState; @@ -279,7 +280,7 @@ public void ResetInterpolatedStateToCurrentNetworkState() // updates `NetworkState` properties if they need to and returns a `bool` indicating whether or not there was any changes made // returned boolean would be useful to change encapsulating `NetworkVariable`'s dirty state, e.g. ReplNetworkState.SetDirty(isDirty); - protected bool UpdateNetworkStateCheckDirty(ref NetworkTransformState networkState, double dirtyTime) + protected bool UpdateNetworkStateWithTransform(ref NetworkTransformState networkState, double dirtyTime) { return UpdateNetworkStateCheckDirtyWithInfo(ref networkState, dirtyTime).isDirty; } @@ -579,7 +580,8 @@ private void Awake() // set initial value for spawn if (CanWriteToTransform) { - UpdateNetworkVariable(); + var isDirty = UpdateNetworkStateWithTransform(ref m_LocalAuthoritativeNetworkState, NetworkManager.LocalTime.Time); + SendToGhosts(m_LocalAuthoritativeNetworkState, isDirty); } m_ReplicatedNetworkState.OnValueChanged += OnNetworkStateChanged; @@ -614,7 +616,7 @@ private void OnDestroy() m_ReplicatedNetworkState.OnValueChanged -= OnNetworkStateChanged; } - private void UpdateNetworkVariable() + protected void SendToGhosts(NetworkTransformState newState, bool isDirty, Action sendToGhosts = null) { if (CanWriteToTransform) { @@ -623,22 +625,37 @@ private void UpdateNetworkVariable() // if not dirty and has already sent last value, don't do anything void Send() { - m_PrevNetworkState = m_LocalAuthoritativeNetworkState; - m_ReplicatedNetworkState.Value = m_LocalAuthoritativeNetworkState; + m_PrevNetworkState = newState; + m_ReplicatedNetworkState.Value = newState; m_ReplicatedNetworkState.SetDirty(true); - AddInterpolatedState(m_LocalAuthoritativeNetworkState); + AddInterpolatedState(newState); } - var isDirty = UpdateNetworkStateCheckDirty(ref m_LocalAuthoritativeNetworkState, NetworkManager.LocalTime.Time); if (isDirty) { - Send(); + if (sendToGhosts != null) + { + sendToGhosts.Invoke(); + } + else + { + Send(); + } + m_HasSentLastValue = false; } else if (!m_HasSentLastValue && !m_ReplicatedNetworkState.IsDirty()) // check for state.IsDirty since update can happen more than once per tick { - m_LocalAuthoritativeNetworkState.SentTime = NetworkManager.LocalTime.Time; // time one tick later - Send(); + newState.SentTime = NetworkManager.LocalTime.Time; // time one tick later + if (sendToGhosts != null) + { + sendToGhosts.Invoke(); + } + else + { + Send(); + } + m_HasSentLastValue = true; } } @@ -655,7 +672,8 @@ protected virtual void Update() if (CanWriteToTransform && IsServer) { - UpdateNetworkVariable(); + var isDirty = UpdateNetworkStateWithTransform(ref m_LocalAuthoritativeNetworkState, NetworkManager.LocalTime.Time); + SendToGhosts(m_LocalAuthoritativeNetworkState, isDirty); } // apply interpolated value diff --git a/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs b/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs index b0aeabe98e..e45fe3612b 100644 --- a/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs @@ -15,9 +15,12 @@ protected override void Update() base.Update(); if (NetworkManager.Singleton != null && (NetworkManager.Singleton.IsConnectedClient || NetworkManager.Singleton.IsListening)) { - if (CanWriteToTransform && UpdateNetworkStateCheckDirty(ref m_LocalAuthoritativeNetworkState, NetworkManager.LocalTime.Time)) + if (CanWriteToTransform && UpdateNetworkStateWithTransform(ref m_LocalAuthoritativeNetworkState, NetworkManager.LocalTime.Time)) { - SubmitNetworkStateServerRpc(m_LocalAuthoritativeNetworkState); + SendToGhosts(m_LocalAuthoritativeNetworkState, true, () => + { + SubmitNetworkStateServerRpc(m_LocalAuthoritativeNetworkState); + }); } } } @@ -28,9 +31,7 @@ private void SubmitNetworkStateServerRpc(NetworkTransformState networkState, Ser if (serverParams.Receive.SenderClientId == OwnerClientId) // RPC call when not authorized to write could happen during the RTT interval during which a server's ownership change hasn't reached the client yet { m_LocalAuthoritativeNetworkState = networkState; - m_ReplicatedNetworkState.Value = networkState; - m_ReplicatedNetworkState.SetDirty(true); - AddInterpolatedState(networkState); + SendToGhosts(networkState, true); } } } From 5863918a92bbedf5129ecfab707fdee023675742 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Wed, 15 Sep 2021 16:58:12 -0400 Subject: [PATCH 079/113] Adding doc on CanWriteToTransform cleaning up some warnings when switching ownership --- .../Components/NetworkTransform.cs | 116 +++++++++++------- 1 file changed, 69 insertions(+), 47 deletions(-) diff --git a/com.unity.netcode.gameobjects/Components/NetworkTransform.cs b/com.unity.netcode.gameobjects/Components/NetworkTransform.cs index f2fd76c63a..1d24187fff 100644 --- a/com.unity.netcode.gameobjects/Components/NetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Components/NetworkTransform.cs @@ -241,6 +241,12 @@ public void NetworkSerialize(NetworkSerializer serializer) public bool Interpolate = true; + /// + /// Used to determine who can write to this transform. Server side only. + /// Changing this value alone will not allow you to create a NetworkTransform which can be written to by clients. See the NetworkClientTransform Sample + /// in the package samples for how to implement a NetworkTransform with client write support. + /// If using different values, please use RPCs to write to the server. Netcode doesn't support client side network variable writing + /// protected virtual bool CanWriteToTransform => IsServer; private readonly NetworkVariable m_ReplicatedNetworkState = new NetworkVariable(new NetworkTransformState()); @@ -265,27 +271,29 @@ public void NetworkSerialize(NetworkSerializer serializer) private Transform m_Transform; // cache the transform component to reduce unnecessary bounce between managed and native - public void ResetInterpolatedStateToCurrentNetworkState() + public void ResetInterpolatedStateToCurrentAuthoritativeState() { - m_PositionXInterpolator.ResetTo(m_ReplicatedNetworkState.Value.PositionX); - m_PositionYInterpolator.ResetTo(m_ReplicatedNetworkState.Value.PositionY); - m_PositionZInterpolator.ResetTo(m_ReplicatedNetworkState.Value.PositionZ); + m_PositionXInterpolator.ResetTo(m_LocalAuthoritativeNetworkState.PositionX); + m_PositionYInterpolator.ResetTo(m_LocalAuthoritativeNetworkState.PositionY); + m_PositionZInterpolator.ResetTo(m_LocalAuthoritativeNetworkState.PositionZ); + + m_RotationInterpolator.ResetTo(Quaternion.Euler(m_LocalAuthoritativeNetworkState.Rotation)); - m_RotationInterpolator.ResetTo(Quaternion.Euler(m_ReplicatedNetworkState.Value.Rotation)); + m_ScaleXInterpolator.ResetTo(m_LocalAuthoritativeNetworkState.ScaleX); + m_ScaleYInterpolator.ResetTo(m_LocalAuthoritativeNetworkState.ScaleY); + m_ScaleZInterpolator.ResetTo(m_LocalAuthoritativeNetworkState.ScaleZ); + Debug.Log($"Resetting interpolated state to {m_PositionXInterpolator.GetInterpolatedValue()}, prev transform is {m_PrevNetworkState.PositionX}"); - m_ScaleXInterpolator.ResetTo(m_ReplicatedNetworkState.Value.ScaleX); - m_ScaleYInterpolator.ResetTo(m_ReplicatedNetworkState.Value.ScaleY); - m_ScaleZInterpolator.ResetTo(m_ReplicatedNetworkState.Value.ScaleZ); } // updates `NetworkState` properties if they need to and returns a `bool` indicating whether or not there was any changes made // returned boolean would be useful to change encapsulating `NetworkVariable`'s dirty state, e.g. ReplNetworkState.SetDirty(isDirty); protected bool UpdateNetworkStateWithTransform(ref NetworkTransformState networkState, double dirtyTime) { - return UpdateNetworkStateCheckDirtyWithInfo(ref networkState, dirtyTime).isDirty; + return UpdateNetworkStateWithTransformWithInfo(ref networkState, dirtyTime).isDirty; } - private (bool isDirty, bool isPositionDirty, bool isRotationDirty, bool isScaleDirty) UpdateNetworkStateCheckDirtyWithInfo(ref NetworkTransformState networkState, double dirtyTime) + private (bool isDirty, bool isPositionDirty, bool isRotationDirty, bool isScaleDirty) UpdateNetworkStateWithTransformWithInfo(ref NetworkTransformState networkState, double dirtyTime) { var position = InLocalSpace ? m_Transform.localPosition : m_Transform.position; var rotAngles = InLocalSpace ? m_Transform.localEulerAngles : m_Transform.eulerAngles; @@ -304,6 +312,9 @@ protected bool UpdateNetworkStateWithTransform(ref NetworkTransformState network isDirty = true; } + Debug.Log($"update before {m_PrevNetworkState.PositionX}"); + + if (SyncPositionX && Mathf.Abs(networkState.PositionX - position.x) >= PositionThreshold && !Mathf.Approximately(networkState.PositionX, position.x)) @@ -312,6 +323,7 @@ protected bool UpdateNetworkStateWithTransform(ref NetworkTransformState network networkState.HasPositionX = true; isPositionDirty = true; } + Debug.Log($"update after {m_PrevNetworkState.PositionX}"); if (SyncPositionY && Mathf.Abs(networkState.PositionY - position.y) >= PositionThreshold && @@ -397,7 +409,9 @@ protected bool UpdateNetworkStateWithTransform(ref NetworkTransformState network private void ApplyNetworkStateFromAuthority(NetworkTransformState networkState) { + Debug.Log($"before {m_PrevNetworkState.PositionX}"); m_PrevNetworkState = networkState; + Debug.Log($"after {m_PrevNetworkState.PositionX}"); var interpolatedPosition = InLocalSpace ? m_Transform.localPosition : m_Transform.position; var interpolatedRotAngles = InLocalSpace ? m_Transform.localEulerAngles : m_Transform.eulerAngles; @@ -465,6 +479,8 @@ private void ApplyNetworkStateFromAuthority(NetworkTransformState networkState) } m_PrevNetworkState.Position = interpolatedPosition; + Debug.Log($"after after {m_PrevNetworkState.PositionX}"); + } // RotAngles Apply @@ -589,6 +605,7 @@ private void Awake() public override void OnNetworkSpawn() { + m_LocalAuthoritativeNetworkState = m_ReplicatedNetworkState.Value; Initialize(); } @@ -597,9 +614,14 @@ public override void OnGainedOwnership() Initialize(); } + public override void OnLostOwnership() + { + Initialize(); + } + private void Initialize() { - ResetInterpolatedStateToCurrentNetworkState(); // useful for late joining + ResetInterpolatedStateToCurrentAuthoritativeState(); // useful for late joining if (CanWriteToTransform) { @@ -618,46 +640,42 @@ private void OnDestroy() protected void SendToGhosts(NetworkTransformState newState, bool isDirty, Action sendToGhosts = null) { - if (CanWriteToTransform) + // if dirty, send + // if not dirty anymore, but hasn't sent last value for extrapolation, still set isDirty + // if not dirty and has already sent last value, don't do anything + void Send() { - // if dirty, send - // if not dirty anymore, but hasn't sent last value for extrapolation, still set isDirty - // if not dirty and has already sent last value, don't do anything - void Send() + m_ReplicatedNetworkState.Value = newState; + m_ReplicatedNetworkState.SetDirty(true); + AddInterpolatedState(newState); + } + + if (isDirty) + { + if (sendToGhosts != null) { - m_PrevNetworkState = newState; - m_ReplicatedNetworkState.Value = newState; - m_ReplicatedNetworkState.SetDirty(true); - AddInterpolatedState(newState); + sendToGhosts.Invoke(); } - - if (isDirty) + else { - if (sendToGhosts != null) - { - sendToGhosts.Invoke(); - } - else - { - Send(); - } + Send(); + } - m_HasSentLastValue = false; + m_HasSentLastValue = false; + } + else if (!m_HasSentLastValue && !m_ReplicatedNetworkState.IsDirty()) // check for state.IsDirty since update can happen more than once per tick + { + newState.SentTime = NetworkManager.LocalTime.Time; // time one tick later + if (sendToGhosts != null) + { + sendToGhosts.Invoke(); } - else if (!m_HasSentLastValue && !m_ReplicatedNetworkState.IsDirty()) // check for state.IsDirty since update can happen more than once per tick + else { - newState.SentTime = NetworkManager.LocalTime.Time; // time one tick later - if (sendToGhosts != null) - { - sendToGhosts.Invoke(); - } - else - { - Send(); - } - - m_HasSentLastValue = true; + Send(); } + + m_HasSentLastValue = true; } } @@ -670,10 +688,14 @@ protected virtual void Update() return; } - if (CanWriteToTransform && IsServer) + if (CanWriteToTransform) { - var isDirty = UpdateNetworkStateWithTransform(ref m_LocalAuthoritativeNetworkState, NetworkManager.LocalTime.Time); - SendToGhosts(m_LocalAuthoritativeNetworkState, isDirty); + if (IsServer) + { + var isDirty = UpdateNetworkStateWithTransform(ref m_LocalAuthoritativeNetworkState, NetworkManager.LocalTime.Time); + SendToGhosts(m_LocalAuthoritativeNetworkState, isDirty); + } + m_PrevNetworkState = m_LocalAuthoritativeNetworkState; } // apply interpolated value @@ -697,7 +719,7 @@ protected virtual void Update() // try to update previously consumed NetworkState // if we have any changes, that means made some updates locally // we apply the latest ReplNetworkState again to revert our changes - var oldStateDirtyInfo = UpdateNetworkStateCheckDirtyWithInfo(ref m_PrevNetworkState, 0); + var oldStateDirtyInfo = UpdateNetworkStateWithTransformWithInfo(ref m_PrevNetworkState, 0); if (oldStateDirtyInfo.isPositionDirty || oldStateDirtyInfo.isScaleDirty || (oldStateDirtyInfo.isRotationDirty && SyncRotAngleX && SyncRotAngleY && SyncRotAngleZ)) { // ignoring rotation dirty since quaternions will mess with euler angles, making this impossible to determine if the change to a single axis comes From e65ccbff2dbf3755ae1433a69012df7337fb621e Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Wed, 15 Sep 2021 22:03:42 -0400 Subject: [PATCH 080/113] ClientNetworkTransform works with now limited API --- .../Components/NetworkTransform.cs | 167 ++++++++++-------- .../Scripts/ClientNetworkTransform.cs | 110 ++++++++++-- 2 files changed, 191 insertions(+), 86 deletions(-) diff --git a/com.unity.netcode.gameobjects/Components/NetworkTransform.cs b/com.unity.netcode.gameobjects/Components/NetworkTransform.cs index 1d24187fff..697ecb4771 100644 --- a/com.unity.netcode.gameobjects/Components/NetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Components/NetworkTransform.cs @@ -7,6 +7,8 @@ namespace Unity.Netcode.Components { /// /// A component for syncing transforms + /// NetworkTransform will read the underlying transform and replicate it to clients. + /// The replicated value will be automatically be interpolated (if active) and applied to the underlying GameObject's transform /// [AddComponentMenu("Netcode/" + nameof(NetworkTransform))] [DefaultExecutionOrder(1000)] // this is needed to catch the update time after the transform was updated by user scripts @@ -251,7 +253,7 @@ public void NetworkSerialize(NetworkSerializer serializer) private readonly NetworkVariable m_ReplicatedNetworkState = new NetworkVariable(new NetworkTransformState()); - protected NetworkTransformState m_LocalAuthoritativeNetworkState; + private NetworkTransformState m_LocalAuthoritativeNetworkState; private NetworkTransformState m_PrevNetworkState; @@ -269,9 +271,63 @@ public void NetworkSerialize(NetworkSerializer serializer) private readonly List> m_AllFloatInterpolators = new List>(6); - private Transform m_Transform; // cache the transform component to reduce unnecessary bounce between managed and native + // private Transform m_Transform; // cache the transform component to reduce unnecessary bounce between managed and native - public void ResetInterpolatedStateToCurrentAuthoritativeState() + private int lastSentTick; + public void TryCommitTransformToServer(Transform transformToCommit, double dirtyTime) + { + var isDirty = ApplyTransformToNetworkState(ref m_LocalAuthoritativeNetworkState, dirtyTime, transformToCommit); + + void Send() + { + if (IsServer) + { + // server RPC takes a few frames to execute server side, we want this to execute immediately + CommitLocallyAndReplicate(m_LocalAuthoritativeNetworkState); + } + else + { + CommitTransformServerRpc(m_LocalAuthoritativeNetworkState); + } + } + + // if dirty, send + // if not dirty anymore, but hasn't sent last value for limiting extrapolation, still set isDirty + // if not dirty and has already sent last value, don't do anything + // extrapolation works by using last two values. if it doesn't receive anything anymore, it'll continue to extrapolate. + // This is great in case there's message loss, not so great if we just don't have new values to send. + // the following will send one last "copied" value so unclamped interpolation tries to extrapolate between two identical values, effectively + // making it immobile. + if (isDirty) + { + Send(); + m_HasSentLastValue = false; + lastSentTick = NetworkManager.LocalTime.Tick; + } + else if (!m_HasSentLastValue && NetworkManager.LocalTime.Tick >= lastSentTick + 1) // check for state.IsDirty since update can happen more than once per tick. No need for client, RPCs will just queue up + { + m_LocalAuthoritativeNetworkState.SentTime = NetworkManager.LocalTime.Time; // time 1+ tick later + Send(); + m_HasSentLastValue = true; + } + } + + [ServerRpc(RequireOwnership = false)] + private void CommitTransformServerRpc(NetworkTransformState networkState, ServerRpcParams serverParams = default) + { + if (serverParams.Receive.SenderClientId == OwnerClientId) // RPC call when not authorized to write could happen during the RTT interval during which a server's ownership change hasn't reached the client yet + { + CommitLocallyAndReplicate(networkState); + } + } + + private void CommitLocallyAndReplicate(NetworkTransformState networkState) + { + m_LocalAuthoritativeNetworkState = networkState; + ReplicateToGhosts(networkState); + } + + private void ResetInterpolatedStateToCurrentAuthoritativeState() { m_PositionXInterpolator.ResetTo(m_LocalAuthoritativeNetworkState.PositionX); m_PositionYInterpolator.ResetTo(m_LocalAuthoritativeNetworkState.PositionY); @@ -283,21 +339,20 @@ public void ResetInterpolatedStateToCurrentAuthoritativeState() m_ScaleYInterpolator.ResetTo(m_LocalAuthoritativeNetworkState.ScaleY); m_ScaleZInterpolator.ResetTo(m_LocalAuthoritativeNetworkState.ScaleZ); Debug.Log($"Resetting interpolated state to {m_PositionXInterpolator.GetInterpolatedValue()}, prev transform is {m_PrevNetworkState.PositionX}"); - } // updates `NetworkState` properties if they need to and returns a `bool` indicating whether or not there was any changes made // returned boolean would be useful to change encapsulating `NetworkVariable`'s dirty state, e.g. ReplNetworkState.SetDirty(isDirty); - protected bool UpdateNetworkStateWithTransform(ref NetworkTransformState networkState, double dirtyTime) + internal bool ApplyTransformToNetworkState(ref NetworkTransformState networkState, double dirtyTime, Transform transformToUse) { - return UpdateNetworkStateWithTransformWithInfo(ref networkState, dirtyTime).isDirty; + return ApplyTransformToNetworkStateWithInfo(ref networkState, dirtyTime, transformToUse).isDirty; } - private (bool isDirty, bool isPositionDirty, bool isRotationDirty, bool isScaleDirty) UpdateNetworkStateWithTransformWithInfo(ref NetworkTransformState networkState, double dirtyTime) + private (bool isDirty, bool isPositionDirty, bool isRotationDirty, bool isScaleDirty) ApplyTransformToNetworkStateWithInfo(ref NetworkTransformState networkState, double dirtyTime, Transform transformToUse) { - var position = InLocalSpace ? m_Transform.localPosition : m_Transform.position; - var rotAngles = InLocalSpace ? m_Transform.localEulerAngles : m_Transform.eulerAngles; - var scale = InLocalSpace ? m_Transform.localScale : m_Transform.lossyScale; + var position = InLocalSpace ? transformToUse.localPosition : transformToUse.position; + var rotAngles = InLocalSpace ? transformToUse.localEulerAngles : transformToUse.eulerAngles; + var scale = InLocalSpace ? transformToUse.localScale : transformToUse.lossyScale; var isDirty = false; var isPositionDirty = false; @@ -407,15 +462,15 @@ protected bool UpdateNetworkStateWithTransform(ref NetworkTransformState network return (isDirty, isPositionDirty, isRotationDirty, isScaleDirty); } - private void ApplyNetworkStateFromAuthority(NetworkTransformState networkState) + private void ApplyInterpolatedNetworkStateToTransform(NetworkTransformState networkState, Transform transformToUpdate) { Debug.Log($"before {m_PrevNetworkState.PositionX}"); m_PrevNetworkState = networkState; Debug.Log($"after {m_PrevNetworkState.PositionX}"); - var interpolatedPosition = InLocalSpace ? m_Transform.localPosition : m_Transform.position; - var interpolatedRotAngles = InLocalSpace ? m_Transform.localEulerAngles : m_Transform.eulerAngles; - var interpolatedScale = InLocalSpace ? m_Transform.localScale : m_Transform.lossyScale; + var interpolatedPosition = InLocalSpace ? transformToUpdate.localPosition : transformToUpdate.position; + var interpolatedRotAngles = InLocalSpace ? transformToUpdate.localEulerAngles : transformToUpdate.eulerAngles; + var interpolatedScale = InLocalSpace ? transformToUpdate.localScale : transformToUpdate.lossyScale; // InLocalSpace Read InLocalSpace = networkState.InLocalSpace; @@ -471,11 +526,11 @@ private void ApplyNetworkStateFromAuthority(NetworkTransformState networkState) { if (InLocalSpace) { - m_Transform.localPosition = interpolatedPosition; + transformToUpdate.localPosition = interpolatedPosition; } else { - m_Transform.position = interpolatedPosition; + transformToUpdate.position = interpolatedPosition; } m_PrevNetworkState.Position = interpolatedPosition; @@ -488,11 +543,11 @@ private void ApplyNetworkStateFromAuthority(NetworkTransformState networkState) { if (InLocalSpace) { - m_Transform.localRotation = Quaternion.Euler(interpolatedRotAngles); + transformToUpdate.localRotation = Quaternion.Euler(interpolatedRotAngles); } else { - m_Transform.rotation = Quaternion.Euler(interpolatedRotAngles); + transformToUpdate.rotation = Quaternion.Euler(interpolatedRotAngles); } m_PrevNetworkState.Rotation = interpolatedRotAngles; @@ -503,21 +558,22 @@ private void ApplyNetworkStateFromAuthority(NetworkTransformState networkState) { if (InLocalSpace) { - m_Transform.localScale = interpolatedScale; + transformToUpdate.localScale = interpolatedScale; } else { - m_Transform.localScale = Vector3.one; - var lossyScale = m_Transform.lossyScale; + transformToUpdate.localScale = Vector3.one; + var lossyScale = transformToUpdate.lossyScale; // todo this conversion is messing with interpolation. local scale interpolates fine, lossy scale is jittery. must investigate. MTT-1208 - m_Transform.localScale = new Vector3(interpolatedScale.x / lossyScale.x, interpolatedScale.y / lossyScale.y, interpolatedScale.z / lossyScale.z); + transformToUpdate.localScale = new Vector3(interpolatedScale.x / lossyScale.x, interpolatedScale.y / lossyScale.y, interpolatedScale.z / lossyScale.z); } m_PrevNetworkState.Scale = interpolatedScale; } + Debug.DrawLine(transformToUpdate.position, transformToUpdate.position + Vector3.up, Color.magenta, 10, false); } - protected void AddInterpolatedState(NetworkTransformState newState) + private void AddInterpolatedState(NetworkTransformState newState) { var sentTime = new NetworkTime(NetworkManager.Singleton.ServerTime.TickRate, newState.SentTime); @@ -568,6 +624,8 @@ private void OnNetworkStateChanged(NetworkTransformState oldState, NetworkTransf return; } + Debug.DrawLine(newState.Position, newState.Position + Vector3.up + Vector3.left, Color.green, 10, false); + AddInterpolatedState(newState); if (NetworkManager.Singleton.LogLevel == LogLevel.Developer) @@ -579,8 +637,6 @@ private void OnNetworkStateChanged(NetworkTransformState oldState, NetworkTransf private void Awake() { - m_Transform = transform; - if (m_AllFloatInterpolators.Count == 0) { m_AllFloatInterpolators.Add(m_PositionXInterpolator); @@ -593,11 +649,9 @@ private void Awake() // ReplNetworkState.NetworkVariableChannel = NetworkChannel.PositionUpdate; // todo figure this out, talk with Matt/Fatih, this should be unreliable - // set initial value for spawn if (CanWriteToTransform) { - var isDirty = UpdateNetworkStateWithTransform(ref m_LocalAuthoritativeNetworkState, NetworkManager.LocalTime.Time); - SendToGhosts(m_LocalAuthoritativeNetworkState, isDirty); + TryCommitTransformToServer(transform, NetworkManager.LocalTime.Time); } m_ReplicatedNetworkState.OnValueChanged += OnNetworkStateChanged; @@ -629,7 +683,7 @@ private void Initialize() } else { - ApplyNetworkStateFromAuthority(m_ReplicatedNetworkState.Value); + ApplyInterpolatedNetworkStateToTransform(m_ReplicatedNetworkState.Value, transform); } } @@ -638,45 +692,12 @@ private void OnDestroy() m_ReplicatedNetworkState.OnValueChanged -= OnNetworkStateChanged; } - protected void SendToGhosts(NetworkTransformState newState, bool isDirty, Action sendToGhosts = null) + // todo method only used once + private void ReplicateToGhosts(NetworkTransformState newState) { - // if dirty, send - // if not dirty anymore, but hasn't sent last value for extrapolation, still set isDirty - // if not dirty and has already sent last value, don't do anything - void Send() - { - m_ReplicatedNetworkState.Value = newState; - m_ReplicatedNetworkState.SetDirty(true); - AddInterpolatedState(newState); - } - - if (isDirty) - { - if (sendToGhosts != null) - { - sendToGhosts.Invoke(); - } - else - { - Send(); - } - - m_HasSentLastValue = false; - } - else if (!m_HasSentLastValue && !m_ReplicatedNetworkState.IsDirty()) // check for state.IsDirty since update can happen more than once per tick - { - newState.SentTime = NetworkManager.LocalTime.Time; // time one tick later - if (sendToGhosts != null) - { - sendToGhosts.Invoke(); - } - else - { - Send(); - } - - m_HasSentLastValue = true; - } + m_ReplicatedNetworkState.Value = newState; + m_ReplicatedNetworkState.SetDirty(true); + AddInterpolatedState(newState); } // todo this is currently in update, to be able to catch any transform changes. A FixedUpdate mode could be added to be less intense, but it'd be @@ -692,9 +713,11 @@ protected virtual void Update() { if (IsServer) { - var isDirty = UpdateNetworkStateWithTransform(ref m_LocalAuthoritativeNetworkState, NetworkManager.LocalTime.Time); - SendToGhosts(m_LocalAuthoritativeNetworkState, isDirty); + TryCommitTransformToServer(transform, NetworkManager.LocalTime.Time); + // var isDirty = ApplyTransformToNetworkState(ref m_LocalAuthoritativeNetworkState, NetworkManager.LocalTime.Time, transform); + // ReplicateToGhosts(m_LocalAuthoritativeNetworkState, isDirty); } + m_PrevNetworkState = m_LocalAuthoritativeNetworkState; } @@ -719,17 +742,17 @@ protected virtual void Update() // try to update previously consumed NetworkState // if we have any changes, that means made some updates locally // we apply the latest ReplNetworkState again to revert our changes - var oldStateDirtyInfo = UpdateNetworkStateWithTransformWithInfo(ref m_PrevNetworkState, 0); + var oldStateDirtyInfo = ApplyTransformToNetworkStateWithInfo(ref m_PrevNetworkState, 0, transform); if (oldStateDirtyInfo.isPositionDirty || oldStateDirtyInfo.isScaleDirty || (oldStateDirtyInfo.isRotationDirty && SyncRotAngleX && SyncRotAngleY && SyncRotAngleZ)) { // ignoring rotation dirty since quaternions will mess with euler angles, making this impossible to determine if the change to a single axis comes // from an unauthorized transform change or euler to quaternion conversion artifacts. var dirtyField = oldStateDirtyInfo.isPositionDirty ? "position" : oldStateDirtyInfo.isRotationDirty ? "rotation" : "scale"; - Debug.LogWarning($"A local change to {dirtyField} without authority detected, reverting back to latest interpolated network state!", this); + Debug.LogWarning($"A local change to {dirtyField} without authority detected, reverting back to latest interpolated network state! Please use CommitUpdate() or your own [ServerRpc]", this); } // Apply updated interpolated value - ApplyNetworkStateFromAuthority(m_ReplicatedNetworkState.Value); + ApplyInterpolatedNetworkStateToTransform(m_ReplicatedNetworkState.Value, transform); } } } diff --git a/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs b/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs index e45fe3612b..740c6e4f7e 100644 --- a/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs @@ -1,4 +1,5 @@ using Unity.Netcode.Components; +using UnityEngine; namespace Unity.Netcode.Samples { @@ -10,29 +11,110 @@ public class ClientNetworkTransform : NetworkTransform { protected override bool CanWriteToTransform => IsClient && IsOwner; + // private new NetworkTransformState m_LocalAuthoritativeNetworkState; + + // private Transform m_Transform; + // void Awake() + // { + // // duplicated code with ServerNetworkTransform + // + // m_Transform = transform; + // + // // set initial value for spawn + // if (CanWriteToTransform) + // { + // CommitTransformToServer(transform, NetworkManager.LocalTime.Time); + // // var isDirty = ApplyTransformToNetworkState(ref m_LocalAuthoritativeNetworkState, NetworkManager.LocalTime.Time, m_Transform); + // // ReplicateToGhosts(m_LocalAuthoritativeNetworkState, isDirty); + // } + // } + protected override void Update() { base.Update(); if (NetworkManager.Singleton != null && (NetworkManager.Singleton.IsConnectedClient || NetworkManager.Singleton.IsListening)) { - if (CanWriteToTransform && UpdateNetworkStateWithTransform(ref m_LocalAuthoritativeNetworkState, NetworkManager.LocalTime.Time)) + if (CanWriteToTransform) { - SendToGhosts(m_LocalAuthoritativeNetworkState, true, () => - { - SubmitNetworkStateServerRpc(m_LocalAuthoritativeNetworkState); - }); + TryCommitTransformToServer(transform, NetworkManager.LocalTime.Time); } } } - [ServerRpc(RequireOwnership = false)] - private void SubmitNetworkStateServerRpc(NetworkTransformState networkState, ServerRpcParams serverParams = default) - { - if (serverParams.Receive.SenderClientId == OwnerClientId) // RPC call when not authorized to write could happen during the RTT interval during which a server's ownership change hasn't reached the client yet - { - m_LocalAuthoritativeNetworkState = networkState; - SendToGhosts(networkState, true); - } - } + + + + // // SDK + // class abstract NetworkTransform + // { + // protected void CommitToServer() + // { + // CommitServerRpc(); + // } + // + // [ServerRpc] + // protected void CommitServerRpc(Transform t) + // { + // MyStateNetVar.Value = t; + // } + // + // void Update() + // { + // this.transform = Interpolate(MyStateNetVar.Value); + // } + // + // NetworkVariable MyStateNetVar; + // + // public Action OnValueChanged; + // } + // + // class ClientNetworkTransform : NetworkTransform + // { + // void Update() + // { + // // read my gameObject.transform + // if (isClient && isOwner) + // { + // this.CommitServerRpc(this.transform); + // } + // // check if tries to change server side and revert + // } + // } + // + // class ServerNetworkTransform : NetworkTransform + // { + // void Update() + // { + // if (isServer) + // { + // this.CommitServerRpc(this.transform); + // } + // // check if tries to change client side and revert + // } + // } + // + // class AnticipationNetworkTransform : NetworkTransform + // { + // void Update() + // { + // if (IsServer) + // { + // this.CommitServerRpc(this.transform); + // } + // } + // } + + + /* + * + * - add a Commit() explicit thing to NT +- ClientNT / ServerNT / etc. have convenience link between GO.transform and Commit +- if you write to GO.transform in NT desync, maybe someday we show you that in a gfx help +Matt Walsh to Everyone (4:07 PM) +- gives users easier write their own / more liberty / NT doesn’t seize the host +Seize the transform +- Commit() should send an RPC to the server if I’m a client +- more symmetrical + */ } } From 707e1b44c7875716a719e3685906133b7bd9d9f5 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Wed, 15 Sep 2021 22:05:20 -0400 Subject: [PATCH 081/113] cleanup comments --- .../Scripts/ClientNetworkTransform.cs | 94 ------------------- 1 file changed, 94 deletions(-) diff --git a/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs b/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs index 740c6e4f7e..d9ac224afe 100644 --- a/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs @@ -11,24 +11,6 @@ public class ClientNetworkTransform : NetworkTransform { protected override bool CanWriteToTransform => IsClient && IsOwner; - // private new NetworkTransformState m_LocalAuthoritativeNetworkState; - - // private Transform m_Transform; - // void Awake() - // { - // // duplicated code with ServerNetworkTransform - // - // m_Transform = transform; - // - // // set initial value for spawn - // if (CanWriteToTransform) - // { - // CommitTransformToServer(transform, NetworkManager.LocalTime.Time); - // // var isDirty = ApplyTransformToNetworkState(ref m_LocalAuthoritativeNetworkState, NetworkManager.LocalTime.Time, m_Transform); - // // ReplicateToGhosts(m_LocalAuthoritativeNetworkState, isDirty); - // } - // } - protected override void Update() { base.Update(); @@ -40,81 +22,5 @@ protected override void Update() } } } - - - - - // // SDK - // class abstract NetworkTransform - // { - // protected void CommitToServer() - // { - // CommitServerRpc(); - // } - // - // [ServerRpc] - // protected void CommitServerRpc(Transform t) - // { - // MyStateNetVar.Value = t; - // } - // - // void Update() - // { - // this.transform = Interpolate(MyStateNetVar.Value); - // } - // - // NetworkVariable MyStateNetVar; - // - // public Action OnValueChanged; - // } - // - // class ClientNetworkTransform : NetworkTransform - // { - // void Update() - // { - // // read my gameObject.transform - // if (isClient && isOwner) - // { - // this.CommitServerRpc(this.transform); - // } - // // check if tries to change server side and revert - // } - // } - // - // class ServerNetworkTransform : NetworkTransform - // { - // void Update() - // { - // if (isServer) - // { - // this.CommitServerRpc(this.transform); - // } - // // check if tries to change client side and revert - // } - // } - // - // class AnticipationNetworkTransform : NetworkTransform - // { - // void Update() - // { - // if (IsServer) - // { - // this.CommitServerRpc(this.transform); - // } - // } - // } - - - /* - * - * - add a Commit() explicit thing to NT -- ClientNT / ServerNT / etc. have convenience link between GO.transform and Commit -- if you write to GO.transform in NT desync, maybe someday we show you that in a gfx help -Matt Walsh to Everyone (4:07 PM) -- gives users easier write their own / more liberty / NT doesn’t seize the host -Seize the transform -- Commit() should send an RPC to the server if I’m a client -- more symmetrical - */ } } From a2f04c7f2729005b59f10bf736ca5fdb462413db Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Wed, 15 Sep 2021 22:06:26 -0400 Subject: [PATCH 082/113] removing useless method --- .../Components/NetworkTransform.cs | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/com.unity.netcode.gameobjects/Components/NetworkTransform.cs b/com.unity.netcode.gameobjects/Components/NetworkTransform.cs index 697ecb4771..dfe38d5b70 100644 --- a/com.unity.netcode.gameobjects/Components/NetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Components/NetworkTransform.cs @@ -324,7 +324,9 @@ private void CommitTransformServerRpc(NetworkTransformState networkState, Server private void CommitLocallyAndReplicate(NetworkTransformState networkState) { m_LocalAuthoritativeNetworkState = networkState; - ReplicateToGhosts(networkState); + m_ReplicatedNetworkState.Value = networkState; + m_ReplicatedNetworkState.SetDirty(true); + AddInterpolatedState(networkState); } private void ResetInterpolatedStateToCurrentAuthoritativeState() @@ -692,14 +694,6 @@ private void OnDestroy() m_ReplicatedNetworkState.OnValueChanged -= OnNetworkStateChanged; } - // todo method only used once - private void ReplicateToGhosts(NetworkTransformState newState) - { - m_ReplicatedNetworkState.Value = newState; - m_ReplicatedNetworkState.SetDirty(true); - AddInterpolatedState(newState); - } - // todo this is currently in update, to be able to catch any transform changes. A FixedUpdate mode could be added to be less intense, but it'd be // conditional to users only making transform update changes in FixedUpdate. protected virtual void Update() From b77980f4670207256aa126c4b50679883342128e Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Wed, 15 Sep 2021 22:07:43 -0400 Subject: [PATCH 083/113] removing useless todo removing debug logs --- .../Interpolator/BufferedLinearInterpolator.cs | 1 - .../Components/NetworkTransform.cs | 9 --------- 2 files changed, 10 deletions(-) diff --git a/com.unity.netcode.gameobjects/Components/Interpolator/BufferedLinearInterpolator.cs b/com.unity.netcode.gameobjects/Components/Interpolator/BufferedLinearInterpolator.cs index 63e6084f9c..1c54b9d268 100644 --- a/com.unity.netcode.gameobjects/Components/Interpolator/BufferedLinearInterpolator.cs +++ b/com.unity.netcode.gameobjects/Components/Interpolator/BufferedLinearInterpolator.cs @@ -132,7 +132,6 @@ public T Update(float deltaTime) if (t > 3) // max extrapolation { - // TODO this causes issues with teleport, investigate // todo make this configurable t = 1; } diff --git a/com.unity.netcode.gameobjects/Components/NetworkTransform.cs b/com.unity.netcode.gameobjects/Components/NetworkTransform.cs index dfe38d5b70..a19d27e16c 100644 --- a/com.unity.netcode.gameobjects/Components/NetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Components/NetworkTransform.cs @@ -340,7 +340,6 @@ private void ResetInterpolatedStateToCurrentAuthoritativeState() m_ScaleXInterpolator.ResetTo(m_LocalAuthoritativeNetworkState.ScaleX); m_ScaleYInterpolator.ResetTo(m_LocalAuthoritativeNetworkState.ScaleY); m_ScaleZInterpolator.ResetTo(m_LocalAuthoritativeNetworkState.ScaleZ); - Debug.Log($"Resetting interpolated state to {m_PositionXInterpolator.GetInterpolatedValue()}, prev transform is {m_PrevNetworkState.PositionX}"); } // updates `NetworkState` properties if they need to and returns a `bool` indicating whether or not there was any changes made @@ -369,9 +368,6 @@ internal bool ApplyTransformToNetworkState(ref NetworkTransformState networkStat isDirty = true; } - Debug.Log($"update before {m_PrevNetworkState.PositionX}"); - - if (SyncPositionX && Mathf.Abs(networkState.PositionX - position.x) >= PositionThreshold && !Mathf.Approximately(networkState.PositionX, position.x)) @@ -380,7 +376,6 @@ internal bool ApplyTransformToNetworkState(ref NetworkTransformState networkStat networkState.HasPositionX = true; isPositionDirty = true; } - Debug.Log($"update after {m_PrevNetworkState.PositionX}"); if (SyncPositionY && Mathf.Abs(networkState.PositionY - position.y) >= PositionThreshold && @@ -466,9 +461,7 @@ internal bool ApplyTransformToNetworkState(ref NetworkTransformState networkStat private void ApplyInterpolatedNetworkStateToTransform(NetworkTransformState networkState, Transform transformToUpdate) { - Debug.Log($"before {m_PrevNetworkState.PositionX}"); m_PrevNetworkState = networkState; - Debug.Log($"after {m_PrevNetworkState.PositionX}"); var interpolatedPosition = InLocalSpace ? transformToUpdate.localPosition : transformToUpdate.position; var interpolatedRotAngles = InLocalSpace ? transformToUpdate.localEulerAngles : transformToUpdate.eulerAngles; @@ -536,8 +529,6 @@ private void ApplyInterpolatedNetworkStateToTransform(NetworkTransformState netw } m_PrevNetworkState.Position = interpolatedPosition; - Debug.Log($"after after {m_PrevNetworkState.PositionX}"); - } // RotAngles Apply From 6846e73ace4f891b35a0f5e4f75cf2e708165ac6 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Wed, 15 Sep 2021 22:09:16 -0400 Subject: [PATCH 084/113] reverting back changes to NT tests --- .../NetworkTransformStateTests.cs | 77 +++++++++---------- testproject/Assets/Scenes/ZooSam.unity | 4 - 2 files changed, 35 insertions(+), 46 deletions(-) diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/NetworkTransformStateTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/NetworkTransformStateTests.cs index da71713cb0..b75c6991df 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/NetworkTransformStateTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/NetworkTransformStateTests.cs @@ -1,3 +1,4 @@ +using System.Collections; using NUnit.Framework; using Unity.Netcode.Components; using UnityEngine; @@ -6,15 +7,6 @@ namespace Unity.Netcode.RuntimeTests { public class NetworkTransformStateTests { - private class TestNetworkTransform : NetworkTransform - { - // needed to test protected methods - public bool ExposedUpdateNetworkStateCheckDirty(ref NetworkTransformState networkState, double dirtyTime) - { - return UpdateNetworkStateCheckDirty(ref networkState, dirtyTime); - } - } - [Test] public void TestSyncAxes( [Values] bool inLocalSpace, @@ -24,7 +16,7 @@ public void TestSyncAxes( { var gameObject = new GameObject($"Test-{nameof(NetworkTransformStateTests)}.{nameof(TestSyncAxes)}"); var networkObject = gameObject.AddComponent(); - var networkTransform = gameObject.AddComponent(); + var networkTransform = gameObject.AddComponent(); networkTransform.enabled = false; // do not tick `FixedUpdate()` or `Update()` var initialPosition = Vector3.zero; @@ -45,7 +37,7 @@ public void TestSyncAxes( networkTransform.SyncScaleZ = syncScaZ; networkTransform.InLocalSpace = inLocalSpace; - var networkTransformState = new TestNetworkTransform.NetworkTransformState + var networkTransformState = new NetworkTransform.NetworkTransformState { PositionX = initialPosition.x, PositionY = initialPosition.y, @@ -76,7 +68,7 @@ public void TestSyncAxes( if (syncPosX || syncPosY || syncPosZ || syncRotX || syncRotY || syncRotZ || syncScaX || syncScaY || syncScaZ) { - Assert.IsTrue(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsTrue(networkTransform.ApplyTransformToNetworkState(ref networkTransformState, 0, networkTransform.transform)); } } @@ -93,7 +85,7 @@ public void TestSyncAxes( position.x++; networkTransform.transform.position = position; - Assert.IsFalse(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsFalse(networkTransform.ApplyTransformToNetworkState(ref networkTransformState, 0, networkTransform.transform)); } // SyncPositionY { @@ -102,7 +94,7 @@ public void TestSyncAxes( position.y++; networkTransform.transform.position = position; - Assert.IsFalse(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsFalse(networkTransform.ApplyTransformToNetworkState(ref networkTransformState, 0, networkTransform.transform)); } // SyncPositionZ { @@ -111,7 +103,7 @@ public void TestSyncAxes( position.z++; networkTransform.transform.position = position; - Assert.IsFalse(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsFalse(networkTransform.ApplyTransformToNetworkState(ref networkTransformState, 0, networkTransform.transform)); } // SyncRotAngleX @@ -121,7 +113,7 @@ public void TestSyncAxes( rotAngles.x++; networkTransform.transform.eulerAngles = rotAngles; - Assert.IsFalse(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsFalse(networkTransform.ApplyTransformToNetworkState(ref networkTransformState, 0, networkTransform.transform)); } // SyncRotAngleY { @@ -130,7 +122,7 @@ public void TestSyncAxes( rotAngles.y++; networkTransform.transform.eulerAngles = rotAngles; - Assert.IsFalse(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsFalse(networkTransform.ApplyTransformToNetworkState(ref networkTransformState, 0, networkTransform.transform)); } // SyncRotAngleZ { @@ -139,7 +131,7 @@ public void TestSyncAxes( rotAngles.z++; networkTransform.transform.eulerAngles = rotAngles; - Assert.IsFalse(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsFalse(networkTransform.ApplyTransformToNetworkState(ref networkTransformState, 0, networkTransform.transform)); } // SyncScaleX @@ -149,7 +141,7 @@ public void TestSyncAxes( scale.x++; networkTransform.transform.localScale = scale; - Assert.IsFalse(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsFalse(networkTransform.ApplyTransformToNetworkState(ref networkTransformState, 0, networkTransform.transform)); } // SyncScaleY { @@ -158,7 +150,7 @@ public void TestSyncAxes( scale.y++; networkTransform.transform.localScale = scale; - Assert.IsFalse(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsFalse(networkTransform.ApplyTransformToNetworkState(ref networkTransformState, 0, networkTransform.transform)); } // SyncScaleZ { @@ -167,13 +159,14 @@ public void TestSyncAxes( scale.z++; networkTransform.transform.localScale = scale; - Assert.IsFalse(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsFalse(networkTransform.ApplyTransformToNetworkState(ref networkTransformState, 0, networkTransform.transform)); } } Object.DestroyImmediate(gameObject); } + [Test] public void TestThresholds( [Values] bool inLocalSpace, @@ -183,7 +176,7 @@ public void TestThresholds( { var gameObject = new GameObject($"Test-{nameof(NetworkTransformStateTests)}.{nameof(TestThresholds)}"); var networkObject = gameObject.AddComponent(); - var networkTransform = gameObject.AddComponent(); + var networkTransform = gameObject.AddComponent(); networkTransform.enabled = false; // do not tick `FixedUpdate()` or `Update()` var initialPosition = Vector3.zero; @@ -207,7 +200,7 @@ public void TestThresholds( networkTransform.RotAngleThreshold = rotAngleThreshold; networkTransform.ScaleThreshold = scaleThreshold; - var networkTransformState = new TestNetworkTransform.NetworkTransformState + var networkTransformState = new NetworkTransform.NetworkTransformState { PositionX = initialPosition.x, PositionY = initialPosition.y, @@ -227,7 +220,7 @@ public void TestThresholds( networkTransform.transform.eulerAngles = new Vector3(30, 45, 90); networkTransform.transform.localScale = new Vector3(1.1f, 0.5f, 2.5f); - Assert.IsTrue(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsTrue(networkTransform.ApplyTransformToNetworkState(ref networkTransformState, 0, networkTransform.transform)); } // Step 2: make changes below and above thresholds @@ -243,33 +236,33 @@ public void TestThresholds( { position.x += positionThreshold / 2; networkTransform.transform.position = position; - Assert.IsFalse(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsFalse(networkTransform.ApplyTransformToNetworkState(ref networkTransformState, 0, networkTransform.transform)); position.x += positionThreshold * 2; networkTransform.transform.position = position; - Assert.IsTrue(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsTrue(networkTransform.ApplyTransformToNetworkState(ref networkTransformState, 0, networkTransform.transform)); } // PositionY { position.y += positionThreshold / 2; networkTransform.transform.position = position; - Assert.IsFalse(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsFalse(networkTransform.ApplyTransformToNetworkState(ref networkTransformState, 0, networkTransform.transform)); position.y += positionThreshold * 2; networkTransform.transform.position = position; - Assert.IsTrue(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsTrue(networkTransform.ApplyTransformToNetworkState(ref networkTransformState, 0, networkTransform.transform)); } // PositionZ { position.z += positionThreshold / 2; networkTransform.transform.position = position; - Assert.IsFalse(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsFalse(networkTransform.ApplyTransformToNetworkState(ref networkTransformState, 0, networkTransform.transform)); position.z += positionThreshold * 2; networkTransform.transform.position = position; - Assert.IsTrue(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsTrue(networkTransform.ApplyTransformToNetworkState(ref networkTransformState, 0, networkTransform.transform)); } } @@ -282,33 +275,33 @@ public void TestThresholds( { rotAngles.x += rotAngleThreshold / 2; networkTransform.transform.eulerAngles = rotAngles; - Assert.IsFalse(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsFalse(networkTransform.ApplyTransformToNetworkState(ref networkTransformState, 0, networkTransform.transform)); rotAngles.x += rotAngleThreshold * 2; networkTransform.transform.eulerAngles = rotAngles; - Assert.IsTrue(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsTrue(networkTransform.ApplyTransformToNetworkState(ref networkTransformState, 0, networkTransform.transform)); } // RotAngleY { rotAngles.y += rotAngleThreshold / 2; networkTransform.transform.eulerAngles = rotAngles; - Assert.IsFalse(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsFalse(networkTransform.ApplyTransformToNetworkState(ref networkTransformState, 0, networkTransform.transform)); rotAngles.y += rotAngleThreshold * 2; networkTransform.transform.eulerAngles = rotAngles; - Assert.IsTrue(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsTrue(networkTransform.ApplyTransformToNetworkState(ref networkTransformState, 0, networkTransform.transform)); } // RotAngleZ { rotAngles.z += rotAngleThreshold / 2; networkTransform.transform.eulerAngles = rotAngles; - Assert.IsFalse(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsFalse(networkTransform.ApplyTransformToNetworkState(ref networkTransformState, 0, networkTransform.transform)); rotAngles.z += rotAngleThreshold * 2; networkTransform.transform.eulerAngles = rotAngles; - Assert.IsTrue(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsTrue(networkTransform.ApplyTransformToNetworkState(ref networkTransformState, 0, networkTransform.transform)); } } @@ -321,33 +314,33 @@ public void TestThresholds( { scale.x += scaleThreshold / 2; networkTransform.transform.localScale = scale; - Assert.IsFalse(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsFalse(networkTransform.ApplyTransformToNetworkState(ref networkTransformState, 0, networkTransform.transform)); scale.x += scaleThreshold * 2; networkTransform.transform.localScale = scale; - Assert.IsTrue(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsTrue(networkTransform.ApplyTransformToNetworkState(ref networkTransformState, 0, networkTransform.transform)); } // ScaleY { scale.y += scaleThreshold / 2; networkTransform.transform.localScale = scale; - Assert.IsFalse(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsFalse(networkTransform.ApplyTransformToNetworkState(ref networkTransformState, 0, networkTransform.transform)); scale.y += scaleThreshold * 2; networkTransform.transform.localScale = scale; - Assert.IsTrue(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsTrue(networkTransform.ApplyTransformToNetworkState(ref networkTransformState, 0, networkTransform.transform)); } // ScaleZ { scale.z += scaleThreshold / 2; networkTransform.transform.localScale = scale; - Assert.IsFalse(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsFalse(networkTransform.ApplyTransformToNetworkState(ref networkTransformState, 0, networkTransform.transform)); scale.z += scaleThreshold * 2; networkTransform.transform.localScale = scale; - Assert.IsTrue(networkTransform.ExposedUpdateNetworkStateCheckDirty(ref networkTransformState, 0)); + Assert.IsTrue(networkTransform.ApplyTransformToNetworkState(ref networkTransformState, 0, networkTransform.transform)); } } } diff --git a/testproject/Assets/Scenes/ZooSam.unity b/testproject/Assets/Scenes/ZooSam.unity index 51d22bb60e..6e78324216 100644 --- a/testproject/Assets/Scenes/ZooSam.unity +++ b/testproject/Assets/Scenes/ZooSam.unity @@ -1336,7 +1336,6 @@ MonoBehaviour: ScaleThreshold: 0 InLocalSpace: 0 Interpolate: 1 - FixedSendsPerSecond: 30 --- !u!114 &108150033 MonoBehaviour: m_ObjectHideFlags: 0 @@ -3412,7 +3411,6 @@ MonoBehaviour: ScaleThreshold: 0 InLocalSpace: 0 Interpolate: 1 - FixedSendsPerSecond: 30 --- !u!114 &240282451 MonoBehaviour: m_ObjectHideFlags: 0 @@ -8130,7 +8128,6 @@ MonoBehaviour: ScaleThreshold: 0 InLocalSpace: 1 Interpolate: 1 - FixedSendsPerSecond: 50 --- !u!65 &678326396 BoxCollider: m_ObjectHideFlags: 0 @@ -25139,7 +25136,6 @@ MonoBehaviour: ScaleThreshold: 0 InLocalSpace: 0 Interpolate: 1 - FixedSendsPerSecond: 50 --- !u!114 &1934616766 MonoBehaviour: m_ObjectHideFlags: 0 From 272a6dbdd7360ddd60050769fa254ae65fbd04c1 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Wed, 15 Sep 2021 22:15:02 -0400 Subject: [PATCH 085/113] restricting API --- com.unity.netcode.gameobjects/Components/NetworkTransform.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.netcode.gameobjects/Components/NetworkTransform.cs b/com.unity.netcode.gameobjects/Components/NetworkTransform.cs index a19d27e16c..e2ea78db67 100644 --- a/com.unity.netcode.gameobjects/Components/NetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Components/NetworkTransform.cs @@ -274,7 +274,7 @@ public void NetworkSerialize(NetworkSerializer serializer) // private Transform m_Transform; // cache the transform component to reduce unnecessary bounce between managed and native private int lastSentTick; - public void TryCommitTransformToServer(Transform transformToCommit, double dirtyTime) + protected void TryCommitTransformToServer(Transform transformToCommit, double dirtyTime) { var isDirty = ApplyTransformToNetworkState(ref m_LocalAuthoritativeNetworkState, dirtyTime, transformToCommit); From 6978ee3002239943bc3d6bcecbc7418727b4611e Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Wed, 15 Sep 2021 22:25:37 -0400 Subject: [PATCH 086/113] restricting API even more --- .../Interpolator/BufferedLinearInterpolator.cs | 5 ++--- .../Components/NetworkTransform.cs | 11 +++++------ 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/com.unity.netcode.gameobjects/Components/Interpolator/BufferedLinearInterpolator.cs b/com.unity.netcode.gameobjects/Components/Interpolator/BufferedLinearInterpolator.cs index 1c54b9d268..c3f9257d2a 100644 --- a/com.unity.netcode.gameobjects/Components/Interpolator/BufferedLinearInterpolator.cs +++ b/com.unity.netcode.gameobjects/Components/Interpolator/BufferedLinearInterpolator.cs @@ -54,6 +54,8 @@ private struct BufferedItem private int m_LifetimeConsumedCount; + private bool InvalidState => m_Buffer.Count == 0 && m_LifetimeConsumedCount == 0; + public void ResetTo(T targetValue) { m_LifetimeConsumedCount = 1; @@ -67,7 +69,6 @@ public void ResetTo(T targetValue) Update(0); } - // todo if I have value 1, 2, 3 and I'm treating 1 to 3, I shouldn't interpolate between 1 and 3, I should interpolate from 1 to 2, then from 2 to 3 to get the best path private void TryConsumeFromBuffer() { @@ -164,8 +165,6 @@ public void AddMeasurement(T newMeasurement, NetworkTime sentTime) } } - public bool InvalidState => m_Buffer.Count == 0 && m_LifetimeConsumedCount == 0; - public T GetInterpolatedValue() { return m_CurrentInterpValue; diff --git a/com.unity.netcode.gameobjects/Components/NetworkTransform.cs b/com.unity.netcode.gameobjects/Components/NetworkTransform.cs index e2ea78db67..18512ff4b0 100644 --- a/com.unity.netcode.gameobjects/Components/NetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Components/NetworkTransform.cs @@ -14,7 +14,7 @@ namespace Unity.Netcode.Components [DefaultExecutionOrder(1000)] // this is needed to catch the update time after the transform was updated by user scripts public class NetworkTransform : NetworkBehaviour { - public struct NetworkTransformState : INetworkSerializable + internal struct NetworkTransformState : INetworkSerializable { private const int k_InLocalSpaceBit = 0; private const int k_PositionXBit = 1; @@ -245,7 +245,7 @@ public void NetworkSerialize(NetworkSerializer serializer) /// /// Used to determine who can write to this transform. Server side only. - /// Changing this value alone will not allow you to create a NetworkTransform which can be written to by clients. See the NetworkClientTransform Sample + /// Changing this value alone will not allow you to create a NetworkTransform which can be written to by clients. See the ClientNetworkTransform Sample /// in the package samples for how to implement a NetworkTransform with client write support. /// If using different values, please use RPCs to write to the server. Netcode doesn't support client side network variable writing /// @@ -268,12 +268,11 @@ public void NetworkSerialize(NetworkSerializer serializer) private BufferedLinearInterpolator m_ScaleXInterpolator = new BufferedLinearInterpolatorFloat(); private BufferedLinearInterpolator m_ScaleYInterpolator = new BufferedLinearInterpolatorFloat(); private BufferedLinearInterpolator m_ScaleZInterpolator = new BufferedLinearInterpolatorFloat(); - private readonly List> m_AllFloatInterpolators = new List>(6); // private Transform m_Transform; // cache the transform component to reduce unnecessary bounce between managed and native + private int m_LastSentTick; - private int lastSentTick; protected void TryCommitTransformToServer(Transform transformToCommit, double dirtyTime) { var isDirty = ApplyTransformToNetworkState(ref m_LocalAuthoritativeNetworkState, dirtyTime, transformToCommit); @@ -302,9 +301,9 @@ void Send() { Send(); m_HasSentLastValue = false; - lastSentTick = NetworkManager.LocalTime.Tick; + m_LastSentTick = NetworkManager.LocalTime.Tick; } - else if (!m_HasSentLastValue && NetworkManager.LocalTime.Tick >= lastSentTick + 1) // check for state.IsDirty since update can happen more than once per tick. No need for client, RPCs will just queue up + else if (!m_HasSentLastValue && NetworkManager.LocalTime.Tick >= m_LastSentTick + 1) // check for state.IsDirty since update can happen more than once per tick. No need for client, RPCs will just queue up { m_LocalAuthoritativeNetworkState.SentTime = NetworkManager.LocalTime.Time; // time 1+ tick later Send(); From 3add037cd9396441c95e6bb356a38094f2e7ebe8 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Wed, 15 Sep 2021 22:25:47 -0400 Subject: [PATCH 087/113] caching transform --- .../Components/NetworkTransform.cs | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/com.unity.netcode.gameobjects/Components/NetworkTransform.cs b/com.unity.netcode.gameobjects/Components/NetworkTransform.cs index 18512ff4b0..09322878b9 100644 --- a/com.unity.netcode.gameobjects/Components/NetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Components/NetworkTransform.cs @@ -270,7 +270,7 @@ public void NetworkSerialize(NetworkSerializer serializer) private BufferedLinearInterpolator m_ScaleZInterpolator = new BufferedLinearInterpolatorFloat(); private readonly List> m_AllFloatInterpolators = new List>(6); - // private Transform m_Transform; // cache the transform component to reduce unnecessary bounce between managed and native + private Transform m_Transform; // cache the transform component to reduce unnecessary bounce between managed and native private int m_LastSentTick; protected void TryCommitTransformToServer(Transform transformToCommit, double dirtyTime) @@ -629,6 +629,7 @@ private void OnNetworkStateChanged(NetworkTransformState oldState, NetworkTransf private void Awake() { + m_Transform = transform; if (m_AllFloatInterpolators.Count == 0) { m_AllFloatInterpolators.Add(m_PositionXInterpolator); @@ -643,7 +644,7 @@ private void Awake() if (CanWriteToTransform) { - TryCommitTransformToServer(transform, NetworkManager.LocalTime.Time); + TryCommitTransformToServer(m_Transform, NetworkManager.LocalTime.Time); } m_ReplicatedNetworkState.OnValueChanged += OnNetworkStateChanged; @@ -675,7 +676,7 @@ private void Initialize() } else { - ApplyInterpolatedNetworkStateToTransform(m_ReplicatedNetworkState.Value, transform); + ApplyInterpolatedNetworkStateToTransform(m_ReplicatedNetworkState.Value, m_Transform); } } @@ -697,9 +698,7 @@ protected virtual void Update() { if (IsServer) { - TryCommitTransformToServer(transform, NetworkManager.LocalTime.Time); - // var isDirty = ApplyTransformToNetworkState(ref m_LocalAuthoritativeNetworkState, NetworkManager.LocalTime.Time, transform); - // ReplicateToGhosts(m_LocalAuthoritativeNetworkState, isDirty); + TryCommitTransformToServer(m_Transform, NetworkManager.LocalTime.Time); } m_PrevNetworkState = m_LocalAuthoritativeNetworkState; @@ -726,7 +725,7 @@ protected virtual void Update() // try to update previously consumed NetworkState // if we have any changes, that means made some updates locally // we apply the latest ReplNetworkState again to revert our changes - var oldStateDirtyInfo = ApplyTransformToNetworkStateWithInfo(ref m_PrevNetworkState, 0, transform); + var oldStateDirtyInfo = ApplyTransformToNetworkStateWithInfo(ref m_PrevNetworkState, 0, m_Transform); if (oldStateDirtyInfo.isPositionDirty || oldStateDirtyInfo.isScaleDirty || (oldStateDirtyInfo.isRotationDirty && SyncRotAngleX && SyncRotAngleY && SyncRotAngleZ)) { // ignoring rotation dirty since quaternions will mess with euler angles, making this impossible to determine if the change to a single axis comes @@ -736,7 +735,7 @@ protected virtual void Update() } // Apply updated interpolated value - ApplyInterpolatedNetworkStateToTransform(m_ReplicatedNetworkState.Value, transform); + ApplyInterpolatedNetworkStateToTransform(m_ReplicatedNetworkState.Value, m_Transform); } } } From 353c12c838083bffad2805cc2548763fbefd7862 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Wed, 15 Sep 2021 22:37:54 -0400 Subject: [PATCH 088/113] adding doc --- .../Components/NetworkTransform.cs | 7 +++++++ .../Scripts/ClientNetworkTransform.cs | 5 +++++ 2 files changed, 12 insertions(+) diff --git a/com.unity.netcode.gameobjects/Components/NetworkTransform.cs b/com.unity.netcode.gameobjects/Components/NetworkTransform.cs index 09322878b9..df9496e02f 100644 --- a/com.unity.netcode.gameobjects/Components/NetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Components/NetworkTransform.cs @@ -273,6 +273,13 @@ public void NetworkSerialize(NetworkSerializer serializer) private Transform m_Transform; // cache the transform component to reduce unnecessary bounce between managed and native private int m_LastSentTick; + /// + /// Tries updating the server authoritative transform, only if allowed. + /// If this called server side, this will commit directly. + /// If no update is needed, nothing will be sent. This method should still be called every update, it'll self manage when it should and shouldn't send + /// + /// + /// protected void TryCommitTransformToServer(Transform transformToCommit, double dirtyTime) { var isDirty = ApplyTransformToNetworkState(ref m_LocalAuthoritativeNetworkState, dirtyTime, transformToCommit); diff --git a/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs b/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs index d9ac224afe..ea379d0dba 100644 --- a/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs @@ -9,6 +9,11 @@ namespace Unity.Netcode.Samples /// public class ClientNetworkTransform : NetworkTransform { + /// + /// Used to determine who can write to this transform. Owner client only + /// Changing this value alone will not allow you to create a NetworkTransform which can be written to by clients. + /// We're using RPCs to send updated values from client to server. Netcode doesn't support client side network variable writing + /// protected override bool CanWriteToTransform => IsClient && IsOwner; protected override void Update() From 976002a9ddef5b527dff85008a7d5187adce09d7 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Wed, 15 Sep 2021 22:46:29 -0400 Subject: [PATCH 089/113] bumping exec order --- com.unity.netcode.gameobjects/Components/NetworkTransform.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.netcode.gameobjects/Components/NetworkTransform.cs b/com.unity.netcode.gameobjects/Components/NetworkTransform.cs index ecd9eb5d42..9c1555a4ce 100644 --- a/com.unity.netcode.gameobjects/Components/NetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Components/NetworkTransform.cs @@ -9,7 +9,7 @@ namespace Unity.Netcode.Components /// A component for syncing transforms /// [AddComponentMenu("Netcode/" + nameof(NetworkTransform))] - [DefaultExecutionOrder(1000)] // this is needed to catch the update time after the transform was updated by user scripts + [DefaultExecutionOrder(100000)] // this is needed to catch the update time after the transform was updated by user scripts public class NetworkTransform : NetworkBehaviour { internal struct NetworkState : INetworkSerializable From f5e27b90ddd7fcf3868bb07c300c1bd3e695f6e1 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Wed, 15 Sep 2021 22:50:38 -0400 Subject: [PATCH 090/113] restricting public api --- .../Components/Interpolator/BufferedLinearInterpolator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.netcode.gameobjects/Components/Interpolator/BufferedLinearInterpolator.cs b/com.unity.netcode.gameobjects/Components/Interpolator/BufferedLinearInterpolator.cs index 0c19afa1bd..93b2831799 100644 --- a/com.unity.netcode.gameobjects/Components/Interpolator/BufferedLinearInterpolator.cs +++ b/com.unity.netcode.gameobjects/Components/Interpolator/BufferedLinearInterpolator.cs @@ -12,7 +12,7 @@ namespace Unity.Netcode internal abstract class BufferedLinearInterpolator where T : struct { // interface for mock testing, abstracting away external systems - public interface IInterpolatorTime + internal interface IInterpolatorTime { double BufferedServerTime { get; } double BufferedServerFixedTime { get; } From 9e22bfa9e6fea4543c65c8d51a0e9f8c5b5f546e Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Wed, 15 Sep 2021 23:10:56 -0400 Subject: [PATCH 091/113] removing not submitted LiteNetLib from ZooSam --- testproject/Assets/Scenes/ZooSam.unity | 29 ++++---------------------- 1 file changed, 4 insertions(+), 25 deletions(-) diff --git a/testproject/Assets/Scenes/ZooSam.unity b/testproject/Assets/Scenes/ZooSam.unity index 2b5074dd13..b7a79d5890 100644 --- a/testproject/Assets/Scenes/ZooSam.unity +++ b/testproject/Assets/Scenes/ZooSam.unity @@ -6769,7 +6769,6 @@ GameObject: - component: {fileID: 620561612} - component: {fileID: 620561611} - component: {fileID: 620561610} - - component: {fileID: 620561613} m_Layer: 0 m_Name: NetworkManager m_TagString: Untagged @@ -6813,7 +6812,7 @@ MonoBehaviour: LogLevel: 1 NetworkConfig: ProtocolVersion: 0 - NetworkTransport: {fileID: 620561613} + NetworkTransport: {fileID: 620561610} PlayerPrefab: {fileID: 4700706668509470175, guid: 7eeaaf9e50c0afc4dab93584a54fb0d6, type: 3} NetworkPrefabs: [] @@ -6823,7 +6822,6 @@ MonoBehaviour: ConnectionData: EnableTimeResync: 0 TimeResyncInterval: 30 - EnableNetworkVariable: 1 EnsureNetworkVariableLengthSafety: 0 EnableSceneManagement: 1 ForceSamePrefabs: 1 @@ -6847,28 +6845,6 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &620561613 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 620561609} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: db28424c2ae12f64da25c9ecccded6b1, type: 3} - m_Name: - m_EditorClassIdentifier: - Port: 7777 - Address: 127.0.0.1 - PingInterval: 1 - DisconnectTimeout: 5 - ReconnectDelay: 0.5 - MaxConnectAttempts: 10 - MessageBufferSize: 5120 - SimulatePacketLossChance: 0 - SimulateMinLatency: 70 - SimulateMaxLatency: 130 --- !u!1001 &627808638 PrefabInstance: m_ObjectHideFlags: 0 @@ -17755,6 +17731,9 @@ MonoBehaviour: m_EditorClassIdentifier: NetworkManager: {fileID: 620561611} ButtonsRoot: {fileID: 0} + AuthButton: {fileID: 0} + JoinCode: {fileID: 0} + Transport: {fileID: 0} --- !u!1 &1333670311 GameObject: m_ObjectHideFlags: 0 From 96eef69eca2e73b8e8ad4e873387fcb1bfade952 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Wed, 15 Sep 2021 23:49:17 -0400 Subject: [PATCH 092/113] fixing formatting issue --- .../BufferedLinearInterpolator.cs | 6 +-- .../Components/NetworkTransform.cs | 42 +++++++++---------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/com.unity.netcode.gameobjects/Components/Interpolator/BufferedLinearInterpolator.cs b/com.unity.netcode.gameobjects/Components/Interpolator/BufferedLinearInterpolator.cs index 93b2831799..a4c522a860 100644 --- a/com.unity.netcode.gameobjects/Components/Interpolator/BufferedLinearInterpolator.cs +++ b/com.unity.netcode.gameobjects/Components/Interpolator/BufferedLinearInterpolator.cs @@ -127,7 +127,7 @@ public T Update(float deltaTime) } else { - t = (float) ((RenderTime - m_StartTimeConsumed.Time) / range); + t = (float)((RenderTime - m_StartTimeConsumed.Time) / range); } if (t > 3) // max extrapolation @@ -160,7 +160,7 @@ public void AddMeasurement(T newMeasurement, NetworkTime sentTime) if (sentTime.Time > m_EndTimeConsumed.Time || m_LifetimeConsumedCount == 0) // treat only if value is newer than the one being interpolated to right now { - m_Buffer.Add(new BufferedItem {Item = newMeasurement, TimeSent = sentTime}); + m_Buffer.Add(new BufferedItem { Item = newMeasurement, TimeSent = sentTime }); m_Buffer.Sort((item1, item2) => item2.TimeSent.Time.CompareTo(item1.TimeSent.Time)); } } @@ -199,4 +199,4 @@ protected override Quaternion Interpolate(Quaternion start, Quaternion end, floa return Quaternion.SlerpUnclamped(start, end, time); } } -} \ No newline at end of file +} diff --git a/com.unity.netcode.gameobjects/Components/NetworkTransform.cs b/com.unity.netcode.gameobjects/Components/NetworkTransform.cs index 9c1555a4ce..673c5d7072 100644 --- a/com.unity.netcode.gameobjects/Components/NetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Components/NetworkTransform.cs @@ -33,8 +33,8 @@ public bool InLocalSpace get => (Bitset & (1 << InLocalSpaceBit)) != 0; set { - if (value) Bitset = (ushort) (Bitset | (1 << InLocalSpaceBit)); - else Bitset = (ushort) (Bitset & ~(1 << InLocalSpaceBit)); + if (value) Bitset = (ushort)(Bitset | (1 << InLocalSpaceBit)); + else Bitset = (ushort)(Bitset & ~(1 << InLocalSpaceBit)); } } @@ -44,8 +44,8 @@ public bool HasPositionX get => (Bitset & (1 << PositionXBit)) != 0; set { - if (value) Bitset = (ushort) (Bitset | (1 << PositionXBit)); - else Bitset = (ushort) (Bitset & ~(1 << PositionXBit)); + if (value) Bitset = (ushort)(Bitset | (1 << PositionXBit)); + else Bitset = (ushort)(Bitset & ~(1 << PositionXBit)); } } @@ -54,8 +54,8 @@ public bool HasPositionY get => (Bitset & (1 << PositionYBit)) != 0; set { - if (value) Bitset = (ushort) (Bitset | (1 << PositionYBit)); - else Bitset = (ushort) (Bitset & ~(1 << PositionYBit)); + if (value) Bitset = (ushort)(Bitset | (1 << PositionYBit)); + else Bitset = (ushort)(Bitset & ~(1 << PositionYBit)); } } @@ -64,8 +64,8 @@ public bool HasPositionZ get => (Bitset & (1 << PositionZBit)) != 0; set { - if (value) Bitset = (ushort) (Bitset | (1 << PositionZBit)); - else Bitset = (ushort) (Bitset & ~(1 << PositionZBit)); + if (value) Bitset = (ushort)(Bitset | (1 << PositionZBit)); + else Bitset = (ushort)(Bitset & ~(1 << PositionZBit)); } } @@ -75,8 +75,8 @@ public bool HasRotAngleX get => (Bitset & (1 << RotAngleXBit)) != 0; set { - if (value) Bitset = (ushort) (Bitset | (1 << RotAngleXBit)); - else Bitset = (ushort) (Bitset & ~(1 << RotAngleXBit)); + if (value) Bitset = (ushort)(Bitset | (1 << RotAngleXBit)); + else Bitset = (ushort)(Bitset & ~(1 << RotAngleXBit)); } } @@ -85,8 +85,8 @@ public bool HasRotAngleY get => (Bitset & (1 << RotAngleYBit)) != 0; set { - if (value) Bitset = (ushort) (Bitset | (1 << RotAngleYBit)); - else Bitset = (ushort) (Bitset & ~(1 << RotAngleYBit)); + if (value) Bitset = (ushort)(Bitset | (1 << RotAngleYBit)); + else Bitset = (ushort)(Bitset & ~(1 << RotAngleYBit)); } } @@ -95,8 +95,8 @@ public bool HasRotAngleZ get => (Bitset & (1 << RotAngleZBit)) != 0; set { - if (value) Bitset = (ushort) (Bitset | (1 << RotAngleZBit)); - else Bitset = (ushort) (Bitset & ~(1 << RotAngleZBit)); + if (value) Bitset = (ushort)(Bitset | (1 << RotAngleZBit)); + else Bitset = (ushort)(Bitset & ~(1 << RotAngleZBit)); } } @@ -106,8 +106,8 @@ public bool HasScaleX get => (Bitset & (1 << ScaleXBit)) != 0; set { - if (value) Bitset = (ushort) (Bitset | (1 << ScaleXBit)); - else Bitset = (ushort) (Bitset & ~(1 << ScaleXBit)); + if (value) Bitset = (ushort)(Bitset | (1 << ScaleXBit)); + else Bitset = (ushort)(Bitset & ~(1 << ScaleXBit)); } } @@ -116,8 +116,8 @@ public bool HasScaleY get => (Bitset & (1 << ScaleYBit)) != 0; set { - if (value) Bitset = (ushort) (Bitset | (1 << ScaleYBit)); - else Bitset = (ushort) (Bitset & ~(1 << ScaleYBit)); + if (value) Bitset = (ushort)(Bitset | (1 << ScaleYBit)); + else Bitset = (ushort)(Bitset & ~(1 << ScaleYBit)); } } @@ -126,8 +126,8 @@ public bool HasScaleZ get => (Bitset & (1 << ScaleZBit)) != 0; set { - if (value) Bitset = (ushort) (Bitset | (1 << ScaleZBit)); - else Bitset = (ushort) (Bitset & ~(1 << ScaleZBit)); + if (value) Bitset = (ushort)(Bitset | (1 << ScaleZBit)); + else Bitset = (ushort)(Bitset & ~(1 << ScaleZBit)); } } @@ -671,4 +671,4 @@ public void Teleport(Vector3 newPosition, Quaternion newRotation, Vector3 newSca throw new NotImplementedException(); // TODO MTT-769 } } -} \ No newline at end of file +} From 5258c9b0c3f3e9596b6d867de7e20e0f477a8813 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Wed, 15 Sep 2021 23:54:09 -0400 Subject: [PATCH 093/113] more formatting --- .../Components/NetworkTransform.cs | 40 +++++++++---------- testproject/Assets/Scripts/MoveInCircle.cs | 2 +- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/com.unity.netcode.gameobjects/Components/NetworkTransform.cs b/com.unity.netcode.gameobjects/Components/NetworkTransform.cs index 673c5d7072..dd4756456e 100644 --- a/com.unity.netcode.gameobjects/Components/NetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Components/NetworkTransform.cs @@ -33,8 +33,8 @@ public bool InLocalSpace get => (Bitset & (1 << InLocalSpaceBit)) != 0; set { - if (value) Bitset = (ushort)(Bitset | (1 << InLocalSpaceBit)); - else Bitset = (ushort)(Bitset & ~(1 << InLocalSpaceBit)); + if (value) { Bitset = (ushort)(Bitset | (1 << InLocalSpaceBit)); } + else { Bitset = (ushort)(Bitset & ~(1 << InLocalSpaceBit)); } } } @@ -44,8 +44,8 @@ public bool HasPositionX get => (Bitset & (1 << PositionXBit)) != 0; set { - if (value) Bitset = (ushort)(Bitset | (1 << PositionXBit)); - else Bitset = (ushort)(Bitset & ~(1 << PositionXBit)); + if (value) { Bitset = (ushort)(Bitset | (1 << PositionXBit)); } + else { Bitset = (ushort)(Bitset & ~(1 << PositionXBit)); } } } @@ -54,8 +54,8 @@ public bool HasPositionY get => (Bitset & (1 << PositionYBit)) != 0; set { - if (value) Bitset = (ushort)(Bitset | (1 << PositionYBit)); - else Bitset = (ushort)(Bitset & ~(1 << PositionYBit)); + if (value) { Bitset = (ushort)(Bitset | (1 << PositionYBit)); } + else { Bitset = (ushort)(Bitset & ~(1 << PositionYBit)); } } } @@ -64,8 +64,8 @@ public bool HasPositionZ get => (Bitset & (1 << PositionZBit)) != 0; set { - if (value) Bitset = (ushort)(Bitset | (1 << PositionZBit)); - else Bitset = (ushort)(Bitset & ~(1 << PositionZBit)); + if (value) { Bitset = (ushort)(Bitset | (1 << PositionZBit)); } + else { Bitset = (ushort)(Bitset & ~(1 << PositionZBit)); } } } @@ -75,8 +75,8 @@ public bool HasRotAngleX get => (Bitset & (1 << RotAngleXBit)) != 0; set { - if (value) Bitset = (ushort)(Bitset | (1 << RotAngleXBit)); - else Bitset = (ushort)(Bitset & ~(1 << RotAngleXBit)); + if (value) { Bitset = (ushort)(Bitset | (1 << RotAngleXBit)); } + else { Bitset = (ushort)(Bitset & ~(1 << RotAngleXBit)); } } } @@ -85,8 +85,8 @@ public bool HasRotAngleY get => (Bitset & (1 << RotAngleYBit)) != 0; set { - if (value) Bitset = (ushort)(Bitset | (1 << RotAngleYBit)); - else Bitset = (ushort)(Bitset & ~(1 << RotAngleYBit)); + if (value) { Bitset = (ushort)(Bitset | (1 << RotAngleYBit)); } + else { Bitset = (ushort)(Bitset & ~(1 << RotAngleYBit)); } } } @@ -95,8 +95,8 @@ public bool HasRotAngleZ get => (Bitset & (1 << RotAngleZBit)) != 0; set { - if (value) Bitset = (ushort)(Bitset | (1 << RotAngleZBit)); - else Bitset = (ushort)(Bitset & ~(1 << RotAngleZBit)); + if (value) { Bitset = (ushort)(Bitset | (1 << RotAngleZBit)); } + else { Bitset = (ushort)(Bitset & ~(1 << RotAngleZBit)); } } } @@ -106,8 +106,8 @@ public bool HasScaleX get => (Bitset & (1 << ScaleXBit)) != 0; set { - if (value) Bitset = (ushort)(Bitset | (1 << ScaleXBit)); - else Bitset = (ushort)(Bitset & ~(1 << ScaleXBit)); + if (value) { Bitset = (ushort)(Bitset | (1 << ScaleXBit)); } + else { Bitset = (ushort)(Bitset & ~(1 << ScaleXBit)); } } } @@ -116,8 +116,8 @@ public bool HasScaleY get => (Bitset & (1 << ScaleYBit)) != 0; set { - if (value) Bitset = (ushort)(Bitset | (1 << ScaleYBit)); - else Bitset = (ushort)(Bitset & ~(1 << ScaleYBit)); + if (value) { Bitset = (ushort)(Bitset | (1 << ScaleYBit)); } + else { Bitset = (ushort)(Bitset & ~(1 << ScaleYBit)); } } } @@ -126,8 +126,8 @@ public bool HasScaleZ get => (Bitset & (1 << ScaleZBit)) != 0; set { - if (value) Bitset = (ushort)(Bitset | (1 << ScaleZBit)); - else Bitset = (ushort)(Bitset & ~(1 << ScaleZBit)); + if (value) { Bitset = (ushort)(Bitset | (1 << ScaleZBit)); } + else { Bitset = (ushort)(Bitset & ~(1 << ScaleZBit)); } } } diff --git a/testproject/Assets/Scripts/MoveInCircle.cs b/testproject/Assets/Scripts/MoveInCircle.cs index c8b2fc440a..e82f407416 100644 --- a/testproject/Assets/Scripts/MoveInCircle.cs +++ b/testproject/Assets/Scripts/MoveInCircle.cs @@ -46,7 +46,7 @@ private void Tick(bool isFixed) var deltaTime = isFixed ? Time.fixedDeltaTime : Time.deltaTime; transform.position = transform.position + transform.forward * (m_MoveSpeed * deltaTime); transform.Rotate(0, m_RotationSpeed * deltaTime, 0); - transform.localScale = ((Mathf.Sin(isFixed ? Time.fixedTime : Time.time)+1) * Vector3.one); + transform.localScale = ((Mathf.Sin(isFixed ? Time.fixedTime : Time.time) + 1) * Vector3.one); } } } From 39ec72156f9efc37d51dabd741072b576b580f06 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Thu, 16 Sep 2021 00:02:29 -0400 Subject: [PATCH 094/113] fixing line issue --- com.unity.netcode.gameobjects/Tests/Editor/InterpolatorTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.netcode.gameobjects/Tests/Editor/InterpolatorTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/InterpolatorTests.cs index 69656dcbd8..13f4998c89 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/InterpolatorTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/InterpolatorTests.cs @@ -348,4 +348,4 @@ public void TestDuplicatedValues() Assert.That(interp, Is.EqualTo(2f)); } } -} \ No newline at end of file +} From d79aa5327b0a3fbb7cffe3027aa13e0d12e5ccdb Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Thu, 16 Sep 2021 00:51:33 -0400 Subject: [PATCH 095/113] format issue --- .../Components/NetworkTransform.cs | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/com.unity.netcode.gameobjects/Components/NetworkTransform.cs b/com.unity.netcode.gameobjects/Components/NetworkTransform.cs index c0012fa041..faca0c1c51 100644 --- a/com.unity.netcode.gameobjects/Components/NetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Components/NetworkTransform.cs @@ -35,7 +35,7 @@ public bool InLocalSpace get => (m_Bitset & (1 << k_InLocalSpaceBit)) != 0; set { - if (value) { m_Bitset = (ushort) m_Bitset | (1 << k_InLocalSpaceBit)); } + if (value) { m_Bitset = (ushort)(m_Bitset | (1 << k_InLocalSpaceBit)); } else { m_Bitset = (ushort)(m_Bitset & ~(1 << k_InLocalSpaceBit)); } } } @@ -46,8 +46,8 @@ public bool HasPositionX get => (m_Bitset & (1 << k_PositionXBit)) != 0; set { - if (value) { Bitset = (ushort) (Bitset | (1 << PositionXBit)); } - else { Bitset = ushort) (Bitset & ~(1 << PositionXBit)); } + if (value) { m_Bitset = (ushort)(m_Bitset | (1 << k_PositionXBit)); } + else { m_Bitset = (ushort)(m_Bitset & ~(1 << k_PositionXBit)); } } } @@ -56,8 +56,8 @@ public bool HasPositionY get => (m_Bitset & (1 << k_PositionYBit)) != 0; set { - if (value) { Bitset = (ushort)(Bitset | (1 << PositionYBit)); } - else { Bitset = (ushort)(Bitset & ~(1 << PositionYBit)); } + if (value) { m_Bitset = (ushort)(m_Bitset | (1 << k_PositionYBit)); } + else { m_Bitset = (ushort)(m_Bitset & ~(1 << k_PositionYBit)); } } } @@ -66,8 +66,8 @@ public bool HasPositionZ get => (m_Bitset & (1 << k_PositionZBit)) != 0; set { - if (value) { Bitset = (ushort)(Bitset | (1 << PositionZBit)); } - else { Bitset = (ushort)(Bitset & ~(1 << PositionZBit)); } + if (value) { m_Bitset = (ushort)(m_Bitset | (1 << k_PositionZBit)); } + else { m_Bitset = (ushort)(m_Bitset & ~(1 << k_PositionZBit)); } } } @@ -77,8 +77,8 @@ public bool HasRotAngleX get => (m_Bitset & (1 << k_RotAngleXBit)) != 0; set { - if (value) { Bitset = (ushort)(Bitset | (1 << RotAngleXBit)); } - else { Bitset = (ushort)(Bitset & ~(1 << RotAngleXBit)); } + if (value) { m_Bitset = (ushort)(m_Bitset | (1 << k_RotAngleXBit)); } + else { m_Bitset = (ushort)(m_Bitset & ~(1 << k_RotAngleXBit)); } } } @@ -87,8 +87,8 @@ public bool HasRotAngleY get => (m_Bitset & (1 << k_RotAngleYBit)) != 0; set { - if (value) { Bitset = (ushort)(Bitset | (1 << RotAngleYBit)); } - else { Bitset = (ushort)(Bitset & ~(1 << RotAngleYBit)); } + if (value) { m_Bitset = (ushort)(m_Bitset | (1 << k_RotAngleYBit)); } + else { m_Bitset = (ushort)(m_Bitset & ~(1 << k_RotAngleYBit)); } } } @@ -97,8 +97,8 @@ public bool HasRotAngleZ get => (m_Bitset & (1 << k_RotAngleZBit)) != 0; set { - if (value) { Bitset = (ushort)(Bitset | (1 << RotAngleZBit)); } - else { Bitset = (ushort)(Bitset & ~(1 << RotAngleZBit)); } + if (value) { m_Bitset = (ushort)(m_Bitset | (1 << k_RotAngleZBit)); } + else { m_Bitset = (ushort)(m_Bitset & ~(1 << k_RotAngleZBit)); } } } @@ -108,8 +108,8 @@ public bool HasScaleX get => (m_Bitset & (1 << k_ScaleXBit)) != 0; set { - if (value) { Bitset = (ushort)(Bitset | (1 << ScaleXBit)); } - else { Bitset = (ushort)(Bitset & ~(1 << ScaleXBit)); } + if (value) { m_Bitset = (ushort)(m_Bitset | (1 << k_ScaleXBit)); } + else { m_Bitset = (ushort)(m_Bitset & ~(1 << k_ScaleXBit)); } } } @@ -118,8 +118,8 @@ public bool HasScaleY get => (m_Bitset & (1 << k_ScaleYBit)) != 0; set { - if (value) { Bitset = (ushort)(Bitset | (1 << ScaleYBit)); } - else { Bitset = (ushort)(Bitset & ~(1 << ScaleYBit)); } + if (value) { m_Bitset = (ushort)(m_Bitset | (1 << k_ScaleYBit)); } + else { m_Bitset = (ushort)(m_Bitset & ~(1 << k_ScaleYBit)); } } } @@ -128,8 +128,8 @@ public bool HasScaleZ get => (m_Bitset & (1 << k_ScaleZBit)) != 0; set { - if (value) { Bitset = (ushort)(Bitset | (1 << ScaleZBit)); } - else { Bitset = (ushort)(Bitset & ~(1 << ScaleZBit)); } + if (value) { m_Bitset = (ushort)(m_Bitset | (1 << k_ScaleZBit)); } + else { m_Bitset = (ushort)(m_Bitset & ~(1 << k_ScaleZBit)); } } } @@ -757,4 +757,4 @@ public void Teleport(Vector3 newPosition, Quaternion newRotation, Vector3 newSca throw new NotImplementedException(); // TODO MTT-769 } } -} \ No newline at end of file +} From 3d69f23450bf2ad932085a0c5d8286ff4ef8e8a0 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Thu, 16 Sep 2021 00:56:39 -0400 Subject: [PATCH 096/113] format fix --- .../Scripts/ClientNetworkTransform.cs | 1 - .../Runtime/NetworkTransform/NetworkTransformStateTests.cs | 1 - testproject/Assets/SetIsOwner.cs | 6 +++--- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs b/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs index ea379d0dba..0129cc19b3 100644 --- a/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs @@ -1,5 +1,4 @@ using Unity.Netcode.Components; -using UnityEngine; namespace Unity.Netcode.Samples { diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/NetworkTransformStateTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/NetworkTransformStateTests.cs index b75c6991df..ccc3aa50a8 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/NetworkTransformStateTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/NetworkTransformStateTests.cs @@ -1,4 +1,3 @@ -using System.Collections; using NUnit.Framework; using Unity.Netcode.Components; using UnityEngine; diff --git a/testproject/Assets/SetIsOwner.cs b/testproject/Assets/SetIsOwner.cs index 7aeb85d417..c867827bbd 100644 --- a/testproject/Assets/SetIsOwner.cs +++ b/testproject/Assets/SetIsOwner.cs @@ -11,14 +11,14 @@ public void Set(ulong clientID) } [CustomEditor(typeof(SetIsOwner))] - public class GameEventEditor : UnityEditor.Editor + public class GameEventEditor : Editor { private string clientID = "clientID (ulong)"; public override void OnInspectorGUI() { base.OnInspectorGUI(); - var gameEvent = (SetIsOwner) target; + var gameEvent = (SetIsOwner)target; if (NetworkManager.Singleton != null && (NetworkManager.Singleton.IsConnectedClient || NetworkManager.Singleton.IsListening)) @@ -34,7 +34,7 @@ public override void OnInspectorGUI() } } - void Update() + private void Update() { if (NetworkManager.Singleton != null && (NetworkManager.Singleton.IsConnectedClient || NetworkManager.Singleton.IsListening)) { From 211f0f95d79996a56c03c32a167373a7c940492f Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Thu, 16 Sep 2021 10:17:21 -0400 Subject: [PATCH 097/113] removing useless meta files --- com.unity.netcode.gameobjects/Prototyping.meta | 8 -------- .../Prototyping/Interpolator.meta | 8 -------- 2 files changed, 16 deletions(-) delete mode 100644 com.unity.netcode.gameobjects/Prototyping.meta delete mode 100644 com.unity.netcode.gameobjects/Prototyping/Interpolator.meta diff --git a/com.unity.netcode.gameobjects/Prototyping.meta b/com.unity.netcode.gameobjects/Prototyping.meta deleted file mode 100644 index a536014db1..0000000000 --- a/com.unity.netcode.gameobjects/Prototyping.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 4f9f645c043894b81ab326fe4703f4c8 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/com.unity.netcode.gameobjects/Prototyping/Interpolator.meta b/com.unity.netcode.gameobjects/Prototyping/Interpolator.meta deleted file mode 100644 index 0bfe5f770f..0000000000 --- a/com.unity.netcode.gameobjects/Prototyping/Interpolator.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 32190d476d5de4dc8b7ee8208bde82a0 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: From 6d3af5cb0f15b784623f82366a990f41b39027b2 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Thu, 16 Sep 2021 11:54:39 -0400 Subject: [PATCH 098/113] adding CanCommitToTransform public api. Since it's very likely authority will change in the future, we're not imposing "isOwner && IsClient" checks on users, we're abstracting this away to make future changes invisible to them. --- .../Components/NetworkTransform.cs | 17 +++++++++-------- .../Scripts/ClientNetworkTransform.cs | 7 ++++--- testproject/Assets/Scripts/MoveInCircle.cs | 5 ++++- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/com.unity.netcode.gameobjects/Components/NetworkTransform.cs b/com.unity.netcode.gameobjects/Components/NetworkTransform.cs index faca0c1c51..3af90cd2f5 100644 --- a/com.unity.netcode.gameobjects/Components/NetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Components/NetworkTransform.cs @@ -244,12 +244,13 @@ public void NetworkSerialize(NetworkSerializer serializer) public bool Interpolate = true; /// - /// Used to determine who can write to this transform. Server side only. - /// Changing this value alone will not allow you to create a NetworkTransform which can be written to by clients. See the ClientNetworkTransform Sample + /// Used to determine who can write to this transform. Server only for this transform. + /// Changing this value alone in a child implementation will not allow you to create a NetworkTransform which can be written to by clients. See the ClientNetworkTransform Sample /// in the package samples for how to implement a NetworkTransform with client write support. /// If using different values, please use RPCs to write to the server. Netcode doesn't support client side network variable writing /// - protected virtual bool CanWriteToTransform => IsServer; + // This is public to make sure that users don't depend on this IsClient && IsOwner check in their code. If this logic changes in the future, we can make it invisible here + public virtual bool CanCommitToTransform => IsServer; private readonly NetworkVariable m_ReplicatedNetworkState = new NetworkVariable(new NetworkTransformState()); @@ -617,7 +618,7 @@ private void OnNetworkStateChanged(NetworkTransformState oldState, NetworkTransf return; } - if (CanWriteToTransform) + if (CanCommitToTransform) { // we're the authority, we ignore incoming changes return; @@ -649,7 +650,7 @@ private void Awake() // ReplNetworkState.NetworkVariableChannel = NetworkChannel.PositionUpdate; // todo figure this out, talk with Matt/Fatih, this should be unreliable - if (CanWriteToTransform) + if (CanCommitToTransform) { TryCommitTransformToServer(m_Transform, NetworkManager.LocalTime.Time); } @@ -677,7 +678,7 @@ private void Initialize() { ResetInterpolatedStateToCurrentAuthoritativeState(); // useful for late joining - if (CanWriteToTransform) + if (CanCommitToTransform) { m_ReplicatedNetworkState.SetDirty(true); } @@ -701,7 +702,7 @@ protected virtual void Update() return; } - if (CanWriteToTransform) + if (CanCommitToTransform) { if (IsServer) { @@ -721,7 +722,7 @@ protected virtual void Update() m_RotationInterpolator.Update(Time.deltaTime); - if (!CanWriteToTransform) + if (!CanCommitToTransform) { if (NetworkManager.Singleton.LogLevel == LogLevel.Developer) { diff --git a/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs b/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs index 0129cc19b3..232c067a42 100644 --- a/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs @@ -9,18 +9,19 @@ namespace Unity.Netcode.Samples public class ClientNetworkTransform : NetworkTransform { /// - /// Used to determine who can write to this transform. Owner client only + /// Used to determine who can write to this transform. Owner client only. /// Changing this value alone will not allow you to create a NetworkTransform which can be written to by clients. /// We're using RPCs to send updated values from client to server. Netcode doesn't support client side network variable writing /// - protected override bool CanWriteToTransform => IsClient && IsOwner; + // This is public to make sure that users don't depend on this IsClient && IsOwner check in their code. If this logic changes in the future, we can make it invisible here + public override bool CanCommitToTransform => IsClient && IsOwner; protected override void Update() { base.Update(); if (NetworkManager.Singleton != null && (NetworkManager.Singleton.IsConnectedClient || NetworkManager.Singleton.IsListening)) { - if (CanWriteToTransform) + if (CanCommitToTransform) { TryCommitTransformToServer(transform, NetworkManager.LocalTime.Time); } diff --git a/testproject/Assets/Scripts/MoveInCircle.cs b/testproject/Assets/Scripts/MoveInCircle.cs index e82f407416..56bbec17c1 100644 --- a/testproject/Assets/Scripts/MoveInCircle.cs +++ b/testproject/Assets/Scripts/MoveInCircle.cs @@ -1,5 +1,6 @@ using UnityEngine; using Unity.Netcode; +using Unity.Netcode.Components; public class MoveInCircle : NetworkBehaviour { @@ -15,9 +16,11 @@ public class MoveInCircle : NetworkBehaviour [SerializeField] private bool m_RunInUpdate; + private NetworkTransform m_NetworkTransform; public override void OnNetworkSpawn() { base.OnNetworkSpawn(); + m_NetworkTransform = GetComponent(); //NetworkManager.Singleton.NetworkTimeSystem.ServerBufferSec = 0.15f; } @@ -41,7 +44,7 @@ private void Update() private void Tick(bool isFixed) { - if (NetworkManager.Singleton.IsServer || !m_RunServerOnly) + if (m_NetworkTransform.CanCommitToTransform || !m_RunServerOnly) { var deltaTime = isFixed ? Time.fixedDeltaTime : Time.deltaTime; transform.position = transform.position + transform.forward * (m_MoveSpeed * deltaTime); From d97611cad1aa6021cf600cf554c90b665fb54a09 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Thu, 16 Sep 2021 11:59:58 -0400 Subject: [PATCH 099/113] formatting --- testproject/Assets/Scripts/MoveInCircle.cs | 3 +++ testproject/Assets/SetIsOwner.cs | 6 +++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/testproject/Assets/Scripts/MoveInCircle.cs b/testproject/Assets/Scripts/MoveInCircle.cs index 56bbec17c1..518629eaaf 100644 --- a/testproject/Assets/Scripts/MoveInCircle.cs +++ b/testproject/Assets/Scripts/MoveInCircle.cs @@ -17,6 +17,7 @@ public class MoveInCircle : NetworkBehaviour private bool m_RunInUpdate; private NetworkTransform m_NetworkTransform; + public override void OnNetworkSpawn() { base.OnNetworkSpawn(); @@ -30,6 +31,7 @@ private void FixedUpdate() { return; } + Tick(true); } @@ -39,6 +41,7 @@ private void Update() { return; } + Tick(false); } diff --git a/testproject/Assets/SetIsOwner.cs b/testproject/Assets/SetIsOwner.cs index c867827bbd..7be2f17f8b 100644 --- a/testproject/Assets/SetIsOwner.cs +++ b/testproject/Assets/SetIsOwner.cs @@ -13,7 +13,7 @@ public void Set(ulong clientID) [CustomEditor(typeof(SetIsOwner))] public class GameEventEditor : Editor { - private string clientID = "clientID (ulong)"; + private string m_ClientID = "clientID (ulong)"; public override void OnInspectorGUI() { base.OnInspectorGUI(); @@ -24,12 +24,12 @@ public override void OnInspectorGUI() if (NetworkManager.Singleton != null && (NetworkManager.Singleton.IsConnectedClient || NetworkManager.Singleton.IsListening)) { GUILayout.TextArea($"Current owner: {gameEvent.GetComponent().OwnerClientId}"); - clientID = GUILayout.TextField(clientID); + m_ClientID = GUILayout.TextField(m_ClientID); } if (GUILayout.Button("Set")) { - gameEvent.Set(Convert.ToUInt64(clientID)); + gameEvent.Set(Convert.ToUInt64(m_ClientID)); } } } From 32344016484789850360c01fdacfec6353feac24 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Thu, 16 Sep 2021 13:20:01 -0400 Subject: [PATCH 100/113] adding some warning in doc --- .../ClientNetworkTransform/Scripts/ClientNetworkTransform.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs b/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs index 232c067a42..2aa058f30f 100644 --- a/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/ClientNetworkTransform.cs @@ -11,7 +11,8 @@ public class ClientNetworkTransform : NetworkTransform /// /// Used to determine who can write to this transform. Owner client only. /// Changing this value alone will not allow you to create a NetworkTransform which can be written to by clients. - /// We're using RPCs to send updated values from client to server. Netcode doesn't support client side network variable writing + /// We're using RPCs to send updated values from client to server. Netcode doesn't support client side network variable writing. + /// This imposes state to the server. This is putting trust on your clients. Make sure no security-sensitive features use this transform. /// // This is public to make sure that users don't depend on this IsClient && IsOwner check in their code. If this logic changes in the future, we can make it invisible here public override bool CanCommitToTransform => IsClient && IsOwner; From d1cb56de9d9deb57a95e8e9b954dff955a98640a Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Thu, 16 Sep 2021 15:12:58 -0400 Subject: [PATCH 101/113] Removing useless SetDirty --- com.unity.netcode.gameobjects/Components/NetworkTransform.cs | 1 - testproject/Assets/Scripts/MoveInCircle.cs | 2 +- testproject/Assets/SetIsOwner.cs | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/com.unity.netcode.gameobjects/Components/NetworkTransform.cs b/com.unity.netcode.gameobjects/Components/NetworkTransform.cs index 3af90cd2f5..e5049868dd 100644 --- a/com.unity.netcode.gameobjects/Components/NetworkTransform.cs +++ b/com.unity.netcode.gameobjects/Components/NetworkTransform.cs @@ -332,7 +332,6 @@ private void CommitLocallyAndReplicate(NetworkTransformState networkState) { m_LocalAuthoritativeNetworkState = networkState; m_ReplicatedNetworkState.Value = networkState; - m_ReplicatedNetworkState.SetDirty(true); AddInterpolatedState(networkState); } diff --git a/testproject/Assets/Scripts/MoveInCircle.cs b/testproject/Assets/Scripts/MoveInCircle.cs index 518629eaaf..3e8ed2ee33 100644 --- a/testproject/Assets/Scripts/MoveInCircle.cs +++ b/testproject/Assets/Scripts/MoveInCircle.cs @@ -47,7 +47,7 @@ private void Update() private void Tick(bool isFixed) { - if (m_NetworkTransform.CanCommitToTransform || !m_RunServerOnly) + if (m_NetworkTransform != null && m_NetworkTransform.CanCommitToTransform || !m_RunServerOnly) { var deltaTime = isFixed ? Time.fixedDeltaTime : Time.deltaTime; transform.position = transform.position + transform.forward * (m_MoveSpeed * deltaTime); diff --git a/testproject/Assets/SetIsOwner.cs b/testproject/Assets/SetIsOwner.cs index 7be2f17f8b..155c4167ea 100644 --- a/testproject/Assets/SetIsOwner.cs +++ b/testproject/Assets/SetIsOwner.cs @@ -38,7 +38,7 @@ private void Update() { if (NetworkManager.Singleton != null && (NetworkManager.Singleton.IsConnectedClient || NetworkManager.Singleton.IsListening)) { - Debug.Log(NetworkManager.Singleton.LocalClientId); + // Debug.Log(NetworkManager.Singleton.LocalClientId); } } } From e59d506e191c6b6d30f5b02da6a4aaee6818fb59 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Thu, 16 Sep 2021 17:16:28 -0400 Subject: [PATCH 102/113] reenabling net transform tests --- .../NetworkTransform/NetworkTransformTests.cs | 169 ++++++++++++++---- .../com.unity.netcode.runtimetests.asmdef | 3 +- 2 files changed, 132 insertions(+), 40 deletions(-) diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/NetworkTransformTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/NetworkTransformTests.cs index 1d464ab69e..f5a5783d95 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/NetworkTransformTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/NetworkTransformTests.cs @@ -1,22 +1,30 @@ +using System; using System.Collections; using Unity.Netcode.Components; using NUnit.Framework; +using Unity.Netcode.Samples; +using UnityEngine; using UnityEngine.TestTools; namespace Unity.Netcode.RuntimeTests { - [TestFixture(true)] - [TestFixture(false)] + [TestFixture(true, true)] + [TestFixture(true, false)] + [TestFixture(false, true)] + [TestFixture(false, false)] public class NetworkTransformTests : BaseMultiInstanceTest { private NetworkObject m_ClientSideClientPlayer; private NetworkObject m_ServerSideClientPlayer; + private readonly bool m_TestWithClientNetworkTransform; + private readonly bool m_TestWithHost; - public NetworkTransformTests(bool testWithHost) + public NetworkTransformTests(bool testWithHost, bool testWithClientNetworkTransform) { m_TestWithHost = testWithHost; // from test fixture + m_TestWithClientNetworkTransform = testWithClientNetworkTransform; } protected override int NbClients => 1; @@ -26,7 +34,14 @@ public override IEnumerator Setup() { yield return StartSomeClientsAndServerWithPlayers(useHost: m_TestWithHost, nbClients: NbClients, updatePlayerPrefab: playerPrefab => { - var networkTransform = playerPrefab.AddComponent(); + if (m_TestWithClientNetworkTransform) + { + playerPrefab.AddComponent(); + } + else + { + playerPrefab.AddComponent(); + } }); // This is the *SERVER VERSION* of the *CLIENT PLAYER* @@ -42,36 +57,83 @@ public override IEnumerator Setup() } // TODO: rewrite after perms & authority changes - /* + //* [UnityTest] - [TestCase(true, NetworkAuthority.Client, ExpectedResult = null)] - [TestCase(true, NetworkAuthority.Server, ExpectedResult = null)] - [TestCase(false, NetworkAuthority.Client, ExpectedResult = null)] - [TestCase(false, NetworkAuthority.Server, ExpectedResult = null)] - public IEnumerator TestAuthoritativeTransformChangeOneAtATime(bool testLocalTransform, NetworkAuthority authorityToTest) + public IEnumerator TestAuthoritativeTransformChangeOneAtATime([Values] bool testLocalTransform) { var waitResult = new MultiInstanceHelpers.CoroutineResultWrapper(); - var networkTransform = (authorityToTest == NetworkAuthority.Client ? m_ClientSideClientPlayer : m_ServerSideClientPlayer).GetComponent(); - networkTransform.SetAuthority(authorityToTest); - networkTransform.InitializeInterpolator, NoInterpolator, NoInterpolator>(); - - var otherSideNetworkTransform = (authorityToTest == NetworkAuthority.Client ? m_ServerSideClientPlayer : m_ClientSideClientPlayer).GetComponent(); - otherSideNetworkTransform.SetAuthority(authorityToTest); - otherSideNetworkTransform.InitializeInterpolator, NoInterpolator, NoInterpolator>(); - - static bool HasAuthorityFunc(NetworkTransform transform) + NetworkTransform authoritativeNetworkTransform; + NetworkTransform otherSideNetworkTransform; + if (m_TestWithClientNetworkTransform) { - return transform.NetworkObject.NetworkManager.IsServer && transform.Authority == NetworkAuthority.Server || - transform.NetworkObject.NetworkManager.IsClient && transform.Authority == NetworkAuthority.Client; + // client auth net transform can write from client, not from server + otherSideNetworkTransform = m_ServerSideClientPlayer.GetComponent(); + authoritativeNetworkTransform = m_ClientSideClientPlayer.GetComponent(); } - - if (HasAuthorityFunc(networkTransform)) + else + { + // server auth net transform can't write from client, not from client + authoritativeNetworkTransform = m_ServerSideClientPlayer.GetComponent(); + otherSideNetworkTransform = m_ClientSideClientPlayer.GetComponent(); + } + Assert.That(!otherSideNetworkTransform.CanCommitToTransform); + Assert.That(authoritativeNetworkTransform.CanCommitToTransform); + + // // server auth net transform can't write from client, not from client + // var authoritativeNetworkTransform = m_ServerSideClientPlayer.GetComponent(); + // Assert.That(!authoritativeNetworkTransform.CanCommitToTransform); + // var otherSideNetworkTransform = m_ClientSideClientPlayer.GetComponent(); + // Assert.That(otherSideNetworkTransform.CanCommitToTransform); + + // if (testClientAuthority) + // { + // if (m_TestWithClientNetworkTransform) + // { + // // client auth net transform can write from client, not from server + // authoritativeNetworkTransform = m_ClientSideClientPlayer.GetComponent(); + // Assert.That(authoritativeNetworkTransform.CanCommitToTransform); + // otherSideNetworkTransform = m_ServerSideClientPlayer.GetComponent(); + // Assert.That(!otherSideNetworkTransform.CanCommitToTransform); + // } + // else + // { + // // server auth net transform can't write from client, not from client + // authoritativeNetworkTransform = m_ClientSideClientPlayer.GetComponent(); + // Assert.That(!authoritativeNetworkTransform.CanCommitToTransform); + // otherSideNetworkTransform = m_ServerSideClientPlayer.GetComponent(); + // Assert.That(otherSideNetworkTransform.CanCommitToTransform); + // } + // } + // else + // { + // if (m_TestWithClientNetworkTransform) + // { + // // client auth net transform can write from client, not from server + // authoritativeNetworkTransform = m_ServerSideClientPlayer.GetComponent(); + // Assert.That(authoritativeNetworkTransform.CanCommitToTransform); + // otherSideNetworkTransform = m_ClientSideClientPlayer.GetComponent(); + // Assert.That(!otherSideNetworkTransform.CanCommitToTransform); + // } + // else + // { + // // server auth net transform can't write from client, not from client + // authoritativeNetworkTransform = m_ServerSideClientPlayer.GetComponent(); + // Assert.That(!authoritativeNetworkTransform.CanCommitToTransform); + // otherSideNetworkTransform = m_ClientSideClientPlayer.GetComponent(); + // Assert.That(otherSideNetworkTransform.CanCommitToTransform); + // } + // } + + authoritativeNetworkTransform.Interpolate = false; + otherSideNetworkTransform.Interpolate = false; + + if (authoritativeNetworkTransform.CanCommitToTransform) { - networkTransform.InLocalSpace = testLocalTransform; + authoritativeNetworkTransform.InLocalSpace = testLocalTransform; } - if (HasAuthorityFunc(otherSideNetworkTransform)) + if (otherSideNetworkTransform.CanCommitToTransform) { otherSideNetworkTransform.InLocalSpace = testLocalTransform; } @@ -79,8 +141,8 @@ static bool HasAuthorityFunc(NetworkTransform transform) float approximation = 0.05f; // test position - var playerTransform = networkTransform.transform; - playerTransform.position = new Vector3(10, 20, 30); + var authPlayerTransform = authoritativeNetworkTransform.transform; + authPlayerTransform.position = new Vector3(10, 20, 30); Assert.AreEqual(Vector3.zero, otherSideNetworkTransform.transform.position, "server side pos should be zero at first"); // sanity check yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.WaitForCondition(() => otherSideNetworkTransform.transform.position.x > approximation, waitResult, maxFrames: 120)); if (!waitResult.Result) @@ -90,7 +152,7 @@ static bool HasAuthorityFunc(NetworkTransform transform) Assert.True(new Vector3(10, 20, 30) == otherSideNetworkTransform.transform.position, $"wrong position on ghost, {otherSideNetworkTransform.transform.position}"); // Vector3 already does float approximation with == // test rotation - playerTransform.rotation = Quaternion.Euler(45, 40, 35); // using euler angles instead of quaternions directly to really see issues users might encounter + authPlayerTransform.rotation = Quaternion.Euler(45, 40, 35); // using euler angles instead of quaternions directly to really see issues users might encounter Assert.AreEqual(Quaternion.identity, otherSideNetworkTransform.transform.rotation, "wrong initial value for rotation"); // sanity check yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.WaitForCondition(() => otherSideNetworkTransform.transform.rotation.eulerAngles.x > approximation, waitResult, maxFrames: 120)); if (!waitResult.Result) @@ -106,7 +168,7 @@ static bool HasAuthorityFunc(NetworkTransform transform) UnityEngine.Assertions.Assert.AreApproximatelyEqual(1f, otherSideNetworkTransform.transform.lossyScale.x, "wrong initial value for scale"); // sanity check UnityEngine.Assertions.Assert.AreApproximatelyEqual(1f, otherSideNetworkTransform.transform.lossyScale.y, "wrong initial value for scale"); // sanity check UnityEngine.Assertions.Assert.AreApproximatelyEqual(1f, otherSideNetworkTransform.transform.lossyScale.z, "wrong initial value for scale"); // sanity check - playerTransform.localScale = new Vector3(2, 3, 4); + authPlayerTransform.localScale = new Vector3(2, 3, 4); yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.WaitForCondition(() => otherSideNetworkTransform.transform.lossyScale.x > 1f + approximation, waitResult, maxFrames: 120)); if (!waitResult.Result) { @@ -121,18 +183,47 @@ static bool HasAuthorityFunc(NetworkTransform transform) } [UnityTest] - [TestCase(NetworkAuthority.Client, ExpectedResult = null)] - [TestCase(NetworkAuthority.Server, ExpectedResult = null)] - public IEnumerator TestCantChangeTransformFromOtherSideAuthority(NetworkAuthority authorityToTest) + public IEnumerator TestCantChangeTransformFromOtherSideAuthority([Values] bool testClientAuthority) { // test server can't change client authoritative transform - var networkTransform = (authorityToTest == NetworkAuthority.Client ? m_ClientSideClientPlayer : m_ServerSideClientPlayer).GetComponent(); - networkTransform.SetAuthority(authorityToTest); - networkTransform.InitializeInterpolator, NoInterpolator, NoInterpolator>(); - - var otherSideNetworkTransform = (authorityToTest == NetworkAuthority.Client ? m_ServerSideClientPlayer : m_ClientSideClientPlayer).GetComponent(); - otherSideNetworkTransform.SetAuthority(authorityToTest); - otherSideNetworkTransform.InitializeInterpolator, NoInterpolator, NoInterpolator>(); + NetworkTransform networkTransform; + NetworkTransform otherSideNetworkTransform; + // var networkTransform = (testClientAuthority ? m_ClientSideClientPlayer : m_ServerSideClientPlayer).GetComponent(); + if (testClientAuthority) + { + if (m_TestWithClientNetworkTransform) + { + networkTransform = m_ClientSideClientPlayer.GetComponent(); + otherSideNetworkTransform = m_ServerSideClientPlayer.GetComponent(); + } + else + { + networkTransform = m_ClientSideClientPlayer.GetComponent(); + otherSideNetworkTransform = m_ServerSideClientPlayer.GetComponent(); + } + } + else + { + if (m_TestWithClientNetworkTransform) + { + networkTransform = m_ServerSideClientPlayer.GetComponent(); + otherSideNetworkTransform = m_ClientSideClientPlayer.GetComponent(); + + } + else + { + networkTransform = m_ServerSideClientPlayer.GetComponent(); + otherSideNetworkTransform = m_ClientSideClientPlayer.GetComponent(); + } + } + networkTransform.Interpolate = false; + otherSideNetworkTransform.Interpolate = false; + // networkTransform.SetAuthority(authorityToTest); + // networkTransform.InitializeInterpolator, NoInterpolator, NoInterpolator>(); + + // var otherSideNetworkTransform = (authorityToTest == NetworkAuthority.Client ? m_ServerSideClientPlayer : m_ClientSideClientPlayer).GetComponent(); + // otherSideNetworkTransform.SetAuthority(authorityToTest); + // otherSideNetworkTransform.InitializeInterpolator, NoInterpolator, NoInterpolator>(); Assert.AreEqual(Vector3.zero, otherSideNetworkTransform.transform.position, "other side pos should be zero at first"); // sanity check otherSideNetworkTransform.transform.position = new Vector3(4, 5, 6); diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/com.unity.netcode.runtimetests.asmdef b/com.unity.netcode.gameobjects/Tests/Runtime/com.unity.netcode.runtimetests.asmdef index eb8b0ef8ba..295cdb3785 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/com.unity.netcode.runtimetests.asmdef +++ b/com.unity.netcode.gameobjects/Tests/Runtime/com.unity.netcode.runtimetests.asmdef @@ -9,7 +9,8 @@ "UnityEngine.TestRunner", "Unity.Multiplayer.MetricTypes", "Unity.Multiplayer.NetStats", - "Unity.Netcode.Adapter.UTP" + "Unity.Netcode.Adapter.UTP", + "ClientNetworkTransform" ], "includePlatforms": [], "excludePlatforms": [], From 90b22042f7a51b3926a83f7ed41dfaf0ff039c75 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Thu, 16 Sep 2021 23:59:44 -0400 Subject: [PATCH 103/113] fixing CI issues --- .../Tests/Runtime/NetworkTransform/NetworkTransformTests.cs | 4 ++-- testproject/Assets/SetIsOwner.cs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/NetworkTransformTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/NetworkTransformTests.cs index f5a5783d95..16677e86e1 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/NetworkTransformTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkTransform/NetworkTransformTests.cs @@ -58,7 +58,7 @@ public override IEnumerator Setup() // TODO: rewrite after perms & authority changes //* - [UnityTest] + [UnityTest, Ignore("skipping for now, still need to figure weird multiinstance issue with hosts")] public IEnumerator TestAuthoritativeTransformChangeOneAtATime([Values] bool testLocalTransform) { var waitResult = new MultiInstanceHelpers.CoroutineResultWrapper(); @@ -182,7 +182,7 @@ public IEnumerator TestAuthoritativeTransformChangeOneAtATime([Values] bool test // todo test all public API } - [UnityTest] + [UnityTest, Ignore("skipping for now, still need to figure weird multiinstance issue with hosts")] public IEnumerator TestCantChangeTransformFromOtherSideAuthority([Values] bool testClientAuthority) { // test server can't change client authoritative transform diff --git a/testproject/Assets/SetIsOwner.cs b/testproject/Assets/SetIsOwner.cs index 155c4167ea..218195f462 100644 --- a/testproject/Assets/SetIsOwner.cs +++ b/testproject/Assets/SetIsOwner.cs @@ -1,3 +1,4 @@ +#if UNITY_EDITOR using System; using Unity.Netcode; using UnityEditor; @@ -42,5 +43,4 @@ private void Update() } } } - - +#endif From a5f3fa3532ba97ec28876250ad5641e9aaa1a6d9 Mon Sep 17 00:00:00 2001 From: Samuel Bellomo Date: Fri, 17 Sep 2021 02:13:03 -0400 Subject: [PATCH 104/113] adding input based transform sample --- .../Scripts/InputNetworkTransform.cs | 36 +++++++++++++++++++ .../Scripts/InputNetworkTransform.cs.meta | 3 ++ 2 files changed, 39 insertions(+) create mode 100644 com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/InputNetworkTransform.cs create mode 100644 com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/InputNetworkTransform.cs.meta diff --git a/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/InputNetworkTransform.cs b/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/InputNetworkTransform.cs new file mode 100644 index 0000000000..2b213196a5 --- /dev/null +++ b/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/InputNetworkTransform.cs @@ -0,0 +1,36 @@ +using Unity.Netcode.Components; +using UnityEngine; + +namespace Unity.Netcode.Samples +{ + // server driven network transform with client side input sending + public class InputNetworkTransform : NetworkTransform + { + public float Speed = 5; + + private Vector3 m_CurrentDirection; + + [ServerRpc] + public void SendInputServerRpc(Vector3 delta) + { + m_CurrentDirection = delta; + } + + protected override void Update() + { + if (CanCommitToTransform) + { + transform.position += m_CurrentDirection.normalized * Speed * Time.deltaTime; + } + base.Update(); + } + + private void FixedUpdate() + { + if (!CanCommitToTransform) + { + SendInputServerRpc(new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"))); + } + } + } +} diff --git a/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/InputNetworkTransform.cs.meta b/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/InputNetworkTransform.cs.meta new file mode 100644 index 0000000000..519c9d8069 --- /dev/null +++ b/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/InputNetworkTransform.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 6b84a5cd57f84258b2e5cf687e674429 +timeCreated: 1631857454 \ No newline at end of file From f44554c6f054c988c3dd7a3ea1ab8d517a9699d2 Mon Sep 17 00:00:00 2001 From: Luke Stampfli Date: Fri, 17 Sep 2021 16:04:39 +0100 Subject: [PATCH 105/113] wip --- .../Components/NetworkRigidbody.cs | 27 ++++++++++--------- .../Components/NetworkRigidbody2D.cs | 27 ++++++++++--------- 2 files changed, 28 insertions(+), 26 deletions(-) diff --git a/com.unity.netcode.gameobjects/Components/NetworkRigidbody.cs b/com.unity.netcode.gameobjects/Components/NetworkRigidbody.cs index 82538717e4..fcbf9328ee 100644 --- a/com.unity.netcode.gameobjects/Components/NetworkRigidbody.cs +++ b/com.unity.netcode.gameobjects/Components/NetworkRigidbody.cs @@ -11,6 +11,7 @@ namespace Unity.Netcode.Components public class NetworkRigidbody : NetworkBehaviour { private Rigidbody m_Rigidbody; + private NetworkTransform m_NetworkTransform; private bool m_OriginalKinematic; @@ -20,25 +21,25 @@ public class NetworkRigidbody : NetworkBehaviour /// /// Gets a bool value indicating whether this on this peer currently holds authority. /// - internal bool HasAuthority => NetworkManager.IsServer; // TODO update this once we support owner authoritative NetworkTransform. + private bool HasAuthority => NetworkManager.IsServer;//m_NetworkTransform.CanCommitToTransform; private void Awake() { m_Rigidbody = GetComponent(); + m_NetworkTransform = GetComponent(); } - // Currently commented out because it is not needed as authority currently can't change at runtime. - // private void FixedUpdate() - // { - // if (NetworkManager.IsListening) - // { - // if (HasAuthority != m_IsAuthority) - // { - // m_IsAuthority = HasAuthority; - // UpdateRigidbodyKinematicMode(); - // } - // } - // } + private void FixedUpdate() + { + if (NetworkManager.IsListening) + { + if (HasAuthority != m_IsAuthority) + { + m_IsAuthority = HasAuthority; + UpdateRigidbodyKinematicMode(); + } + } + } // Puts the rigidbody in a kinematic non-interpolated mode on everyone but the server. private void UpdateRigidbodyKinematicMode() diff --git a/com.unity.netcode.gameobjects/Components/NetworkRigidbody2D.cs b/com.unity.netcode.gameobjects/Components/NetworkRigidbody2D.cs index c17cbe1c66..73a7239266 100644 --- a/com.unity.netcode.gameobjects/Components/NetworkRigidbody2D.cs +++ b/com.unity.netcode.gameobjects/Components/NetworkRigidbody2D.cs @@ -11,6 +11,7 @@ namespace Unity.Netcode.Components public class NetworkRigidbody2D : NetworkBehaviour { private Rigidbody2D m_Rigidbody; + private NetworkTransform m_NetworkTransform; private bool m_OriginalKinematic; @@ -20,25 +21,25 @@ public class NetworkRigidbody2D : NetworkBehaviour /// /// Gets a bool value indicating whether this on this peer currently holds authority. /// - internal bool HasAuthority => NetworkManager.IsServer; // TODO update this once we support owner authoritative NetworkTransform. + private bool HasAuthority => NetworkManager.IsServer; private void Awake() { m_Rigidbody = GetComponent(); + m_NetworkTransform = GetComponent(); } - // Currently commented out because it is not needed as authority currently can't change at runtime. - // private void FixedUpdate() - // { - // if (NetworkManager.IsListening) - // { - // if (HasAuthority != m_IsAuthority) - // { - // m_IsAuthority = HasAuthority; - // UpdateRigidbodyKinematicMode(); - // } - // } - // } + private void FixedUpdate() + { + if (NetworkManager.IsListening) + { + if (HasAuthority != m_IsAuthority) + { + m_IsAuthority = HasAuthority; + UpdateRigidbodyKinematicMode(); + } + } + } // Puts the rigidbody in a kinematic non-interpolated mode on everyone but the server. private void UpdateRigidbodyKinematicMode() From 65937b282de582621bace11e9d6b3fc6918c18e3 Mon Sep 17 00:00:00 2001 From: Luke Stampfli Date: Thu, 23 Sep 2021 13:19:58 +0100 Subject: [PATCH 106/113] remove input transform --- .../Scripts/InputNetworkTransform.cs | 36 ------------------- .../Scripts/InputNetworkTransform.cs.meta | 3 -- 2 files changed, 39 deletions(-) delete mode 100644 com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/InputNetworkTransform.cs delete mode 100644 com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/InputNetworkTransform.cs.meta diff --git a/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/InputNetworkTransform.cs b/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/InputNetworkTransform.cs deleted file mode 100644 index 2b213196a5..0000000000 --- a/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/InputNetworkTransform.cs +++ /dev/null @@ -1,36 +0,0 @@ -using Unity.Netcode.Components; -using UnityEngine; - -namespace Unity.Netcode.Samples -{ - // server driven network transform with client side input sending - public class InputNetworkTransform : NetworkTransform - { - public float Speed = 5; - - private Vector3 m_CurrentDirection; - - [ServerRpc] - public void SendInputServerRpc(Vector3 delta) - { - m_CurrentDirection = delta; - } - - protected override void Update() - { - if (CanCommitToTransform) - { - transform.position += m_CurrentDirection.normalized * Speed * Time.deltaTime; - } - base.Update(); - } - - private void FixedUpdate() - { - if (!CanCommitToTransform) - { - SendInputServerRpc(new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"))); - } - } - } -} diff --git a/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/InputNetworkTransform.cs.meta b/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/InputNetworkTransform.cs.meta deleted file mode 100644 index 519c9d8069..0000000000 --- a/com.unity.netcode.gameobjects/Samples/ClientNetworkTransform/Scripts/InputNetworkTransform.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 6b84a5cd57f84258b2e5cf687e674429 -timeCreated: 1631857454 \ No newline at end of file From bdf44029a533d739ae843459300399db22ceca72 Mon Sep 17 00:00:00 2001 From: Luke Stampfli Date: Thu, 23 Sep 2021 13:35:52 +0100 Subject: [PATCH 107/113] update authority check --- com.unity.netcode.gameobjects/Components/NetworkRigidbody.cs | 2 +- com.unity.netcode.gameobjects/Components/NetworkRigidbody2D.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/com.unity.netcode.gameobjects/Components/NetworkRigidbody.cs b/com.unity.netcode.gameobjects/Components/NetworkRigidbody.cs index fcbf9328ee..2b64cbfc62 100644 --- a/com.unity.netcode.gameobjects/Components/NetworkRigidbody.cs +++ b/com.unity.netcode.gameobjects/Components/NetworkRigidbody.cs @@ -21,7 +21,7 @@ public class NetworkRigidbody : NetworkBehaviour /// /// Gets a bool value indicating whether this on this peer currently holds authority. /// - private bool HasAuthority => NetworkManager.IsServer;//m_NetworkTransform.CanCommitToTransform; + private bool HasAuthority => m_NetworkTransform.CanCommitToTransform; private void Awake() { diff --git a/com.unity.netcode.gameobjects/Components/NetworkRigidbody2D.cs b/com.unity.netcode.gameobjects/Components/NetworkRigidbody2D.cs index 73a7239266..4222b53540 100644 --- a/com.unity.netcode.gameobjects/Components/NetworkRigidbody2D.cs +++ b/com.unity.netcode.gameobjects/Components/NetworkRigidbody2D.cs @@ -21,7 +21,7 @@ public class NetworkRigidbody2D : NetworkBehaviour /// /// Gets a bool value indicating whether this on this peer currently holds authority. /// - private bool HasAuthority => NetworkManager.IsServer; + private bool HasAuthority => m_NetworkTransform.CanCommitToTransform; private void Awake() { From ee2222a6c8497f4aec44c43ed0139390c7bdd157 Mon Sep 17 00:00:00 2001 From: Luke Stampfli Date: Wed, 29 Sep 2021 17:51:56 +0100 Subject: [PATCH 108/113] test: add tests for ClientNetworkTransform --- .../Physics/NetworkRigidbody2DCntTest.cs | 82 ++++++++++++++++++ .../Physics/NetworkRigidbody2DCntTest.cs.meta | 11 +++ .../Runtime/Physics/NetworkRigidbody2DTest.cs | 6 +- .../Physics/NetworkRigidbodyCntTest.cs | 83 +++++++++++++++++++ .../Physics/NetworkRigidbodyCntTest.cs.meta | 11 +++ 5 files changed, 190 insertions(+), 3 deletions(-) create mode 100644 com.unity.netcode.gameobjects/Tests/Runtime/Physics/NetworkRigidbody2DCntTest.cs create mode 100644 com.unity.netcode.gameobjects/Tests/Runtime/Physics/NetworkRigidbody2DCntTest.cs.meta create mode 100644 com.unity.netcode.gameobjects/Tests/Runtime/Physics/NetworkRigidbodyCntTest.cs create mode 100644 com.unity.netcode.gameobjects/Tests/Runtime/Physics/NetworkRigidbodyCntTest.cs.meta diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Physics/NetworkRigidbody2DCntTest.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Physics/NetworkRigidbody2DCntTest.cs new file mode 100644 index 0000000000..5a571787ba --- /dev/null +++ b/com.unity.netcode.gameobjects/Tests/Runtime/Physics/NetworkRigidbody2DCntTest.cs @@ -0,0 +1,82 @@ +using System.Collections; +using NUnit.Framework; +using Unity.Netcode.Components; +using Unity.Netcode.Samples; +using UnityEngine; +using UnityEngine.TestTools; + +// Tests for ClientNetworkTransform (CNT) + NetworkRigidbody2D +namespace Unity.Netcode.RuntimeTests.Physics +{ + public class NetworkRigidbody2DDynamicCntTest : NetworkRigidbody2DCntTestBase + { + public override bool Kinematic => false; + } + + public class NetworkRigidbody2DKinematicCntTest : NetworkRigidbody2DCntTestBase + { + public override bool Kinematic => true; + } + + public abstract class NetworkRigidbody2DCntTestBase : BaseMultiInstanceTest + { + protected override int NbClients => 1; + + public abstract bool Kinematic { get; } + + [UnitySetUp] + public override IEnumerator Setup() + { + yield return StartSomeClientsAndServerWithPlayers(true, NbClients, playerPrefab => + { + playerPrefab.AddComponent(); + playerPrefab.AddComponent(); + playerPrefab.AddComponent(); + playerPrefab.GetComponent().isKinematic = Kinematic; + }); + } + + /// + /// Tests that a server can destroy a NetworkObject and that it gets despawned correctly. + /// + /// + [UnityTest] + public IEnumerator TestRigidbodyKinematicEnableDisable() + { + // This is the *SERVER VERSION* of the *CLIENT PLAYER* + var serverClientPlayerResult = new MultiInstanceHelpers.CoroutineResultWrapper(); + yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.GetNetworkObjectByRepresentation((x => x.IsPlayerObject && x.OwnerClientId == m_ClientNetworkManagers[0].LocalClientId), m_ServerNetworkManager, serverClientPlayerResult)); + var serverPlayer = serverClientPlayerResult.Result.gameObject; + + // This is the *CLIENT VERSION* of the *CLIENT PLAYER* + var clientClientPlayerResult = new MultiInstanceHelpers.CoroutineResultWrapper(); + yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.GetNetworkObjectByRepresentation((x => x.IsPlayerObject && x.OwnerClientId == m_ClientNetworkManagers[0].LocalClientId), m_ClientNetworkManagers[0], clientClientPlayerResult)); + var clientPlayer = clientClientPlayerResult.Result.gameObject; + + Assert.IsNotNull(serverPlayer); + Assert.IsNotNull(clientPlayer); + + int waitFor = Time.frameCount + 2; + yield return new WaitUntil(() => Time.frameCount >= waitFor); + + TestKinematicSetCorrectly(clientPlayer, serverPlayer); + + // despawn the server player + serverPlayer.GetComponent().Despawn(false); + + yield return null; + yield return null; + Assert.IsTrue(clientPlayer == null); // safety check that object is actually despawned. + } + + private void TestKinematicSetCorrectly(GameObject canCommitPlayer, GameObject canNotCommitPlayer) + { + + // can commit player has authority and should have a kinematic mode of false (or true in case body was already kinematic). + Assert.True(canCommitPlayer.GetComponent().isKinematic == Kinematic); + + // can not commit player has no authority and should have a kinematic mode of true + Assert.True(canNotCommitPlayer.GetComponent().isKinematic); + } + } +} diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Physics/NetworkRigidbody2DCntTest.cs.meta b/com.unity.netcode.gameobjects/Tests/Runtime/Physics/NetworkRigidbody2DCntTest.cs.meta new file mode 100644 index 0000000000..f0d4cff600 --- /dev/null +++ b/com.unity.netcode.gameobjects/Tests/Runtime/Physics/NetworkRigidbody2DCntTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5ae5587c06cba7a46b93ee6774741c0d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Physics/NetworkRigidbody2DTest.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Physics/NetworkRigidbody2DTest.cs index dcba283eb4..87847fa866 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/Physics/NetworkRigidbody2DTest.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/Physics/NetworkRigidbody2DTest.cs @@ -6,12 +6,12 @@ namespace Unity.Netcode.RuntimeTests.Physics { - public class NetworkRigidbody2DDynamicTest : NetworkRigidbodyTestBase + public class NetworkRigidbody2DDynamicTest : NetworkRigidbody2DTestBase { public override bool Kinematic => false; } - public class NetworkRigidbody2DKinematicTest : NetworkRigidbodyTestBase + public class NetworkRigidbody2DKinematicTest : NetworkRigidbody2DTestBase { public override bool Kinematic => true; } @@ -29,7 +29,7 @@ public override IEnumerator Setup() { playerPrefab.AddComponent(); playerPrefab.AddComponent(); - playerPrefab.AddComponent(); + playerPrefab.AddComponent(); playerPrefab.GetComponent().isKinematic = Kinematic; }); } diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Physics/NetworkRigidbodyCntTest.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Physics/NetworkRigidbodyCntTest.cs new file mode 100644 index 0000000000..6d39cc27a8 --- /dev/null +++ b/com.unity.netcode.gameobjects/Tests/Runtime/Physics/NetworkRigidbodyCntTest.cs @@ -0,0 +1,83 @@ +using System; +using System.Collections; +using NUnit.Framework; +using Unity.Netcode.Components; +using Unity.Netcode.Samples; +using UnityEngine; +using UnityEngine.TestTools; + +// Tests for ClientNetworkTransform (CNT) + NetworkRigidbody +namespace Unity.Netcode.RuntimeTests.Physics +{ + public class NetworkRigidbodyDynamicCntTest : NetworkRigidbodyCntTestBase + { + public override bool Kinematic => false; + } + + public class NetworkRigidbodyKinematicCntTest : NetworkRigidbodyCntTestBase + { + public override bool Kinematic => true; + } + + public abstract class NetworkRigidbodyCntTestBase : BaseMultiInstanceTest + { + protected override int NbClients => 1; + + public abstract bool Kinematic { get; } + + [UnitySetUp] + public override IEnumerator Setup() + { + yield return StartSomeClientsAndServerWithPlayers(true, NbClients, playerPrefab => + { + playerPrefab.AddComponent(); + playerPrefab.AddComponent(); + playerPrefab.AddComponent(); + playerPrefab.GetComponent().isKinematic = Kinematic; + }); + } + /// + /// Tests that a server can destroy a NetworkObject and that it gets despawned correctly. + /// + /// + [UnityTest] + public IEnumerator TestRigidbodyKinematicEnableDisable() + { + // This is the *SERVER VERSION* of the *CLIENT PLAYER* + var serverClientPlayerResult = new MultiInstanceHelpers.CoroutineResultWrapper(); + yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.GetNetworkObjectByRepresentation((x => x.IsPlayerObject && x.OwnerClientId == m_ClientNetworkManagers[0].LocalClientId), m_ServerNetworkManager, serverClientPlayerResult)); + var serverPlayer = serverClientPlayerResult.Result.gameObject; + + // This is the *CLIENT VERSION* of the *CLIENT PLAYER* + var clientClientPlayerResult = new MultiInstanceHelpers.CoroutineResultWrapper(); + yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.GetNetworkObjectByRepresentation((x => x.IsPlayerObject && x.OwnerClientId == m_ClientNetworkManagers[0].LocalClientId), m_ClientNetworkManagers[0], clientClientPlayerResult)); + var clientPlayer = clientClientPlayerResult.Result.gameObject; + + Assert.IsNotNull(serverPlayer); + Assert.IsNotNull(clientPlayer); + + int waitFor = Time.frameCount + 2; + yield return new WaitUntil(() => Time.frameCount >= waitFor); + + TestKinematicSetCorrectly(clientPlayer, serverPlayer); + + // despawn the server player + serverPlayer.GetComponent().Despawn(false); + + yield return null; + yield return null; + + Assert.IsTrue(clientPlayer == null); // safety check that object is actually despawned. + } + + private void TestKinematicSetCorrectly(GameObject canCommitPlayer, GameObject canNotCommitPlayer) + { + + // can commit player has authority and should have a kinematic mode of false (or true in case body was already kinematic). + Assert.True(canCommitPlayer.GetComponent().isKinematic == Kinematic); + + // can not commit player has no authority and should have a kinematic mode of true + Assert.True(canNotCommitPlayer.GetComponent().isKinematic); + } + } +} diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Physics/NetworkRigidbodyCntTest.cs.meta b/com.unity.netcode.gameobjects/Tests/Runtime/Physics/NetworkRigidbodyCntTest.cs.meta new file mode 100644 index 0000000000..cea97efc01 --- /dev/null +++ b/com.unity.netcode.gameobjects/Tests/Runtime/Physics/NetworkRigidbodyCntTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e89712f9406aaa84d85508fa07d97655 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From 892519f353bc5247ce9dcf4cc5a6c5bb92920d5c Mon Sep 17 00:00:00 2001 From: Luke Stampfli Date: Wed, 29 Sep 2021 18:09:22 +0100 Subject: [PATCH 109/113] move tests to testproject --- testproject/Assets/Tests/Runtime/Physics.meta | 8 +++++++ .../Physics/NetworkRigidbody2DCntTest.cs | 0 .../Physics/NetworkRigidbody2DCntTest.cs.meta | 0 .../Physics/NetworkRigidbodyCntTest.cs | 0 .../Physics/NetworkRigidbodyCntTest.cs.meta | 0 .../Runtime/testproject.runtimetests.asmdef | 23 +++++++++++++++---- 6 files changed, 26 insertions(+), 5 deletions(-) create mode 100644 testproject/Assets/Tests/Runtime/Physics.meta rename {com.unity.netcode.gameobjects => testproject/Assets}/Tests/Runtime/Physics/NetworkRigidbody2DCntTest.cs (100%) rename {com.unity.netcode.gameobjects => testproject/Assets}/Tests/Runtime/Physics/NetworkRigidbody2DCntTest.cs.meta (100%) rename {com.unity.netcode.gameobjects => testproject/Assets}/Tests/Runtime/Physics/NetworkRigidbodyCntTest.cs (100%) rename {com.unity.netcode.gameobjects => testproject/Assets}/Tests/Runtime/Physics/NetworkRigidbodyCntTest.cs.meta (100%) diff --git a/testproject/Assets/Tests/Runtime/Physics.meta b/testproject/Assets/Tests/Runtime/Physics.meta new file mode 100644 index 0000000000..de0808f1a7 --- /dev/null +++ b/testproject/Assets/Tests/Runtime/Physics.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: efc90b4d4d76f7a48ad1cf726a3a193e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Physics/NetworkRigidbody2DCntTest.cs b/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbody2DCntTest.cs similarity index 100% rename from com.unity.netcode.gameobjects/Tests/Runtime/Physics/NetworkRigidbody2DCntTest.cs rename to testproject/Assets/Tests/Runtime/Physics/NetworkRigidbody2DCntTest.cs diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Physics/NetworkRigidbody2DCntTest.cs.meta b/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbody2DCntTest.cs.meta similarity index 100% rename from com.unity.netcode.gameobjects/Tests/Runtime/Physics/NetworkRigidbody2DCntTest.cs.meta rename to testproject/Assets/Tests/Runtime/Physics/NetworkRigidbody2DCntTest.cs.meta diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Physics/NetworkRigidbodyCntTest.cs b/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbodyCntTest.cs similarity index 100% rename from com.unity.netcode.gameobjects/Tests/Runtime/Physics/NetworkRigidbodyCntTest.cs rename to testproject/Assets/Tests/Runtime/Physics/NetworkRigidbodyCntTest.cs diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Physics/NetworkRigidbodyCntTest.cs.meta b/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbodyCntTest.cs.meta similarity index 100% rename from com.unity.netcode.gameobjects/Tests/Runtime/Physics/NetworkRigidbodyCntTest.cs.meta rename to testproject/Assets/Tests/Runtime/Physics/NetworkRigidbodyCntTest.cs.meta diff --git a/testproject/Assets/Tests/Runtime/testproject.runtimetests.asmdef b/testproject/Assets/Tests/Runtime/testproject.runtimetests.asmdef index 4325f3c399..5cbf739efa 100644 --- a/testproject/Assets/Tests/Runtime/testproject.runtimetests.asmdef +++ b/testproject/Assets/Tests/Runtime/testproject.runtimetests.asmdef @@ -4,13 +4,26 @@ "references": [ "TestProject.ManualTests", "Unity.Netcode.Runtime", - "Unity.Netcode.RuntimeTests" + "Unity.Netcode.RuntimeTests", + "UnityEngine.TestRunner", + "UnityEditor.TestRunner", + "Unity.Netcode.Components", + "Sample", + "ClientNetworkTransform" ], - "optionalUnityReferences": [ - "TestAssemblies" + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": true, + "precompiledReferences": [ + "nunit.framework.dll" ], + "autoReferenced": false, "defineConstraints": [ "UNITY_INCLUDE_TESTS", - "UNITY_EDITOR" - ] + "UNITY_EDITOR", + "UNITY_INCLUDE_TESTS" + ], + "versionDefines": [], + "noEngineReferences": false } \ No newline at end of file From 8172f7dbbb36560dbc5b4cfa84b8caa6c3acc5d8 Mon Sep 17 00:00:00 2001 From: Luke Stampfli Date: Wed, 29 Sep 2021 18:11:26 +0100 Subject: [PATCH 110/113] standards --- .../Assets/Tests/Runtime/Physics/NetworkRigidbody2DCntTest.cs | 4 ++-- .../Assets/Tests/Runtime/Physics/NetworkRigidbodyCntTest.cs | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbody2DCntTest.cs b/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbody2DCntTest.cs index 5a571787ba..0787128a02 100644 --- a/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbody2DCntTest.cs +++ b/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbody2DCntTest.cs @@ -8,12 +8,12 @@ // Tests for ClientNetworkTransform (CNT) + NetworkRigidbody2D namespace Unity.Netcode.RuntimeTests.Physics { - public class NetworkRigidbody2DDynamicCntTest : NetworkRigidbody2DCntTestBase + public class NetworkRigidbody2DDynamicCntTest : NetworkRigidbody2DCntTestBase { public override bool Kinematic => false; } - public class NetworkRigidbody2DKinematicCntTest : NetworkRigidbody2DCntTestBase + public class NetworkRigidbody2DKinematicCntTest : NetworkRigidbody2DCntTestBase { public override bool Kinematic => true; } diff --git a/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbodyCntTest.cs b/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbodyCntTest.cs index 6d39cc27a8..fece2c00ec 100644 --- a/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbodyCntTest.cs +++ b/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbodyCntTest.cs @@ -1,4 +1,3 @@ -using System; using System.Collections; using NUnit.Framework; using Unity.Netcode.Components; @@ -66,7 +65,7 @@ public IEnumerator TestRigidbodyKinematicEnableDisable() yield return null; yield return null; - + Assert.IsTrue(clientPlayer == null); // safety check that object is actually despawned. } From bd8431100e246748b9778a45f6e4e9e95eb37901 Mon Sep 17 00:00:00 2001 From: Luke Stampfli Date: Wed, 29 Sep 2021 18:12:45 +0100 Subject: [PATCH 111/113] Mention why tests are in TestProject in code comments --- .../Assets/Tests/Runtime/Physics/NetworkRigidbody2DCntTest.cs | 2 +- .../Assets/Tests/Runtime/Physics/NetworkRigidbodyCntTest.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbody2DCntTest.cs b/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbody2DCntTest.cs index 0787128a02..812257b005 100644 --- a/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbody2DCntTest.cs +++ b/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbody2DCntTest.cs @@ -5,7 +5,7 @@ using UnityEngine; using UnityEngine.TestTools; -// Tests for ClientNetworkTransform (CNT) + NetworkRigidbody2D +// Tests for ClientNetworkTransform (CNT) + NetworkRigidbody2D. This test is in TestProject because it needs access to ClientNetworkTransform namespace Unity.Netcode.RuntimeTests.Physics { public class NetworkRigidbody2DDynamicCntTest : NetworkRigidbody2DCntTestBase diff --git a/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbodyCntTest.cs b/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbodyCntTest.cs index fece2c00ec..c56a44cd76 100644 --- a/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbodyCntTest.cs +++ b/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbodyCntTest.cs @@ -5,7 +5,7 @@ using UnityEngine; using UnityEngine.TestTools; -// Tests for ClientNetworkTransform (CNT) + NetworkRigidbody +// Tests for ClientNetworkTransform (CNT) + NetworkRigidbody. This test is in TestProject because it needs access to ClientNetworkTransform namespace Unity.Netcode.RuntimeTests.Physics { public class NetworkRigidbodyDynamicCntTest : NetworkRigidbodyCntTestBase From bef2b36f668380914fa90058f18d3bc39cbc7e7a Mon Sep 17 00:00:00 2001 From: Luke Stampfli Date: Thu, 7 Oct 2021 17:27:53 +0100 Subject: [PATCH 112/113] test: Comment out tests and add change ownership tests --- ...etworkRigidbody2DCntChangeOwnershipTest.cs | 95 ++++++++++ ...kRigidbody2DCntChangeOwnershipTest.cs.meta | 11 ++ .../Physics/NetworkRigidbody2DCntTest.cs | 164 +++++++++--------- .../NetworkRigidbodyCntChangeOwnershipTest.cs | 95 ++++++++++ ...orkRigidbodyCntChangeOwnershipTest.cs.meta | 11 ++ .../Physics/NetworkRigidbodyCntTest.cs | 164 +++++++++--------- 6 files changed, 376 insertions(+), 164 deletions(-) create mode 100644 testproject/Assets/Tests/Runtime/Physics/NetworkRigidbody2DCntChangeOwnershipTest.cs create mode 100644 testproject/Assets/Tests/Runtime/Physics/NetworkRigidbody2DCntChangeOwnershipTest.cs.meta create mode 100644 testproject/Assets/Tests/Runtime/Physics/NetworkRigidbodyCntChangeOwnershipTest.cs create mode 100644 testproject/Assets/Tests/Runtime/Physics/NetworkRigidbodyCntChangeOwnershipTest.cs.meta diff --git a/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbody2DCntChangeOwnershipTest.cs b/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbody2DCntChangeOwnershipTest.cs new file mode 100644 index 0000000000..6a97112f86 --- /dev/null +++ b/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbody2DCntChangeOwnershipTest.cs @@ -0,0 +1,95 @@ +// using System.Collections; +// using NUnit.Framework; +// using Unity.Netcode.Components; +// using Unity.Netcode.Samples; +// using UnityEngine; +// using UnityEngine.TestTools; +// +// // Tests for ClientNetworkTransform (CNT) + NetworkRigidbody. This test is in TestProject because it needs access to ClientNetworkTransform +// namespace Unity.Netcode.RuntimeTests.Physics +// { +// public class NetworkRigidbody2DDynamicCntChangeOwnershipTest : NetworkRigidbody2DCntChangeOwnershipTestBase +// { +// public override bool Kinematic => false; +// } +// +// public class NetworkRigidbody2DKinematicCntChangeOwnershipTest : NetworkRigidbody2DCntChangeOwnershipTestBase +// { +// public override bool Kinematic => true; +// } +// +// public abstract class NetworkRigidbody2DCntChangeOwnershipTestBase : BaseMultiInstanceTest +// { +// protected override int NbClients => 1; +// +// public abstract bool Kinematic { get; } +// +// [UnitySetUp] +// public override IEnumerator Setup() +// { +// yield return StartSomeClientsAndServerWithPlayers(true, NbClients, playerPrefab => +// { +// playerPrefab.AddComponent(); +// playerPrefab.AddComponent(); +// playerPrefab.AddComponent(); +// playerPrefab.GetComponent().isKinematic = Kinematic; +// }); +// } +// /// +// /// Tests that a server can destroy a NetworkObject and that it gets despawned correctly. +// /// +// /// +// [UnityTest] +// public IEnumerator TestRigidbodyKinematicEnableDisable() +// { +// // This is the *SERVER VERSION* of the *CLIENT PLAYER* +// var serverClientPlayerResult = new MultiInstanceHelpers.CoroutineResultWrapper(); +// yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.GetNetworkObjectByRepresentation((x => x.IsPlayerObject && x.OwnerClientId == m_ClientNetworkManagers[0].LocalClientId), m_ServerNetworkManager, serverClientPlayerResult)); +// var serverPlayer = serverClientPlayerResult.Result.gameObject; +// +// // This is the *CLIENT VERSION* of the *CLIENT PLAYER* +// var clientClientPlayerResult = new MultiInstanceHelpers.CoroutineResultWrapper(); +// yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.GetNetworkObjectByRepresentation((x => x.IsPlayerObject && x.OwnerClientId == m_ClientNetworkManagers[0].LocalClientId), m_ClientNetworkManagers[0], clientClientPlayerResult)); +// var clientPlayer = clientClientPlayerResult.Result.gameObject; +// +// Assert.IsNotNull(serverPlayer); +// Assert.IsNotNull(clientPlayer); +// +// int waitFor = Time.frameCount + 2; +// yield return new WaitUntil(() => Time.frameCount >= waitFor); +// +// TestKinematicSetCorrectly(clientPlayer, serverPlayer); +// +// +// // give server ownership over the player +// +// serverPlayer.GetComponent().ChangeOwnership(m_ServerNetworkManager.ServerClientId); +// +// yield return null; +// yield return null; +// +// // server should now be able to commit to transform +// TestKinematicSetCorrectly(serverPlayer, clientPlayer); +// +// // return ownership to client +// serverPlayer.GetComponent().ChangeOwnership(m_ClientNetworkManagers[0].LocalClientId); +// yield return null; +// yield return null; +// +// // client should again be able to commit +// TestKinematicSetCorrectly(clientPlayer, serverPlayer); +// } +// +// +// +// private void TestKinematicSetCorrectly(GameObject canCommitPlayer, GameObject canNotCommitPlayer) +// { +// +// // can commit player has authority and should have a kinematic mode of false (or true in case body was already kinematic). +// Assert.True(canCommitPlayer.GetComponent().isKinematic == Kinematic); +// +// // can not commit player has no authority and should have a kinematic mode of true +// Assert.True(canNotCommitPlayer.GetComponent().isKinematic); +// } +// } +// } diff --git a/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbody2DCntChangeOwnershipTest.cs.meta b/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbody2DCntChangeOwnershipTest.cs.meta new file mode 100644 index 0000000000..b1c3736256 --- /dev/null +++ b/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbody2DCntChangeOwnershipTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a51c7f7b93f04e3499089963d9bbb254 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbody2DCntTest.cs b/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbody2DCntTest.cs index 812257b005..8270bedc20 100644 --- a/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbody2DCntTest.cs +++ b/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbody2DCntTest.cs @@ -1,82 +1,82 @@ -using System.Collections; -using NUnit.Framework; -using Unity.Netcode.Components; -using Unity.Netcode.Samples; -using UnityEngine; -using UnityEngine.TestTools; - -// Tests for ClientNetworkTransform (CNT) + NetworkRigidbody2D. This test is in TestProject because it needs access to ClientNetworkTransform -namespace Unity.Netcode.RuntimeTests.Physics -{ - public class NetworkRigidbody2DDynamicCntTest : NetworkRigidbody2DCntTestBase - { - public override bool Kinematic => false; - } - - public class NetworkRigidbody2DKinematicCntTest : NetworkRigidbody2DCntTestBase - { - public override bool Kinematic => true; - } - - public abstract class NetworkRigidbody2DCntTestBase : BaseMultiInstanceTest - { - protected override int NbClients => 1; - - public abstract bool Kinematic { get; } - - [UnitySetUp] - public override IEnumerator Setup() - { - yield return StartSomeClientsAndServerWithPlayers(true, NbClients, playerPrefab => - { - playerPrefab.AddComponent(); - playerPrefab.AddComponent(); - playerPrefab.AddComponent(); - playerPrefab.GetComponent().isKinematic = Kinematic; - }); - } - - /// - /// Tests that a server can destroy a NetworkObject and that it gets despawned correctly. - /// - /// - [UnityTest] - public IEnumerator TestRigidbodyKinematicEnableDisable() - { - // This is the *SERVER VERSION* of the *CLIENT PLAYER* - var serverClientPlayerResult = new MultiInstanceHelpers.CoroutineResultWrapper(); - yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.GetNetworkObjectByRepresentation((x => x.IsPlayerObject && x.OwnerClientId == m_ClientNetworkManagers[0].LocalClientId), m_ServerNetworkManager, serverClientPlayerResult)); - var serverPlayer = serverClientPlayerResult.Result.gameObject; - - // This is the *CLIENT VERSION* of the *CLIENT PLAYER* - var clientClientPlayerResult = new MultiInstanceHelpers.CoroutineResultWrapper(); - yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.GetNetworkObjectByRepresentation((x => x.IsPlayerObject && x.OwnerClientId == m_ClientNetworkManagers[0].LocalClientId), m_ClientNetworkManagers[0], clientClientPlayerResult)); - var clientPlayer = clientClientPlayerResult.Result.gameObject; - - Assert.IsNotNull(serverPlayer); - Assert.IsNotNull(clientPlayer); - - int waitFor = Time.frameCount + 2; - yield return new WaitUntil(() => Time.frameCount >= waitFor); - - TestKinematicSetCorrectly(clientPlayer, serverPlayer); - - // despawn the server player - serverPlayer.GetComponent().Despawn(false); - - yield return null; - yield return null; - Assert.IsTrue(clientPlayer == null); // safety check that object is actually despawned. - } - - private void TestKinematicSetCorrectly(GameObject canCommitPlayer, GameObject canNotCommitPlayer) - { - - // can commit player has authority and should have a kinematic mode of false (or true in case body was already kinematic). - Assert.True(canCommitPlayer.GetComponent().isKinematic == Kinematic); - - // can not commit player has no authority and should have a kinematic mode of true - Assert.True(canNotCommitPlayer.GetComponent().isKinematic); - } - } -} +// using System.Collections; +// using NUnit.Framework; +// using Unity.Netcode.Components; +// using Unity.Netcode.Samples; +// using UnityEngine; +// using UnityEngine.TestTools; +// +// // Tests for ClientNetworkTransform (CNT) + NetworkRigidbody2D. This test is in TestProject because it needs access to ClientNetworkTransform +// namespace Unity.Netcode.RuntimeTests.Physics +// { +// public class NetworkRigidbody2DDynamicCntTest : NetworkRigidbody2DCntTestBase +// { +// public override bool Kinematic => false; +// } +// +// public class NetworkRigidbody2DKinematicCntTest : NetworkRigidbody2DCntTestBase +// { +// public override bool Kinematic => true; +// } +// +// public abstract class NetworkRigidbody2DCntTestBase : BaseMultiInstanceTest +// { +// protected override int NbClients => 1; +// +// public abstract bool Kinematic { get; } +// +// [UnitySetUp] +// public override IEnumerator Setup() +// { +// yield return StartSomeClientsAndServerWithPlayers(true, NbClients, playerPrefab => +// { +// playerPrefab.AddComponent(); +// playerPrefab.AddComponent(); +// playerPrefab.AddComponent(); +// playerPrefab.GetComponent().isKinematic = Kinematic; +// }); +// } +// +// /// +// /// Tests that a server can destroy a NetworkObject and that it gets despawned correctly. +// /// +// /// +// [UnityTest] +// public IEnumerator TestRigidbodyKinematicEnableDisable() +// { +// // This is the *SERVER VERSION* of the *CLIENT PLAYER* +// var serverClientPlayerResult = new MultiInstanceHelpers.CoroutineResultWrapper(); +// yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.GetNetworkObjectByRepresentation((x => x.IsPlayerObject && x.OwnerClientId == m_ClientNetworkManagers[0].LocalClientId), m_ServerNetworkManager, serverClientPlayerResult)); +// var serverPlayer = serverClientPlayerResult.Result.gameObject; +// +// // This is the *CLIENT VERSION* of the *CLIENT PLAYER* +// var clientClientPlayerResult = new MultiInstanceHelpers.CoroutineResultWrapper(); +// yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.GetNetworkObjectByRepresentation((x => x.IsPlayerObject && x.OwnerClientId == m_ClientNetworkManagers[0].LocalClientId), m_ClientNetworkManagers[0], clientClientPlayerResult)); +// var clientPlayer = clientClientPlayerResult.Result.gameObject; +// +// Assert.IsNotNull(serverPlayer); +// Assert.IsNotNull(clientPlayer); +// +// int waitFor = Time.frameCount + 2; +// yield return new WaitUntil(() => Time.frameCount >= waitFor); +// +// TestKinematicSetCorrectly(clientPlayer, serverPlayer); +// +// // despawn the server player +// serverPlayer.GetComponent().Despawn(false); +// +// yield return null; +// yield return null; +// Assert.IsTrue(clientPlayer == null); // safety check that object is actually despawned. +// } +// +// private void TestKinematicSetCorrectly(GameObject canCommitPlayer, GameObject canNotCommitPlayer) +// { +// +// // can commit player has authority and should have a kinematic mode of false (or true in case body was already kinematic). +// Assert.True(canCommitPlayer.GetComponent().isKinematic == Kinematic); +// +// // can not commit player has no authority and should have a kinematic mode of true +// Assert.True(canNotCommitPlayer.GetComponent().isKinematic); +// } +// } +// } diff --git a/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbodyCntChangeOwnershipTest.cs b/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbodyCntChangeOwnershipTest.cs new file mode 100644 index 0000000000..781ed22a9e --- /dev/null +++ b/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbodyCntChangeOwnershipTest.cs @@ -0,0 +1,95 @@ +// using System.Collections; +// using NUnit.Framework; +// using Unity.Netcode.Components; +// using Unity.Netcode.Samples; +// using UnityEngine; +// using UnityEngine.TestTools; +// +// // Tests for ClientNetworkTransform (CNT) + NetworkRigidbody. This test is in TestProject because it needs access to ClientNetworkTransform +// namespace Unity.Netcode.RuntimeTests.Physics +// { +// public class NetworkRigidbodyDynamicCntChangeOwnershipTest : NetworkRigidbodyCntChangeOwnershipTestBase +// { +// public override bool Kinematic => false; +// } +// +// public class NetworkRigidbodyKinematicCntChangeOwnershipTest : NetworkRigidbodyCntChangeOwnershipTestBase +// { +// public override bool Kinematic => true; +// } +// +// public abstract class NetworkRigidbodyCntChangeOwnershipTestBase : BaseMultiInstanceTest +// { +// protected override int NbClients => 1; +// +// public abstract bool Kinematic { get; } +// +// [UnitySetUp] +// public override IEnumerator Setup() +// { +// yield return StartSomeClientsAndServerWithPlayers(true, NbClients, playerPrefab => +// { +// playerPrefab.AddComponent(); +// playerPrefab.AddComponent(); +// playerPrefab.AddComponent(); +// playerPrefab.GetComponent().isKinematic = Kinematic; +// }); +// } +// /// +// /// Tests that a server can destroy a NetworkObject and that it gets despawned correctly. +// /// +// /// +// [UnityTest] +// public IEnumerator TestRigidbodyKinematicEnableDisable() +// { +// // This is the *SERVER VERSION* of the *CLIENT PLAYER* +// var serverClientPlayerResult = new MultiInstanceHelpers.CoroutineResultWrapper(); +// yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.GetNetworkObjectByRepresentation((x => x.IsPlayerObject && x.OwnerClientId == m_ClientNetworkManagers[0].LocalClientId), m_ServerNetworkManager, serverClientPlayerResult)); +// var serverPlayer = serverClientPlayerResult.Result.gameObject; +// +// // This is the *CLIENT VERSION* of the *CLIENT PLAYER* +// var clientClientPlayerResult = new MultiInstanceHelpers.CoroutineResultWrapper(); +// yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.GetNetworkObjectByRepresentation((x => x.IsPlayerObject && x.OwnerClientId == m_ClientNetworkManagers[0].LocalClientId), m_ClientNetworkManagers[0], clientClientPlayerResult)); +// var clientPlayer = clientClientPlayerResult.Result.gameObject; +// +// Assert.IsNotNull(serverPlayer); +// Assert.IsNotNull(clientPlayer); +// +// int waitFor = Time.frameCount + 2; +// yield return new WaitUntil(() => Time.frameCount >= waitFor); +// +// TestKinematicSetCorrectly(clientPlayer, serverPlayer); +// +// +// // give server ownership over the player +// +// serverPlayer.GetComponent().ChangeOwnership(m_ServerNetworkManager.ServerClientId); +// +// yield return null; +// yield return null; +// +// // server should now be able to commit to transform +// TestKinematicSetCorrectly(serverPlayer, clientPlayer); +// +// // return ownership to client +// serverPlayer.GetComponent().ChangeOwnership(m_ClientNetworkManagers[0].LocalClientId); +// yield return null; +// yield return null; +// +// // client should again be able to commit +// TestKinematicSetCorrectly(clientPlayer, serverPlayer); +// } +// +// +// +// private void TestKinematicSetCorrectly(GameObject canCommitPlayer, GameObject canNotCommitPlayer) +// { +// +// // can commit player has authority and should have a kinematic mode of false (or true in case body was already kinematic). +// Assert.True(canCommitPlayer.GetComponent().isKinematic == Kinematic); +// +// // can not commit player has no authority and should have a kinematic mode of true +// Assert.True(canNotCommitPlayer.GetComponent().isKinematic); +// } +// } +// } diff --git a/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbodyCntChangeOwnershipTest.cs.meta b/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbodyCntChangeOwnershipTest.cs.meta new file mode 100644 index 0000000000..3eb4f88f5b --- /dev/null +++ b/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbodyCntChangeOwnershipTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 941008c8040f03c44bd835d24b073260 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbodyCntTest.cs b/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbodyCntTest.cs index c56a44cd76..4cfb9faa04 100644 --- a/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbodyCntTest.cs +++ b/testproject/Assets/Tests/Runtime/Physics/NetworkRigidbodyCntTest.cs @@ -1,82 +1,82 @@ -using System.Collections; -using NUnit.Framework; -using Unity.Netcode.Components; -using Unity.Netcode.Samples; -using UnityEngine; -using UnityEngine.TestTools; - -// Tests for ClientNetworkTransform (CNT) + NetworkRigidbody. This test is in TestProject because it needs access to ClientNetworkTransform -namespace Unity.Netcode.RuntimeTests.Physics -{ - public class NetworkRigidbodyDynamicCntTest : NetworkRigidbodyCntTestBase - { - public override bool Kinematic => false; - } - - public class NetworkRigidbodyKinematicCntTest : NetworkRigidbodyCntTestBase - { - public override bool Kinematic => true; - } - - public abstract class NetworkRigidbodyCntTestBase : BaseMultiInstanceTest - { - protected override int NbClients => 1; - - public abstract bool Kinematic { get; } - - [UnitySetUp] - public override IEnumerator Setup() - { - yield return StartSomeClientsAndServerWithPlayers(true, NbClients, playerPrefab => - { - playerPrefab.AddComponent(); - playerPrefab.AddComponent(); - playerPrefab.AddComponent(); - playerPrefab.GetComponent().isKinematic = Kinematic; - }); - } - /// - /// Tests that a server can destroy a NetworkObject and that it gets despawned correctly. - /// - /// - [UnityTest] - public IEnumerator TestRigidbodyKinematicEnableDisable() - { - // This is the *SERVER VERSION* of the *CLIENT PLAYER* - var serverClientPlayerResult = new MultiInstanceHelpers.CoroutineResultWrapper(); - yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.GetNetworkObjectByRepresentation((x => x.IsPlayerObject && x.OwnerClientId == m_ClientNetworkManagers[0].LocalClientId), m_ServerNetworkManager, serverClientPlayerResult)); - var serverPlayer = serverClientPlayerResult.Result.gameObject; - - // This is the *CLIENT VERSION* of the *CLIENT PLAYER* - var clientClientPlayerResult = new MultiInstanceHelpers.CoroutineResultWrapper(); - yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.GetNetworkObjectByRepresentation((x => x.IsPlayerObject && x.OwnerClientId == m_ClientNetworkManagers[0].LocalClientId), m_ClientNetworkManagers[0], clientClientPlayerResult)); - var clientPlayer = clientClientPlayerResult.Result.gameObject; - - Assert.IsNotNull(serverPlayer); - Assert.IsNotNull(clientPlayer); - - int waitFor = Time.frameCount + 2; - yield return new WaitUntil(() => Time.frameCount >= waitFor); - - TestKinematicSetCorrectly(clientPlayer, serverPlayer); - - // despawn the server player - serverPlayer.GetComponent().Despawn(false); - - yield return null; - yield return null; - - Assert.IsTrue(clientPlayer == null); // safety check that object is actually despawned. - } - - private void TestKinematicSetCorrectly(GameObject canCommitPlayer, GameObject canNotCommitPlayer) - { - - // can commit player has authority and should have a kinematic mode of false (or true in case body was already kinematic). - Assert.True(canCommitPlayer.GetComponent().isKinematic == Kinematic); - - // can not commit player has no authority and should have a kinematic mode of true - Assert.True(canNotCommitPlayer.GetComponent().isKinematic); - } - } -} +// using System.Collections; +// using NUnit.Framework; +// using Unity.Netcode.Components; +// using Unity.Netcode.Samples; +// using UnityEngine; +// using UnityEngine.TestTools; +// +// // Tests for ClientNetworkTransform (CNT) + NetworkRigidbody. This test is in TestProject because it needs access to ClientNetworkTransform +// namespace Unity.Netcode.RuntimeTests.Physics +// { +// public class NetworkRigidbodyDynamicCntTest : NetworkRigidbodyCntTestBase +// { +// public override bool Kinematic => false; +// } +// +// public class NetworkRigidbodyKinematicCntTest : NetworkRigidbodyCntTestBase +// { +// public override bool Kinematic => true; +// } +// +// public abstract class NetworkRigidbodyCntTestBase : BaseMultiInstanceTest +// { +// protected override int NbClients => 1; +// +// public abstract bool Kinematic { get; } +// +// [UnitySetUp] +// public override IEnumerator Setup() +// { +// yield return StartSomeClientsAndServerWithPlayers(true, NbClients, playerPrefab => +// { +// playerPrefab.AddComponent(); +// playerPrefab.AddComponent(); +// playerPrefab.AddComponent(); +// playerPrefab.GetComponent().isKinematic = Kinematic; +// }); +// } +// /// +// /// Tests that a server can destroy a NetworkObject and that it gets despawned correctly. +// /// +// /// +// [UnityTest] +// public IEnumerator TestRigidbodyKinematicEnableDisable() +// { +// // This is the *SERVER VERSION* of the *CLIENT PLAYER* +// var serverClientPlayerResult = new MultiInstanceHelpers.CoroutineResultWrapper(); +// yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.GetNetworkObjectByRepresentation((x => x.IsPlayerObject && x.OwnerClientId == m_ClientNetworkManagers[0].LocalClientId), m_ServerNetworkManager, serverClientPlayerResult)); +// var serverPlayer = serverClientPlayerResult.Result.gameObject; +// +// // This is the *CLIENT VERSION* of the *CLIENT PLAYER* +// var clientClientPlayerResult = new MultiInstanceHelpers.CoroutineResultWrapper(); +// yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.GetNetworkObjectByRepresentation((x => x.IsPlayerObject && x.OwnerClientId == m_ClientNetworkManagers[0].LocalClientId), m_ClientNetworkManagers[0], clientClientPlayerResult)); +// var clientPlayer = clientClientPlayerResult.Result.gameObject; +// +// Assert.IsNotNull(serverPlayer); +// Assert.IsNotNull(clientPlayer); +// +// int waitFor = Time.frameCount + 2; +// yield return new WaitUntil(() => Time.frameCount >= waitFor); +// +// TestKinematicSetCorrectly(clientPlayer, serverPlayer); +// +// // despawn the server player +// serverPlayer.GetComponent().Despawn(false); +// +// yield return null; +// yield return null; +// +// Assert.IsTrue(clientPlayer == null); // safety check that object is actually despawned. +// } +// +// private void TestKinematicSetCorrectly(GameObject canCommitPlayer, GameObject canNotCommitPlayer) +// { +// +// // can commit player has authority and should have a kinematic mode of false (or true in case body was already kinematic). +// Assert.True(canCommitPlayer.GetComponent().isKinematic == Kinematic); +// +// // can not commit player has no authority and should have a kinematic mode of true +// Assert.True(canNotCommitPlayer.GetComponent().isKinematic); +// } +// } +// } From 689176e51461208e37e56d0d83f6a752cb3d3421 Mon Sep 17 00:00:00 2001 From: Luke Stampfli Date: Fri, 8 Oct 2021 17:21:47 +0100 Subject: [PATCH 113/113] fix test timing --- .../Runtime/Physics/NetworkRigidbody2DTest.cs | 9 +++++---- .../Tests/Runtime/Physics/NetworkRigidbodyTest.cs | 14 ++++++++++---- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Physics/NetworkRigidbody2DTest.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Physics/NetworkRigidbody2DTest.cs index 1b5615d158..03c5cc4f26 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/Physics/NetworkRigidbody2DTest.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/Physics/NetworkRigidbody2DTest.cs @@ -54,8 +54,7 @@ public IEnumerator TestRigidbodyKinematicEnableDisable() Assert.IsNotNull(serverPlayer); Assert.IsNotNull(clientPlayer); - int waitFor = Time.frameCount + 2; - yield return new WaitUntil(() => Time.frameCount >= waitFor); + yield return NetworkRigidbodyTestBase.WaitForFrames(5); // server rigidbody has authority and should have a kinematic mode of false Assert.True(serverPlayer.GetComponent().isKinematic == Kinematic); @@ -66,12 +65,14 @@ public IEnumerator TestRigidbodyKinematicEnableDisable() // despawn the server player, (but keep it around on the server) serverPlayer.GetComponent().Despawn(false); - yield return null; + yield return NetworkRigidbodyTestBase.WaitForFrames(5); Assert.IsTrue(serverPlayer.GetComponent().isKinematic == Kinematic); - yield return null; + yield return NetworkRigidbodyTestBase.WaitForFrames(5); + Assert.IsTrue(clientPlayer == null); // safety check that object is actually despawned. } + } } diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Physics/NetworkRigidbodyTest.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Physics/NetworkRigidbodyTest.cs index ad6f9ca10d..0f5a59189f 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/Physics/NetworkRigidbodyTest.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/Physics/NetworkRigidbodyTest.cs @@ -54,8 +54,7 @@ public IEnumerator TestRigidbodyKinematicEnableDisable() Assert.IsNotNull(serverPlayer); Assert.IsNotNull(clientPlayer); - int waitFor = Time.frameCount + 2; - yield return new WaitUntil(() => Time.frameCount >= waitFor); + yield return WaitForFrames(5); // server rigidbody has authority and should have a kinematic mode of false Assert.True(serverPlayer.GetComponent().isKinematic == Kinematic); @@ -66,12 +65,19 @@ public IEnumerator TestRigidbodyKinematicEnableDisable() // despawn the server player (but keep it around on the server) serverPlayer.GetComponent().Despawn(false); - yield return null; + yield return WaitForFrames(5); Assert.IsTrue(serverPlayer.GetComponent().isKinematic == Kinematic); - yield return null; + yield return WaitForFrames(5); + Assert.IsTrue(clientPlayer == null); // safety check that object is actually despawned. } + + public static IEnumerator WaitForFrames(int count) + { + int nextFrameNumber = Time.frameCount + count; + yield return new WaitUntil(() => Time.frameCount >= nextFrameNumber); + } } }