diff --git a/.idea/.idea.BABA_YAGA/.idea/workspace.xml b/.idea/.idea.BABA_YAGA/.idea/workspace.xml index ec51234e..58da4e6b 100644 --- a/.idea/.idea.BABA_YAGA/.idea/workspace.xml +++ b/.idea/.idea.BABA_YAGA/.idea/workspace.xml @@ -6,7 +6,10 @@ - + + + + - - - + + @@ -45,26 +47,27 @@ - { - "keyToString": { - "ModuleVcsDetector.initialDetectionPerformed": "true", - "RunOnceActivity.MCP Project settings loaded": "true", - "RunOnceActivity.ShowReadmeOnStart": "true", - "RunOnceActivity.TerminalTabsStorage.copyFrom.TerminalArrangementManager.252": "true", - "RunOnceActivity.git.unshallow": "true", - "RunOnceActivity.typescript.service.memoryLimit.init": "true", - "com.intellij.ml.llm.matterhorn.ej.ui.settings.DefaultModelSelectionForGA.v1": "true", - "git-widget-placeholder": "main", - "junie.onboarding.icon.badge.shown": "true", - "node.js.detected.package.eslint": "true", - "node.js.detected.package.tslint": "true", - "node.js.selected.package.eslint": "(autodetect)", - "node.js.selected.package.tslint": "(autodetect)", - "nodejs_package_manager_path": "npm", - "to.speed.mode.migration.done": "true", - "vue.rearranger.settings.migration": "true" + +}]]> diff --git a/Assets/Prefabs/Nolan/Nolan.prefab b/Assets/Prefabs/Nolan/Nolan.prefab index 6edcf9a1..6d21ea1e 100644 --- a/Assets/Prefabs/Nolan/Nolan.prefab +++ b/Assets/Prefabs/Nolan/Nolan.prefab @@ -13345,7 +13345,7 @@ GameObject: - component: {fileID: 8796553624329906391} m_Layer: 31 m_Name: Nolan - m_TagString: Untagged + m_TagString: Player m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 diff --git a/Assets/Scenes/Test.unity b/Assets/Scenes/Test.unity index 672b5202..d54fec6a 100644 --- a/Assets/Scenes/Test.unity +++ b/Assets/Scenes/Test.unity @@ -4161,6 +4161,103 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 92656953} m_Mesh: {fileID: 4300004, guid: 0af7e66e1b5035b48956c911383efb38, type: 3} +--- !u!1001 &101623195 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 3995187695885635779, guid: 78cdc99d2fb73904586ae402e642e288, type: 3} + propertyPath: m_Name + value: Nolan + objectReference: {fileID: 0} + - target: {fileID: 5202821522363770394, guid: 78cdc99d2fb73904586ae402e642e288, type: 3} + propertyPath: SortKey + value: 3479277828 + objectReference: {fileID: 0} + - target: {fileID: 5202821522363770394, guid: 78cdc99d2fb73904586ae402e642e288, type: 3} + propertyPath: NetworkedBehaviours.Array.size + value: 3 + objectReference: {fileID: 0} + - target: {fileID: 5202821522363770394, guid: 78cdc99d2fb73904586ae402e642e288, type: 3} + propertyPath: 'NetworkedBehaviours.Array.data[2]' + value: + objectReference: {fileID: 101623197} + - target: {fileID: 6021283563354449352, guid: 78cdc99d2fb73904586ae402e642e288, type: 3} + propertyPath: m_LocalPosition.x + value: 19.53037 + objectReference: {fileID: 0} + - target: {fileID: 6021283563354449352, guid: 78cdc99d2fb73904586ae402e642e288, type: 3} + propertyPath: m_LocalPosition.y + value: -4.20374 + objectReference: {fileID: 0} + - target: {fileID: 6021283563354449352, guid: 78cdc99d2fb73904586ae402e642e288, type: 3} + propertyPath: m_LocalPosition.z + value: -14.3962 + objectReference: {fileID: 0} + - target: {fileID: 6021283563354449352, guid: 78cdc99d2fb73904586ae402e642e288, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 6021283563354449352, guid: 78cdc99d2fb73904586ae402e642e288, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6021283563354449352, guid: 78cdc99d2fb73904586ae402e642e288, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6021283563354449352, guid: 78cdc99d2fb73904586ae402e642e288, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6021283563354449352, guid: 78cdc99d2fb73904586ae402e642e288, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6021283563354449352, guid: 78cdc99d2fb73904586ae402e642e288, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6021283563354449352, guid: 78cdc99d2fb73904586ae402e642e288, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: + - targetCorrespondingSourceObject: {fileID: 3995187695885635779, guid: 78cdc99d2fb73904586ae402e642e288, type: 3} + insertIndex: -1 + addedObject: {fileID: 101623197} + m_SourcePrefab: {fileID: 100100000, guid: 78cdc99d2fb73904586ae402e642e288, type: 3} +--- !u!1 &101623196 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 3995187695885635779, guid: 78cdc99d2fb73904586ae402e642e288, type: 3} + m_PrefabInstance: {fileID: 101623195} + m_PrefabAsset: {fileID: 0} +--- !u!114 &101623197 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 101623196} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 517119b8bcd57fd40b9bfa76493b234f, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::TrapPlacementController + availableTraps: + - {fileID: 11400000, guid: 02beb6123d7fe7144bba7780d0ce85fd, type: 2} + - {fileID: 11400000, guid: 050052764582c7847a9dec4afd06b2c7, type: 2} + - {fileID: 11400000, guid: beaf2dd06351db64a8079a5542897324, type: 2} + - {fileID: 11400000, guid: 70af2cb7323231d458063d062cacb928, type: 2} + placementLayerMask: + serializedVersion: 2 + m_Bits: 128 --- !u!1 &104506773 GameObject: m_ObjectHideFlags: 0 @@ -6862,7 +6959,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 0} + m_TransformParent: {fileID: 339150430} m_Modifications: - target: {fileID: 1966569933415532, guid: 9911e76e57e6c5a4cafd49bb29ae7eb1, type: 3} propertyPath: m_Name @@ -6874,11 +6971,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4515406411447202, guid: 9911e76e57e6c5a4cafd49bb29ae7eb1, type: 3} propertyPath: m_LocalPosition.x - value: 28.69 + value: -316.31 objectReference: {fileID: 0} - target: {fileID: 4515406411447202, guid: 9911e76e57e6c5a4cafd49bb29ae7eb1, type: 3} propertyPath: m_LocalPosition.y - value: 9.37 + value: -184.63 objectReference: {fileID: 0} - target: {fileID: 4515406411447202, guid: 9911e76e57e6c5a4cafd49bb29ae7eb1, type: 3} propertyPath: m_LocalPosition.z @@ -6890,15 +6987,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4515406411447202, guid: 9911e76e57e6c5a4cafd49bb29ae7eb1, type: 3} propertyPath: m_LocalRotation.x - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4515406411447202, guid: 9911e76e57e6c5a4cafd49bb29ae7eb1, type: 3} propertyPath: m_LocalRotation.y - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4515406411447202, guid: 9911e76e57e6c5a4cafd49bb29ae7eb1, type: 3} propertyPath: m_LocalRotation.z - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4515406411447202, guid: 9911e76e57e6c5a4cafd49bb29ae7eb1, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -6917,6 +7014,11 @@ PrefabInstance: m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 9911e76e57e6c5a4cafd49bb29ae7eb1, type: 3} +--- !u!4 &163723984 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4515406411447202, guid: 9911e76e57e6c5a4cafd49bb29ae7eb1, type: 3} + m_PrefabInstance: {fileID: 163723983} + m_PrefabAsset: {fileID: 0} --- !u!1 &163771613 GameObject: m_ObjectHideFlags: 0 @@ -8459,7 +8561,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 0} + m_TransformParent: {fileID: 339150430} m_Modifications: - target: {fileID: 1221344925788054, guid: cd257a5cc8606524ab3a4e13d447bd82, type: 3} propertyPath: m_Name @@ -8471,11 +8573,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4342184304725548, guid: cd257a5cc8606524ab3a4e13d447bd82, type: 3} propertyPath: m_LocalPosition.x - value: 31.33 + value: -313.67 objectReference: {fileID: 0} - target: {fileID: 4342184304725548, guid: cd257a5cc8606524ab3a4e13d447bd82, type: 3} propertyPath: m_LocalPosition.y - value: 4.78 + value: -189.22 objectReference: {fileID: 0} - target: {fileID: 4342184304725548, guid: cd257a5cc8606524ab3a4e13d447bd82, type: 3} propertyPath: m_LocalPosition.z @@ -8487,15 +8589,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4342184304725548, guid: cd257a5cc8606524ab3a4e13d447bd82, type: 3} propertyPath: m_LocalRotation.x - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4342184304725548, guid: cd257a5cc8606524ab3a4e13d447bd82, type: 3} propertyPath: m_LocalRotation.y - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4342184304725548, guid: cd257a5cc8606524ab3a4e13d447bd82, type: 3} propertyPath: m_LocalRotation.z - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4342184304725548, guid: cd257a5cc8606524ab3a4e13d447bd82, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -8514,6 +8616,11 @@ PrefabInstance: m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: cd257a5cc8606524ab3a4e13d447bd82, type: 3} +--- !u!4 &197914485 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4342184304725548, guid: cd257a5cc8606524ab3a4e13d447bd82, type: 3} + m_PrefabInstance: {fileID: 197914484} + m_PrefabAsset: {fileID: 0} --- !u!1 &198509995 GameObject: m_ObjectHideFlags: 0 @@ -14374,7 +14481,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 0} + m_TransformParent: {fileID: 339150430} m_Modifications: - target: {fileID: 1432061068797346, guid: c64b847edeb2eb94da5ba81384d3f8fc, type: 3} propertyPath: m_Name @@ -14386,11 +14493,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4737921192513690, guid: c64b847edeb2eb94da5ba81384d3f8fc, type: 3} propertyPath: m_LocalPosition.x - value: -14.75 + value: -359.75 objectReference: {fileID: 0} - target: {fileID: 4737921192513690, guid: c64b847edeb2eb94da5ba81384d3f8fc, type: 3} propertyPath: m_LocalPosition.y - value: 0 + value: -194 objectReference: {fileID: 0} - target: {fileID: 4737921192513690, guid: c64b847edeb2eb94da5ba81384d3f8fc, type: 3} propertyPath: m_LocalPosition.z @@ -14402,15 +14509,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4737921192513690, guid: c64b847edeb2eb94da5ba81384d3f8fc, type: 3} propertyPath: m_LocalRotation.x - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4737921192513690, guid: c64b847edeb2eb94da5ba81384d3f8fc, type: 3} propertyPath: m_LocalRotation.y - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4737921192513690, guid: c64b847edeb2eb94da5ba81384d3f8fc, type: 3} propertyPath: m_LocalRotation.z - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4737921192513690, guid: c64b847edeb2eb94da5ba81384d3f8fc, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -14429,6 +14536,11 @@ PrefabInstance: m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: c64b847edeb2eb94da5ba81384d3f8fc, type: 3} +--- !u!4 &298867544 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4737921192513690, guid: c64b847edeb2eb94da5ba81384d3f8fc, type: 3} + m_PrefabInstance: {fileID: 298867543} + m_PrefabAsset: {fileID: 0} --- !u!1 &300227455 GameObject: m_ObjectHideFlags: 0 @@ -16556,6 +16668,70 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 337519030} m_Mesh: {fileID: 4300028, guid: 65748b8eb87f4234eacbfb946ccf1309, type: 3} +--- !u!1 &339150429 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 339150430} + m_Layer: 0 + m_Name: MAP + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &339150430 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 339150429} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 345, y: 194, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 560684215} + - {fileID: 1283259899} + - {fileID: 1003140189} + - {fileID: 1806668282} + - {fileID: 2087193745} + - {fileID: 924519319} + - {fileID: 844959474} + - {fileID: 298867544} + - {fileID: 1533552318} + - {fileID: 952492727} + - {fileID: 2037795277} + - {fileID: 1854947840} + - {fileID: 1411841311} + - {fileID: 1942378131} + - {fileID: 163723984} + - {fileID: 1223035927} + - {fileID: 1048408967} + - {fileID: 197914485} + - {fileID: 500689752} + - {fileID: 971213740} + - {fileID: 1115569504} + - {fileID: 1270873267} + - {fileID: 1339869288} + - {fileID: 1594876356} + - {fileID: 837019367} + - {fileID: 1653118046} + - {fileID: 1112162597} + - {fileID: 471749531} + - {fileID: 436811325} + - {fileID: 1985664800} + - {fileID: 1137949495} + - {fileID: 1831692161} + - {fileID: 1783237885} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &339851142 GameObject: m_ObjectHideFlags: 0 @@ -21444,7 +21620,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 0} + m_TransformParent: {fileID: 339150430} m_Modifications: - target: {fileID: 1065132372655742, guid: d3104e1e5a1804b4e9c5bf49a3efcf3b, type: 3} propertyPath: m_Name @@ -21456,11 +21632,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4924854972696622, guid: d3104e1e5a1804b4e9c5bf49a3efcf3b, type: 3} propertyPath: m_LocalPosition.x - value: -44.32 + value: -389.32 objectReference: {fileID: 0} - target: {fileID: 4924854972696622, guid: d3104e1e5a1804b4e9c5bf49a3efcf3b, type: 3} propertyPath: m_LocalPosition.y - value: 8.498119 + value: -185.50188 objectReference: {fileID: 0} - target: {fileID: 4924854972696622, guid: d3104e1e5a1804b4e9c5bf49a3efcf3b, type: 3} propertyPath: m_LocalPosition.z @@ -21499,6 +21675,11 @@ PrefabInstance: m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: d3104e1e5a1804b4e9c5bf49a3efcf3b, type: 3} +--- !u!4 &436811325 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4924854972696622, guid: d3104e1e5a1804b4e9c5bf49a3efcf3b, type: 3} + m_PrefabInstance: {fileID: 436811324} + m_PrefabAsset: {fileID: 0} --- !u!1 &439553534 GameObject: m_ObjectHideFlags: 0 @@ -23000,7 +23181,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 0} + m_TransformParent: {fileID: 339150430} m_Modifications: - target: {fileID: 1863703931977514, guid: b484ab835d98f164492ed07a36da9fd6, type: 3} propertyPath: m_Name @@ -23012,11 +23193,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4607140198338638, guid: b484ab835d98f164492ed07a36da9fd6, type: 3} propertyPath: m_LocalPosition.x - value: 30.151215 + value: -314.8488 objectReference: {fileID: 0} - target: {fileID: 4607140198338638, guid: b484ab835d98f164492ed07a36da9fd6, type: 3} propertyPath: m_LocalPosition.y - value: -0.099999495 + value: -194.1 objectReference: {fileID: 0} - target: {fileID: 4607140198338638, guid: b484ab835d98f164492ed07a36da9fd6, type: 3} propertyPath: m_LocalPosition.z @@ -23028,15 +23209,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4607140198338638, guid: b484ab835d98f164492ed07a36da9fd6, type: 3} propertyPath: m_LocalRotation.x - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4607140198338638, guid: b484ab835d98f164492ed07a36da9fd6, type: 3} propertyPath: m_LocalRotation.y - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4607140198338638, guid: b484ab835d98f164492ed07a36da9fd6, type: 3} propertyPath: m_LocalRotation.z - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4607140198338638, guid: b484ab835d98f164492ed07a36da9fd6, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -23055,6 +23236,11 @@ PrefabInstance: m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: b484ab835d98f164492ed07a36da9fd6, type: 3} +--- !u!4 &471749531 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4607140198338638, guid: b484ab835d98f164492ed07a36da9fd6, type: 3} + m_PrefabInstance: {fileID: 471749530} + m_PrefabAsset: {fileID: 0} --- !u!1 &474733885 GameObject: m_ObjectHideFlags: 0 @@ -24009,7 +24195,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 0} + m_TransformParent: {fileID: 339150430} m_Modifications: - target: {fileID: 1205289650670728, guid: e78c12c03eb94f24992a6c2f05974d64, type: 3} propertyPath: m_Name @@ -24021,11 +24207,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4248503404462086, guid: e78c12c03eb94f24992a6c2f05974d64, type: 3} propertyPath: m_LocalPosition.x - value: 35.548 + value: -309.452 objectReference: {fileID: 0} - target: {fileID: 4248503404462086, guid: e78c12c03eb94f24992a6c2f05974d64, type: 3} propertyPath: m_LocalPosition.y - value: 6.26 + value: -187.74 objectReference: {fileID: 0} - target: {fileID: 4248503404462086, guid: e78c12c03eb94f24992a6c2f05974d64, type: 3} propertyPath: m_LocalPosition.z @@ -24037,15 +24223,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4248503404462086, guid: e78c12c03eb94f24992a6c2f05974d64, type: 3} propertyPath: m_LocalRotation.x - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4248503404462086, guid: e78c12c03eb94f24992a6c2f05974d64, type: 3} propertyPath: m_LocalRotation.y - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4248503404462086, guid: e78c12c03eb94f24992a6c2f05974d64, type: 3} propertyPath: m_LocalRotation.z - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4248503404462086, guid: e78c12c03eb94f24992a6c2f05974d64, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -24064,6 +24250,11 @@ PrefabInstance: m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: e78c12c03eb94f24992a6c2f05974d64, type: 3} +--- !u!4 &500689752 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4248503404462086, guid: e78c12c03eb94f24992a6c2f05974d64, type: 3} + m_PrefabInstance: {fileID: 500689751} + m_PrefabAsset: {fileID: 0} --- !u!1 &502061647 GameObject: m_ObjectHideFlags: 0 @@ -27558,7 +27749,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 0} + m_TransformParent: {fileID: 339150430} m_Modifications: - target: {fileID: 1980256280670878, guid: de51fa630e0ea894c80f621cd1360dd3, type: 3} propertyPath: m_Name @@ -27570,11 +27761,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4872918154179056, guid: de51fa630e0ea894c80f621cd1360dd3, type: 3} propertyPath: m_LocalPosition.x - value: 4.67928 + value: -340.3207 objectReference: {fileID: 0} - target: {fileID: 4872918154179056, guid: de51fa630e0ea894c80f621cd1360dd3, type: 3} propertyPath: m_LocalPosition.y - value: 0 + value: -194 objectReference: {fileID: 0} - target: {fileID: 4872918154179056, guid: de51fa630e0ea894c80f621cd1360dd3, type: 3} propertyPath: m_LocalPosition.z @@ -27586,15 +27777,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4872918154179056, guid: de51fa630e0ea894c80f621cd1360dd3, type: 3} propertyPath: m_LocalRotation.x - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4872918154179056, guid: de51fa630e0ea894c80f621cd1360dd3, type: 3} propertyPath: m_LocalRotation.y - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4872918154179056, guid: de51fa630e0ea894c80f621cd1360dd3, type: 3} propertyPath: m_LocalRotation.z - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4872918154179056, guid: de51fa630e0ea894c80f621cd1360dd3, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -27613,6 +27804,11 @@ PrefabInstance: m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: de51fa630e0ea894c80f621cd1360dd3, type: 3} +--- !u!4 &560684215 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4872918154179056, guid: de51fa630e0ea894c80f621cd1360dd3, type: 3} + m_PrefabInstance: {fileID: 560684214} + m_PrefabAsset: {fileID: 0} --- !u!1 &563510609 GameObject: m_ObjectHideFlags: 0 @@ -38895,7 +39091,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 0} + m_TransformParent: {fileID: 339150430} m_Modifications: - target: {fileID: 1703145814520204, guid: 831ba33ea3bd614499bcbc3e5b9188b8, type: 3} propertyPath: m_Name @@ -38907,11 +39103,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4963286175351022, guid: 831ba33ea3bd614499bcbc3e5b9188b8, type: 3} propertyPath: m_LocalPosition.x - value: 33.292404 + value: -311.70758 objectReference: {fileID: 0} - target: {fileID: 4963286175351022, guid: 831ba33ea3bd614499bcbc3e5b9188b8, type: 3} propertyPath: m_LocalPosition.y - value: -0.10000092 + value: -194.1 objectReference: {fileID: 0} - target: {fileID: 4963286175351022, guid: 831ba33ea3bd614499bcbc3e5b9188b8, type: 3} propertyPath: m_LocalPosition.z @@ -38923,15 +39119,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4963286175351022, guid: 831ba33ea3bd614499bcbc3e5b9188b8, type: 3} propertyPath: m_LocalRotation.x - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4963286175351022, guid: 831ba33ea3bd614499bcbc3e5b9188b8, type: 3} propertyPath: m_LocalRotation.y - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4963286175351022, guid: 831ba33ea3bd614499bcbc3e5b9188b8, type: 3} propertyPath: m_LocalRotation.z - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4963286175351022, guid: 831ba33ea3bd614499bcbc3e5b9188b8, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -38950,6 +39146,11 @@ PrefabInstance: m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 831ba33ea3bd614499bcbc3e5b9188b8, type: 3} +--- !u!4 &837019367 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4963286175351022, guid: 831ba33ea3bd614499bcbc3e5b9188b8, type: 3} + m_PrefabInstance: {fileID: 837019366} + m_PrefabAsset: {fileID: 0} --- !u!1 &838043651 GameObject: m_ObjectHideFlags: 0 @@ -39380,7 +39581,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 0} + m_TransformParent: {fileID: 339150430} m_Modifications: - target: {fileID: 1264748121136002, guid: 1652aa5a752a65148a198afb1c8933d2, type: 3} propertyPath: m_Name @@ -39392,11 +39593,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4071735477007552, guid: 1652aa5a752a65148a198afb1c8933d2, type: 3} propertyPath: m_LocalPosition.x - value: 5.04 + value: -339.96 objectReference: {fileID: 0} - target: {fileID: 4071735477007552, guid: 1652aa5a752a65148a198afb1c8933d2, type: 3} propertyPath: m_LocalPosition.y - value: 0.000005210091 + value: -194 objectReference: {fileID: 0} - target: {fileID: 4071735477007552, guid: 1652aa5a752a65148a198afb1c8933d2, type: 3} propertyPath: m_LocalPosition.z @@ -39408,15 +39609,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4071735477007552, guid: 1652aa5a752a65148a198afb1c8933d2, type: 3} propertyPath: m_LocalRotation.x - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4071735477007552, guid: 1652aa5a752a65148a198afb1c8933d2, type: 3} propertyPath: m_LocalRotation.y - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4071735477007552, guid: 1652aa5a752a65148a198afb1c8933d2, type: 3} propertyPath: m_LocalRotation.z - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4071735477007552, guid: 1652aa5a752a65148a198afb1c8933d2, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -39435,6 +39636,11 @@ PrefabInstance: m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 1652aa5a752a65148a198afb1c8933d2, type: 3} +--- !u!4 &844959474 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4071735477007552, guid: 1652aa5a752a65148a198afb1c8933d2, type: 3} + m_PrefabInstance: {fileID: 844959473} + m_PrefabAsset: {fileID: 0} --- !u!1 &851119224 GameObject: m_ObjectHideFlags: 0 @@ -42184,7 +42390,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 0} + m_TransformParent: {fileID: 339150430} m_Modifications: - target: {fileID: 1264748121136002, guid: 1652aa5a752a65148a198afb1c8933d2, type: 3} propertyPath: m_Name @@ -42196,11 +42402,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4071735477007552, guid: 1652aa5a752a65148a198afb1c8933d2, type: 3} propertyPath: m_LocalPosition.x - value: -5.61 + value: -350.61 objectReference: {fileID: 0} - target: {fileID: 4071735477007552, guid: 1652aa5a752a65148a198afb1c8933d2, type: 3} propertyPath: m_LocalPosition.y - value: 0.000005210091 + value: -194 objectReference: {fileID: 0} - target: {fileID: 4071735477007552, guid: 1652aa5a752a65148a198afb1c8933d2, type: 3} propertyPath: m_LocalPosition.z @@ -42212,15 +42418,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4071735477007552, guid: 1652aa5a752a65148a198afb1c8933d2, type: 3} propertyPath: m_LocalRotation.x - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4071735477007552, guid: 1652aa5a752a65148a198afb1c8933d2, type: 3} propertyPath: m_LocalRotation.y - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4071735477007552, guid: 1652aa5a752a65148a198afb1c8933d2, type: 3} propertyPath: m_LocalRotation.z - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4071735477007552, guid: 1652aa5a752a65148a198afb1c8933d2, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -42239,6 +42445,11 @@ PrefabInstance: m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 1652aa5a752a65148a198afb1c8933d2, type: 3} +--- !u!4 &924519319 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4071735477007552, guid: 1652aa5a752a65148a198afb1c8933d2, type: 3} + m_PrefabInstance: {fileID: 924519318} + m_PrefabAsset: {fileID: 0} --- !u!1 &924875868 GameObject: m_ObjectHideFlags: 0 @@ -43564,7 +43775,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 0} + m_TransformParent: {fileID: 339150430} m_Modifications: - target: {fileID: 1031289983165790, guid: 27b5bfd692a61f64f92a875a55f28376, type: 3} propertyPath: m_Name @@ -43576,11 +43787,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4604196523154274, guid: 27b5bfd692a61f64f92a875a55f28376, type: 3} propertyPath: m_LocalPosition.x - value: 5.2 + value: -339.8 objectReference: {fileID: 0} - target: {fileID: 4604196523154274, guid: 27b5bfd692a61f64f92a875a55f28376, type: 3} propertyPath: m_LocalPosition.y - value: 0.0000046958303 + value: -194 objectReference: {fileID: 0} - target: {fileID: 4604196523154274, guid: 27b5bfd692a61f64f92a875a55f28376, type: 3} propertyPath: m_LocalPosition.z @@ -43592,15 +43803,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4604196523154274, guid: 27b5bfd692a61f64f92a875a55f28376, type: 3} propertyPath: m_LocalRotation.x - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4604196523154274, guid: 27b5bfd692a61f64f92a875a55f28376, type: 3} propertyPath: m_LocalRotation.y - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4604196523154274, guid: 27b5bfd692a61f64f92a875a55f28376, type: 3} propertyPath: m_LocalRotation.z - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4604196523154274, guid: 27b5bfd692a61f64f92a875a55f28376, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -43619,6 +43830,11 @@ PrefabInstance: m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 27b5bfd692a61f64f92a875a55f28376, type: 3} +--- !u!4 &952492727 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4604196523154274, guid: 27b5bfd692a61f64f92a875a55f28376, type: 3} + m_PrefabInstance: {fileID: 952492726} + m_PrefabAsset: {fileID: 0} --- !u!1 &963474101 GameObject: m_ObjectHideFlags: 0 @@ -43838,7 +44054,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 0} + m_TransformParent: {fileID: 339150430} m_Modifications: - target: {fileID: 1205289650670728, guid: 64c1f4eee6c9cbe4b975203b4f8ac2f0, type: 3} propertyPath: m_Name @@ -43850,11 +44066,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4248503404462086, guid: 64c1f4eee6c9cbe4b975203b4f8ac2f0, type: 3} propertyPath: m_LocalPosition.x - value: 37.803 + value: -307.197 objectReference: {fileID: 0} - target: {fileID: 4248503404462086, guid: 64c1f4eee6c9cbe4b975203b4f8ac2f0, type: 3} propertyPath: m_LocalPosition.y - value: 4.84 + value: -189.16 objectReference: {fileID: 0} - target: {fileID: 4248503404462086, guid: 64c1f4eee6c9cbe4b975203b4f8ac2f0, type: 3} propertyPath: m_LocalPosition.z @@ -43866,15 +44082,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4248503404462086, guid: 64c1f4eee6c9cbe4b975203b4f8ac2f0, type: 3} propertyPath: m_LocalRotation.x - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4248503404462086, guid: 64c1f4eee6c9cbe4b975203b4f8ac2f0, type: 3} propertyPath: m_LocalRotation.y - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4248503404462086, guid: 64c1f4eee6c9cbe4b975203b4f8ac2f0, type: 3} propertyPath: m_LocalRotation.z - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4248503404462086, guid: 64c1f4eee6c9cbe4b975203b4f8ac2f0, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -43893,6 +44109,11 @@ PrefabInstance: m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 64c1f4eee6c9cbe4b975203b4f8ac2f0, type: 3} +--- !u!4 &971213740 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4248503404462086, guid: 64c1f4eee6c9cbe4b975203b4f8ac2f0, type: 3} + m_PrefabInstance: {fileID: 971213739} + m_PrefabAsset: {fileID: 0} --- !u!1 &974438785 GameObject: m_ObjectHideFlags: 0 @@ -44768,7 +44989,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 0} + m_TransformParent: {fileID: 339150430} m_Modifications: - target: {fileID: 1232322618620288, guid: d31379ea41af1e14184ac8deaa704fcf, type: 3} propertyPath: m_Name @@ -44780,11 +45001,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4448759866926786, guid: d31379ea41af1e14184ac8deaa704fcf, type: 3} propertyPath: m_LocalPosition.x - value: 4.7053 + value: -340.2947 objectReference: {fileID: 0} - target: {fileID: 4448759866926786, guid: d31379ea41af1e14184ac8deaa704fcf, type: 3} propertyPath: m_LocalPosition.y - value: 0.16344 + value: -193.83656 objectReference: {fileID: 0} - target: {fileID: 4448759866926786, guid: d31379ea41af1e14184ac8deaa704fcf, type: 3} propertyPath: m_LocalPosition.z @@ -44823,6 +45044,11 @@ PrefabInstance: m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: d31379ea41af1e14184ac8deaa704fcf, type: 3} +--- !u!4 &1003140189 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4448759866926786, guid: d31379ea41af1e14184ac8deaa704fcf, type: 3} + m_PrefabInstance: {fileID: 1003140188} + m_PrefabAsset: {fileID: 0} --- !u!1 &1006756723 GameObject: m_ObjectHideFlags: 0 @@ -46046,7 +46272,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 0} + m_TransformParent: {fileID: 339150430} m_Modifications: - target: {fileID: 1082308075524082, guid: 87a83f27294ac0749a7b46b19969a490, type: 3} propertyPath: m_Name @@ -46058,11 +46284,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4483273996017840, guid: 87a83f27294ac0749a7b46b19969a490, type: 3} propertyPath: m_LocalPosition.x - value: 33.252327 + value: -311.74768 objectReference: {fileID: 0} - target: {fileID: 4483273996017840, guid: 87a83f27294ac0749a7b46b19969a490, type: 3} propertyPath: m_LocalPosition.y - value: 7.5 + value: -186.5 objectReference: {fileID: 0} - target: {fileID: 4483273996017840, guid: 87a83f27294ac0749a7b46b19969a490, type: 3} propertyPath: m_LocalPosition.z @@ -46074,15 +46300,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4483273996017840, guid: 87a83f27294ac0749a7b46b19969a490, type: 3} propertyPath: m_LocalRotation.x - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4483273996017840, guid: 87a83f27294ac0749a7b46b19969a490, type: 3} propertyPath: m_LocalRotation.y - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4483273996017840, guid: 87a83f27294ac0749a7b46b19969a490, type: 3} propertyPath: m_LocalRotation.z - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4483273996017840, guid: 87a83f27294ac0749a7b46b19969a490, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -46101,6 +46327,11 @@ PrefabInstance: m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 87a83f27294ac0749a7b46b19969a490, type: 3} +--- !u!4 &1048408967 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4483273996017840, guid: 87a83f27294ac0749a7b46b19969a490, type: 3} + m_PrefabInstance: {fileID: 1048408966} + m_PrefabAsset: {fileID: 0} --- !u!1 &1051683544 GameObject: m_ObjectHideFlags: 0 @@ -48742,7 +48973,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 0} + m_TransformParent: {fileID: 339150430} m_Modifications: - target: {fileID: 1063242742049972, guid: ec25d9db605bc2143b527c22bc533ecb, type: 3} propertyPath: m_Name @@ -48754,11 +48985,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4527604716013788, guid: ec25d9db605bc2143b527c22bc533ecb, type: 3} propertyPath: m_LocalPosition.x - value: 32.490982 + value: -312.50903 objectReference: {fileID: 0} - target: {fileID: 4527604716013788, guid: ec25d9db605bc2143b527c22bc533ecb, type: 3} propertyPath: m_LocalPosition.y - value: -0.0999997 + value: -194.1 objectReference: {fileID: 0} - target: {fileID: 4527604716013788, guid: ec25d9db605bc2143b527c22bc533ecb, type: 3} propertyPath: m_LocalPosition.z @@ -48770,15 +49001,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4527604716013788, guid: ec25d9db605bc2143b527c22bc533ecb, type: 3} propertyPath: m_LocalRotation.x - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4527604716013788, guid: ec25d9db605bc2143b527c22bc533ecb, type: 3} propertyPath: m_LocalRotation.y - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4527604716013788, guid: ec25d9db605bc2143b527c22bc533ecb, type: 3} propertyPath: m_LocalRotation.z - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4527604716013788, guid: ec25d9db605bc2143b527c22bc533ecb, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -48797,6 +49028,11 @@ PrefabInstance: m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: ec25d9db605bc2143b527c22bc533ecb, type: 3} +--- !u!4 &1112162597 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4527604716013788, guid: ec25d9db605bc2143b527c22bc533ecb, type: 3} + m_PrefabInstance: {fileID: 1112162596} + m_PrefabAsset: {fileID: 0} --- !u!1 &1113750144 GameObject: m_ObjectHideFlags: 0 @@ -48852,7 +49088,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 0} + m_TransformParent: {fileID: 339150430} m_Modifications: - target: {fileID: 1337696514625810, guid: c2d5177496a74d742a60db11d5a6bc45, type: 3} propertyPath: m_Name @@ -48864,11 +49100,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4127635367186896, guid: c2d5177496a74d742a60db11d5a6bc45, type: 3} propertyPath: m_LocalPosition.x - value: 36.508324 + value: -308.49167 objectReference: {fileID: 0} - target: {fileID: 4127635367186896, guid: c2d5177496a74d742a60db11d5a6bc45, type: 3} propertyPath: m_LocalPosition.y - value: 4.91 + value: -189.09 objectReference: {fileID: 0} - target: {fileID: 4127635367186896, guid: c2d5177496a74d742a60db11d5a6bc45, type: 3} propertyPath: m_LocalPosition.z @@ -48880,15 +49116,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4127635367186896, guid: c2d5177496a74d742a60db11d5a6bc45, type: 3} propertyPath: m_LocalRotation.x - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4127635367186896, guid: c2d5177496a74d742a60db11d5a6bc45, type: 3} propertyPath: m_LocalRotation.y - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4127635367186896, guid: c2d5177496a74d742a60db11d5a6bc45, type: 3} propertyPath: m_LocalRotation.z - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4127635367186896, guid: c2d5177496a74d742a60db11d5a6bc45, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -48907,6 +49143,11 @@ PrefabInstance: m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: c2d5177496a74d742a60db11d5a6bc45, type: 3} +--- !u!4 &1115569504 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4127635367186896, guid: c2d5177496a74d742a60db11d5a6bc45, type: 3} + m_PrefabInstance: {fileID: 1115569503} + m_PrefabAsset: {fileID: 0} --- !u!1 &1118430029 GameObject: m_ObjectHideFlags: 0 @@ -50231,7 +50472,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 0} + m_TransformParent: {fileID: 339150430} m_Modifications: - target: {fileID: 1156049964569698, guid: 00274eefc0873a64594c29b75cff5d72, type: 3} propertyPath: m_Name @@ -50243,11 +50484,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4370197236651786, guid: 00274eefc0873a64594c29b75cff5d72, type: 3} propertyPath: m_LocalPosition.x - value: 27.34891 + value: -317.6511 objectReference: {fileID: 0} - target: {fileID: 4370197236651786, guid: 00274eefc0873a64594c29b75cff5d72, type: 3} propertyPath: m_LocalPosition.y - value: 0.326 + value: -193.674 objectReference: {fileID: 0} - target: {fileID: 4370197236651786, guid: 00274eefc0873a64594c29b75cff5d72, type: 3} propertyPath: m_LocalPosition.z @@ -50286,6 +50527,11 @@ PrefabInstance: m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 00274eefc0873a64594c29b75cff5d72, type: 3} +--- !u!4 &1137949495 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4370197236651786, guid: 00274eefc0873a64594c29b75cff5d72, type: 3} + m_PrefabInstance: {fileID: 1137949494} + m_PrefabAsset: {fileID: 0} --- !u!1 &1140154138 GameObject: m_ObjectHideFlags: 0 @@ -54865,7 +55111,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 0} + m_TransformParent: {fileID: 339150430} m_Modifications: - target: {fileID: 1172216960831676, guid: 07ab553d6c290234b885eb023c701c02, type: 3} propertyPath: m_Name @@ -54877,11 +55123,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4496382204891984, guid: 07ab553d6c290234b885eb023c701c02, type: 3} propertyPath: m_LocalPosition.x - value: 33.554302 + value: -311.4457 objectReference: {fileID: 0} - target: {fileID: 4496382204891984, guid: 07ab553d6c290234b885eb023c701c02, type: 3} propertyPath: m_LocalPosition.y - value: 9.17 + value: -184.83 objectReference: {fileID: 0} - target: {fileID: 4496382204891984, guid: 07ab553d6c290234b885eb023c701c02, type: 3} propertyPath: m_LocalPosition.z @@ -54920,6 +55166,11 @@ PrefabInstance: m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 07ab553d6c290234b885eb023c701c02, type: 3} +--- !u!4 &1223035927 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4496382204891984, guid: 07ab553d6c290234b885eb023c701c02, type: 3} + m_PrefabInstance: {fileID: 1223035926} + m_PrefabAsset: {fileID: 0} --- !u!1 &1225891568 GameObject: m_ObjectHideFlags: 0 @@ -57295,7 +57546,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 0} + m_TransformParent: {fileID: 339150430} m_Modifications: - target: {fileID: 1811263594973386, guid: 00bce47c2b02a1e49928328f8a27c7cd, type: 3} propertyPath: m_Name @@ -57307,11 +57558,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4565015719423054, guid: 00bce47c2b02a1e49928328f8a27c7cd, type: 3} propertyPath: m_LocalPosition.x - value: 33.23 + value: -311.77 objectReference: {fileID: 0} - target: {fileID: 4565015719423054, guid: 00bce47c2b02a1e49928328f8a27c7cd, type: 3} propertyPath: m_LocalPosition.y - value: 4.69 + value: -189.31 objectReference: {fileID: 0} - target: {fileID: 4565015719423054, guid: 00bce47c2b02a1e49928328f8a27c7cd, type: 3} propertyPath: m_LocalPosition.z @@ -57323,15 +57574,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4565015719423054, guid: 00bce47c2b02a1e49928328f8a27c7cd, type: 3} propertyPath: m_LocalRotation.x - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4565015719423054, guid: 00bce47c2b02a1e49928328f8a27c7cd, type: 3} propertyPath: m_LocalRotation.y - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4565015719423054, guid: 00bce47c2b02a1e49928328f8a27c7cd, type: 3} propertyPath: m_LocalRotation.z - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4565015719423054, guid: 00bce47c2b02a1e49928328f8a27c7cd, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -57350,6 +57601,11 @@ PrefabInstance: m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 00bce47c2b02a1e49928328f8a27c7cd, type: 3} +--- !u!4 &1270873267 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4565015719423054, guid: 00bce47c2b02a1e49928328f8a27c7cd, type: 3} + m_PrefabInstance: {fileID: 1270873266} + m_PrefabAsset: {fileID: 0} --- !u!1 &1274959593 GameObject: m_ObjectHideFlags: 0 @@ -57901,7 +58157,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 0} + m_TransformParent: {fileID: 339150430} m_Modifications: - target: {fileID: 1499131111604356, guid: 7f17cd79be360234a8e36315356a769a, type: 3} propertyPath: m_Name @@ -57913,11 +58169,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4394904699217844, guid: 7f17cd79be360234a8e36315356a769a, type: 3} propertyPath: m_LocalPosition.x - value: 2.71 + value: -342.29 objectReference: {fileID: 0} - target: {fileID: 4394904699217844, guid: 7f17cd79be360234a8e36315356a769a, type: 3} propertyPath: m_LocalPosition.y - value: 0.16344 + value: -193.83656 objectReference: {fileID: 0} - target: {fileID: 4394904699217844, guid: 7f17cd79be360234a8e36315356a769a, type: 3} propertyPath: m_LocalPosition.z @@ -57929,15 +58185,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4394904699217844, guid: 7f17cd79be360234a8e36315356a769a, type: 3} propertyPath: m_LocalRotation.x - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4394904699217844, guid: 7f17cd79be360234a8e36315356a769a, type: 3} propertyPath: m_LocalRotation.y - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4394904699217844, guid: 7f17cd79be360234a8e36315356a769a, type: 3} propertyPath: m_LocalRotation.z - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4394904699217844, guid: 7f17cd79be360234a8e36315356a769a, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -57956,6 +58212,11 @@ PrefabInstance: m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 7f17cd79be360234a8e36315356a769a, type: 3} +--- !u!4 &1283259899 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4394904699217844, guid: 7f17cd79be360234a8e36315356a769a, type: 3} + m_PrefabInstance: {fileID: 1283259898} + m_PrefabAsset: {fileID: 0} --- !u!1 &1285451784 GameObject: m_ObjectHideFlags: 0 @@ -61034,7 +61295,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 0} + m_TransformParent: {fileID: 339150430} m_Modifications: - target: {fileID: 1392295376913288, guid: 68316adad77ca6b4abdd0cc62cb4ba24, type: 3} propertyPath: m_Name @@ -61046,11 +61307,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4102768482204448, guid: 68316adad77ca6b4abdd0cc62cb4ba24, type: 3} propertyPath: m_LocalPosition.x - value: 22.275185 + value: -322.72482 objectReference: {fileID: 0} - target: {fileID: 4102768482204448, guid: 68316adad77ca6b4abdd0cc62cb4ba24, type: 3} propertyPath: m_LocalPosition.y - value: -0.000001146772 + value: -194 objectReference: {fileID: 0} - target: {fileID: 4102768482204448, guid: 68316adad77ca6b4abdd0cc62cb4ba24, type: 3} propertyPath: m_LocalPosition.z @@ -61062,15 +61323,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4102768482204448, guid: 68316adad77ca6b4abdd0cc62cb4ba24, type: 3} propertyPath: m_LocalRotation.x - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4102768482204448, guid: 68316adad77ca6b4abdd0cc62cb4ba24, type: 3} propertyPath: m_LocalRotation.y - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4102768482204448, guid: 68316adad77ca6b4abdd0cc62cb4ba24, type: 3} propertyPath: m_LocalRotation.z - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4102768482204448, guid: 68316adad77ca6b4abdd0cc62cb4ba24, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -61089,6 +61350,11 @@ PrefabInstance: m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 68316adad77ca6b4abdd0cc62cb4ba24, type: 3} +--- !u!4 &1339869288 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4102768482204448, guid: 68316adad77ca6b4abdd0cc62cb4ba24, type: 3} + m_PrefabInstance: {fileID: 1339869287} + m_PrefabAsset: {fileID: 0} --- !u!1 &1339911747 GameObject: m_ObjectHideFlags: 0 @@ -63655,7 +63921,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 0} + m_TransformParent: {fileID: 339150430} m_Modifications: - target: {fileID: 1907757158894496, guid: efe95527dff0d074b8df7542fc44a54c, type: 3} propertyPath: m_Name @@ -63667,11 +63933,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4618384689909468, guid: efe95527dff0d074b8df7542fc44a54c, type: 3} propertyPath: m_LocalPosition.x - value: -34.52 + value: -379.52 objectReference: {fileID: 0} - target: {fileID: 4618384689909468, guid: efe95527dff0d074b8df7542fc44a54c, type: 3} propertyPath: m_LocalPosition.y - value: 0.0000047905764 + value: -194 objectReference: {fileID: 0} - target: {fileID: 4618384689909468, guid: efe95527dff0d074b8df7542fc44a54c, type: 3} propertyPath: m_LocalPosition.z @@ -63683,15 +63949,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4618384689909468, guid: efe95527dff0d074b8df7542fc44a54c, type: 3} propertyPath: m_LocalRotation.x - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4618384689909468, guid: efe95527dff0d074b8df7542fc44a54c, type: 3} propertyPath: m_LocalRotation.y - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4618384689909468, guid: efe95527dff0d074b8df7542fc44a54c, type: 3} propertyPath: m_LocalRotation.z - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4618384689909468, guid: efe95527dff0d074b8df7542fc44a54c, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -63714,6 +63980,11 @@ PrefabInstance: m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: efe95527dff0d074b8df7542fc44a54c, type: 3} +--- !u!4 &1411841311 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4618384689909468, guid: efe95527dff0d074b8df7542fc44a54c, type: 3} + m_PrefabInstance: {fileID: 1411841310} + m_PrefabAsset: {fileID: 0} --- !u!1 &1414503926 GameObject: m_ObjectHideFlags: 0 @@ -68557,7 +68828,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 0} + m_TransformParent: {fileID: 339150430} m_Modifications: - target: {fileID: 1772560649162570, guid: f28734d4c47efd14b9165e51b39d9a3c, type: 3} propertyPath: m_Name @@ -68569,11 +68840,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4951712646697660, guid: f28734d4c47efd14b9165e51b39d9a3c, type: 3} propertyPath: m_LocalPosition.x - value: -2.5694666 + value: -347.56946 objectReference: {fileID: 0} - target: {fileID: 4951712646697660, guid: f28734d4c47efd14b9165e51b39d9a3c, type: 3} propertyPath: m_LocalPosition.y - value: 6.597247e-10 + value: -194 objectReference: {fileID: 0} - target: {fileID: 4951712646697660, guid: f28734d4c47efd14b9165e51b39d9a3c, type: 3} propertyPath: m_LocalPosition.z @@ -68585,15 +68856,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4951712646697660, guid: f28734d4c47efd14b9165e51b39d9a3c, type: 3} propertyPath: m_LocalRotation.x - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4951712646697660, guid: f28734d4c47efd14b9165e51b39d9a3c, type: 3} propertyPath: m_LocalRotation.y - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4951712646697660, guid: f28734d4c47efd14b9165e51b39d9a3c, type: 3} propertyPath: m_LocalRotation.z - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4951712646697660, guid: f28734d4c47efd14b9165e51b39d9a3c, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -68612,6 +68883,11 @@ PrefabInstance: m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: f28734d4c47efd14b9165e51b39d9a3c, type: 3} +--- !u!4 &1533552318 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4951712646697660, guid: f28734d4c47efd14b9165e51b39d9a3c, type: 3} + m_PrefabInstance: {fileID: 1533552317} + m_PrefabAsset: {fileID: 0} --- !u!1 &1534291805 GameObject: m_ObjectHideFlags: 0 @@ -71996,7 +72272,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 0} + m_TransformParent: {fileID: 339150430} m_Modifications: - target: {fileID: 1639459519274554, guid: 8d281376ca957754d90384d38c215fa2, type: 3} propertyPath: m_Name @@ -72008,11 +72284,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4725503656346962, guid: 8d281376ca957754d90384d38c215fa2, type: 3} propertyPath: m_LocalPosition.x - value: 21.323748 + value: -323.67624 objectReference: {fileID: 0} - target: {fileID: 4725503656346962, guid: 8d281376ca957754d90384d38c215fa2, type: 3} propertyPath: m_LocalPosition.y - value: 0.35 + value: -193.65 objectReference: {fileID: 0} - target: {fileID: 4725503656346962, guid: 8d281376ca957754d90384d38c215fa2, type: 3} propertyPath: m_LocalPosition.z @@ -72024,15 +72300,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4725503656346962, guid: 8d281376ca957754d90384d38c215fa2, type: 3} propertyPath: m_LocalRotation.x - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4725503656346962, guid: 8d281376ca957754d90384d38c215fa2, type: 3} propertyPath: m_LocalRotation.y - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4725503656346962, guid: 8d281376ca957754d90384d38c215fa2, type: 3} propertyPath: m_LocalRotation.z - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4725503656346962, guid: 8d281376ca957754d90384d38c215fa2, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -72051,6 +72327,11 @@ PrefabInstance: m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 8d281376ca957754d90384d38c215fa2, type: 3} +--- !u!4 &1594876356 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4725503656346962, guid: 8d281376ca957754d90384d38c215fa2, type: 3} + m_PrefabInstance: {fileID: 1594876355} + m_PrefabAsset: {fileID: 0} --- !u!1 &1596535606 GameObject: m_ObjectHideFlags: 0 @@ -74531,7 +74812,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 0} + m_TransformParent: {fileID: 339150430} m_Modifications: - target: {fileID: 1063242742049972, guid: 8efcb8b97cd7a4c4d828f35651e70254, type: 3} propertyPath: m_Name @@ -74543,11 +74824,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4527604716013788, guid: 8efcb8b97cd7a4c4d828f35651e70254, type: 3} propertyPath: m_LocalPosition.x - value: 32.777946 + value: -312.22205 objectReference: {fileID: 0} - target: {fileID: 4527604716013788, guid: 8efcb8b97cd7a4c4d828f35651e70254, type: 3} propertyPath: m_LocalPosition.y - value: -0.09999984 + value: -194.1 objectReference: {fileID: 0} - target: {fileID: 4527604716013788, guid: 8efcb8b97cd7a4c4d828f35651e70254, type: 3} propertyPath: m_LocalPosition.z @@ -74559,15 +74840,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4527604716013788, guid: 8efcb8b97cd7a4c4d828f35651e70254, type: 3} propertyPath: m_LocalRotation.x - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4527604716013788, guid: 8efcb8b97cd7a4c4d828f35651e70254, type: 3} propertyPath: m_LocalRotation.y - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4527604716013788, guid: 8efcb8b97cd7a4c4d828f35651e70254, type: 3} propertyPath: m_LocalRotation.z - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4527604716013788, guid: 8efcb8b97cd7a4c4d828f35651e70254, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -74586,6 +74867,11 @@ PrefabInstance: m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 8efcb8b97cd7a4c4d828f35651e70254, type: 3} +--- !u!4 &1653118046 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4527604716013788, guid: 8efcb8b97cd7a4c4d828f35651e70254, type: 3} + m_PrefabInstance: {fileID: 1653118045} + m_PrefabAsset: {fileID: 0} --- !u!1 &1653740155 GameObject: m_ObjectHideFlags: 0 @@ -80325,7 +80611,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 0} + m_TransformParent: {fileID: 339150430} m_Modifications: - target: {fileID: 1758362690740588, guid: 6516179ff7fd01b4596058831bd3ded6, type: 3} propertyPath: m_Name @@ -80337,11 +80623,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4405084071630950, guid: 6516179ff7fd01b4596058831bd3ded6, type: 3} propertyPath: m_LocalPosition.x - value: 12.857701 + value: -332.1423 objectReference: {fileID: 0} - target: {fileID: 4405084071630950, guid: 6516179ff7fd01b4596058831bd3ded6, type: 3} propertyPath: m_LocalPosition.y - value: 0.894139 + value: -193.10587 objectReference: {fileID: 0} - target: {fileID: 4405084071630950, guid: 6516179ff7fd01b4596058831bd3ded6, type: 3} propertyPath: m_LocalPosition.z @@ -80353,15 +80639,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4405084071630950, guid: 6516179ff7fd01b4596058831bd3ded6, type: 3} propertyPath: m_LocalRotation.x - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4405084071630950, guid: 6516179ff7fd01b4596058831bd3ded6, type: 3} propertyPath: m_LocalRotation.y - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4405084071630950, guid: 6516179ff7fd01b4596058831bd3ded6, type: 3} propertyPath: m_LocalRotation.z - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4405084071630950, guid: 6516179ff7fd01b4596058831bd3ded6, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -80380,6 +80666,11 @@ PrefabInstance: m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 6516179ff7fd01b4596058831bd3ded6, type: 3} +--- !u!4 &1783237885 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4405084071630950, guid: 6516179ff7fd01b4596058831bd3ded6, type: 3} + m_PrefabInstance: {fileID: 1783237884} + m_PrefabAsset: {fileID: 0} --- !u!1 &1783788994 GameObject: m_ObjectHideFlags: 0 @@ -81901,7 +82192,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 0} + m_TransformParent: {fileID: 339150430} m_Modifications: - target: {fileID: 1142935444178820, guid: daf03c48ec6122d4c86523272dd1ca1e, type: 3} propertyPath: m_Name @@ -81913,11 +82204,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4232078423271858, guid: daf03c48ec6122d4c86523272dd1ca1e, type: 3} propertyPath: m_LocalPosition.x - value: 3.767722 + value: -341.23227 objectReference: {fileID: 0} - target: {fileID: 4232078423271858, guid: daf03c48ec6122d4c86523272dd1ca1e, type: 3} propertyPath: m_LocalPosition.y - value: 0.14902201 + value: -193.85098 objectReference: {fileID: 0} - target: {fileID: 4232078423271858, guid: daf03c48ec6122d4c86523272dd1ca1e, type: 3} propertyPath: m_LocalPosition.z @@ -81956,6 +82247,11 @@ PrefabInstance: m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: daf03c48ec6122d4c86523272dd1ca1e, type: 3} +--- !u!4 &1806668282 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4232078423271858, guid: daf03c48ec6122d4c86523272dd1ca1e, type: 3} + m_PrefabInstance: {fileID: 1806668281} + m_PrefabAsset: {fileID: 0} --- !u!1 &1807468291 GameObject: m_ObjectHideFlags: 0 @@ -83004,7 +83300,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 0} + m_TransformParent: {fileID: 339150430} m_Modifications: - target: {fileID: 1231841904843030, guid: 78c43755894ccbb46b928e26cef38761, type: 3} propertyPath: m_Name @@ -83016,11 +83312,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4273967823793180, guid: 78c43755894ccbb46b928e26cef38761, type: 3} propertyPath: m_LocalPosition.x - value: 22.95731 + value: -322.0427 objectReference: {fileID: 0} - target: {fileID: 4273967823793180, guid: 78c43755894ccbb46b928e26cef38761, type: 3} propertyPath: m_LocalPosition.y - value: -0.1 + value: -194.1 objectReference: {fileID: 0} - target: {fileID: 4273967823793180, guid: 78c43755894ccbb46b928e26cef38761, type: 3} propertyPath: m_LocalPosition.z @@ -83032,15 +83328,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4273967823793180, guid: 78c43755894ccbb46b928e26cef38761, type: 3} propertyPath: m_LocalRotation.x - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4273967823793180, guid: 78c43755894ccbb46b928e26cef38761, type: 3} propertyPath: m_LocalRotation.y - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4273967823793180, guid: 78c43755894ccbb46b928e26cef38761, type: 3} propertyPath: m_LocalRotation.z - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4273967823793180, guid: 78c43755894ccbb46b928e26cef38761, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -83063,6 +83359,11 @@ PrefabInstance: m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 78c43755894ccbb46b928e26cef38761, type: 3} +--- !u!4 &1831692161 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4273967823793180, guid: 78c43755894ccbb46b928e26cef38761, type: 3} + m_PrefabInstance: {fileID: 1831692160} + m_PrefabAsset: {fileID: 0} --- !u!1 &1831735432 GameObject: m_ObjectHideFlags: 0 @@ -84234,7 +84535,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 0} + m_TransformParent: {fileID: 339150430} m_Modifications: - target: {fileID: 1907757158894496, guid: 95d0988761bfc144e9325a126719df2b, type: 3} propertyPath: m_Name @@ -84246,11 +84547,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4618384689909468, guid: 95d0988761bfc144e9325a126719df2b, type: 3} propertyPath: m_LocalPosition.x - value: 30.2 + value: -314.8 objectReference: {fileID: 0} - target: {fileID: 4618384689909468, guid: 95d0988761bfc144e9325a126719df2b, type: 3} propertyPath: m_LocalPosition.y - value: 0.000004399106 + value: -194 objectReference: {fileID: 0} - target: {fileID: 4618384689909468, guid: 95d0988761bfc144e9325a126719df2b, type: 3} propertyPath: m_LocalPosition.z @@ -84262,15 +84563,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4618384689909468, guid: 95d0988761bfc144e9325a126719df2b, type: 3} propertyPath: m_LocalRotation.x - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4618384689909468, guid: 95d0988761bfc144e9325a126719df2b, type: 3} propertyPath: m_LocalRotation.y - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4618384689909468, guid: 95d0988761bfc144e9325a126719df2b, type: 3} propertyPath: m_LocalRotation.z - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4618384689909468, guid: 95d0988761bfc144e9325a126719df2b, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -84289,6 +84590,11 @@ PrefabInstance: m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 95d0988761bfc144e9325a126719df2b, type: 3} +--- !u!4 &1854947840 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4618384689909468, guid: 95d0988761bfc144e9325a126719df2b, type: 3} + m_PrefabInstance: {fileID: 1854947839} + m_PrefabAsset: {fileID: 0} --- !u!1 &1855037056 GameObject: m_ObjectHideFlags: 0 @@ -87679,7 +87985,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 0} + m_TransformParent: {fileID: 339150430} m_Modifications: - target: {fileID: 1152254708129884, guid: a1e58d39394582840a3da361ca73eb42, type: 3} propertyPath: m_Name @@ -87691,11 +87997,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4718973128959546, guid: a1e58d39394582840a3da361ca73eb42, type: 3} propertyPath: m_LocalPosition.x - value: -24.26 + value: -369.26 objectReference: {fileID: 0} - target: {fileID: 4718973128959546, guid: a1e58d39394582840a3da361ca73eb42, type: 3} propertyPath: m_LocalPosition.y - value: 0.0000058454025 + value: -194 objectReference: {fileID: 0} - target: {fileID: 4718973128959546, guid: a1e58d39394582840a3da361ca73eb42, type: 3} propertyPath: m_LocalPosition.z @@ -87707,15 +88013,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4718973128959546, guid: a1e58d39394582840a3da361ca73eb42, type: 3} propertyPath: m_LocalRotation.x - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4718973128959546, guid: a1e58d39394582840a3da361ca73eb42, type: 3} propertyPath: m_LocalRotation.y - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4718973128959546, guid: a1e58d39394582840a3da361ca73eb42, type: 3} propertyPath: m_LocalRotation.z - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4718973128959546, guid: a1e58d39394582840a3da361ca73eb42, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -87734,6 +88040,11 @@ PrefabInstance: m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: a1e58d39394582840a3da361ca73eb42, type: 3} +--- !u!4 &1942378131 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4718973128959546, guid: a1e58d39394582840a3da361ca73eb42, type: 3} + m_PrefabInstance: {fileID: 1942378130} + m_PrefabAsset: {fileID: 0} --- !u!1 &1946174515 GameObject: m_ObjectHideFlags: 0 @@ -89401,7 +89712,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 0} + m_TransformParent: {fileID: 339150430} m_Modifications: - target: {fileID: 1561424320279774, guid: a2d757d95f28c96438144ba63052c201, type: 3} propertyPath: m_Name @@ -89413,11 +89724,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4754420235710000, guid: a2d757d95f28c96438144ba63052c201, type: 3} propertyPath: m_LocalPosition.x - value: -54.3 + value: -399.3 objectReference: {fileID: 0} - target: {fileID: 4754420235710000, guid: a2d757d95f28c96438144ba63052c201, type: 3} propertyPath: m_LocalPosition.y - value: 8.498119 + value: -185.50188 objectReference: {fileID: 0} - target: {fileID: 4754420235710000, guid: a2d757d95f28c96438144ba63052c201, type: 3} propertyPath: m_LocalPosition.z @@ -89456,6 +89767,11 @@ PrefabInstance: m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: a2d757d95f28c96438144ba63052c201, type: 3} +--- !u!4 &1985664800 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4754420235710000, guid: a2d757d95f28c96438144ba63052c201, type: 3} + m_PrefabInstance: {fileID: 1985664799} + m_PrefabAsset: {fileID: 0} --- !u!1 &1987510250 GameObject: m_ObjectHideFlags: 0 @@ -91827,7 +92143,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 0} + m_TransformParent: {fileID: 339150430} m_Modifications: - target: {fileID: 1304704628727134, guid: 150fb11921baeea4293a5c8b9ee40f50, type: 3} propertyPath: m_Name @@ -91839,11 +92155,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4150426512488402, guid: 150fb11921baeea4293a5c8b9ee40f50, type: 3} propertyPath: m_LocalPosition.x - value: 17.1 + value: -327.9 objectReference: {fileID: 0} - target: {fileID: 4150426512488402, guid: 150fb11921baeea4293a5c8b9ee40f50, type: 3} propertyPath: m_LocalPosition.y - value: 0.0000056022473 + value: -194 objectReference: {fileID: 0} - target: {fileID: 4150426512488402, guid: 150fb11921baeea4293a5c8b9ee40f50, type: 3} propertyPath: m_LocalPosition.z @@ -91855,15 +92171,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4150426512488402, guid: 150fb11921baeea4293a5c8b9ee40f50, type: 3} propertyPath: m_LocalRotation.x - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4150426512488402, guid: 150fb11921baeea4293a5c8b9ee40f50, type: 3} propertyPath: m_LocalRotation.y - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4150426512488402, guid: 150fb11921baeea4293a5c8b9ee40f50, type: 3} propertyPath: m_LocalRotation.z - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4150426512488402, guid: 150fb11921baeea4293a5c8b9ee40f50, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -91882,6 +92198,11 @@ PrefabInstance: m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 150fb11921baeea4293a5c8b9ee40f50, type: 3} +--- !u!4 &2037795277 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4150426512488402, guid: 150fb11921baeea4293a5c8b9ee40f50, type: 3} + m_PrefabInstance: {fileID: 2037795276} + m_PrefabAsset: {fileID: 0} --- !u!1 &2040725305 GameObject: m_ObjectHideFlags: 0 @@ -94215,7 +94536,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 0} + m_TransformParent: {fileID: 339150430} m_Modifications: - target: {fileID: 1957143509974454, guid: c5e04634c922db942b532a74b4af48f5, type: 3} propertyPath: m_Name @@ -94227,11 +94548,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4196802205486226, guid: c5e04634c922db942b532a74b4af48f5, type: 3} propertyPath: m_LocalPosition.x - value: 16.134232 + value: -328.86578 objectReference: {fileID: 0} - target: {fileID: 4196802205486226, guid: c5e04634c922db942b532a74b4af48f5, type: 3} propertyPath: m_LocalPosition.y - value: 0.12500814 + value: -193.87498 objectReference: {fileID: 0} - target: {fileID: 4196802205486226, guid: c5e04634c922db942b532a74b4af48f5, type: 3} propertyPath: m_LocalPosition.z @@ -94243,15 +94564,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4196802205486226, guid: c5e04634c922db942b532a74b4af48f5, type: 3} propertyPath: m_LocalRotation.x - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4196802205486226, guid: c5e04634c922db942b532a74b4af48f5, type: 3} propertyPath: m_LocalRotation.y - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4196802205486226, guid: c5e04634c922db942b532a74b4af48f5, type: 3} propertyPath: m_LocalRotation.z - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 4196802205486226, guid: c5e04634c922db942b532a74b4af48f5, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -94270,6 +94591,11 @@ PrefabInstance: m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: c5e04634c922db942b532a74b4af48f5, type: 3} +--- !u!4 &2087193745 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4196802205486226, guid: c5e04634c922db942b532a74b4af48f5, type: 3} + m_PrefabInstance: {fileID: 2087193744} + m_PrefabAsset: {fileID: 0} --- !u!1 &2090260073 GameObject: m_ObjectHideFlags: 0 @@ -97441,44 +97767,377 @@ Transform: - {fileID: 2121616843} m_Father: {fileID: 1992407703} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &884023635169522132 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2211059933243502110} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!33 &1316469422247978651 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1468782860139590995} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1468782860139590995 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8465656371071857833} + - component: {fileID: 1316469422247978651} + - component: {fileID: 4068333950721657836} + m_Layer: 0 + m_Name: AlarmTrap_Ghost + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!23 &1999899777701324699 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2211059933243502110} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 594ea882c5a793440b60ff72d896021e, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_MaskInteraction: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &2040776913967103295 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2625115489622757730} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2211059933243502110 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6553118848109228562} + - component: {fileID: 884023635169522132} + - component: {fileID: 1999899777701324699} + m_Layer: 0 + m_Name: FlashbangTrap_Ghost + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2282665197965438060 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5817605972358360428} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 19.6542, y: -4.20374, z: -12.26623} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &2625115489622757730 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8174062643918159000} + - component: {fileID: 2040776913967103295} + - component: {fileID: 8331755413814112619} + m_Layer: 0 + m_Name: PoisonGasTrap_Ghost + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!23 &3244998838369177599 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5817605972358360428} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 0ccb808f1633be04d8b023ad58944b6e, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_MaskInteraction: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!23 &4068333950721657836 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1468782860139590995} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 9875a245ac49007498213638a307faa1, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_MaskInteraction: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &5817605972358360428 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2282665197965438060} + - component: {fileID: 8435644621322277547} + - component: {fileID: 3244998838369177599} + m_Layer: 0 + m_Name: BearTrap_Ghost + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &6553118848109228562 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2211059933243502110} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 19.6542, y: -4.20374, z: -8.82} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &8174062643918159000 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2625115489622757730} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 16.15, y: -4.20374, z: -9.84} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &8331755413814112619 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2625115489622757730} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: e0f11b1a7337400468c12894fc7c4cec, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_MaskInteraction: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &8435644621322277547 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5817605972358360428} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &8465656371071857833 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1468782860139590995} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 18.083, y: -4.20374, z: -12.26623} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1660057539 &9223372036854775807 SceneRoots: m_ObjectHideFlags: 0 m_Roots: - {fileID: 1389689461} - {fileID: 1631681880} - - {fileID: 777866853} + - {fileID: 339150430} - {fileID: 24237236} - - {fileID: 560684214} - - {fileID: 1283259898} - - {fileID: 1003140188} - - {fileID: 1806668281} - - {fileID: 2087193744} - - {fileID: 924519318} - - {fileID: 844959473} - - {fileID: 298867543} - - {fileID: 1533552317} - - {fileID: 952492726} - - {fileID: 2037795276} - - {fileID: 1854947839} - - {fileID: 1411841310} - - {fileID: 1942378130} - - {fileID: 163723983} - - {fileID: 1223035926} - - {fileID: 1048408966} - - {fileID: 197914484} - - {fileID: 500689751} - - {fileID: 971213739} - - {fileID: 1115569503} - - {fileID: 1270873266} - - {fileID: 1339869287} - - {fileID: 1594876355} - - {fileID: 837019366} - - {fileID: 1653118045} - - {fileID: 1112162596} - - {fileID: 471749530} - - {fileID: 436811324} - - {fileID: 1985664799} - - {fileID: 1137949494} - - {fileID: 1831692160} - - {fileID: 1783237884} + - {fileID: 101623195} + - {fileID: 777866853} + - {fileID: 2282665197965438060} + - {fileID: 8174062643918159000} + - {fileID: 6553118848109228562} + - {fileID: 8465656371071857833} diff --git a/Assets/Scripts/Trap/AlarmTrap.cs b/Assets/Scripts/Trap/AlarmTrap.cs new file mode 100644 index 00000000..2b6e81a2 --- /dev/null +++ b/Assets/Scripts/Trap/AlarmTrap.cs @@ -0,0 +1,46 @@ +using System.Collections; +using Fusion; +using UnityEngine; + +public class AlarmTrap : TrapBase +{ + [Header("Alarm Visual Prefab")] + [SerializeField] private GameObject pingIndicatorPrefab; // Prefab representing the warning icon visible through walls + + protected override void OnTriggered(GameObject victim) + { + // Server: Notify the Trapper who placed this trap + if (Owner != PlayerRef.None) + { + RPC_NotifyAlarmPing(Owner, victim.transform.position, trapData.EffectDuration); + } + + // Play alarm loop sound or VFX for a duration, then despawn + StartCoroutine(AlarmDurationRoutine()); + } + + [Rpc(RpcSources.StateAuthority, RpcTargets.InputAuthority)] + private void RPC_NotifyAlarmPing([RpcTarget] PlayerRef targetPlayer, Vector3 position, float duration) + { + Debug.Log($"[Client] Trapper notified! Seeker tripped alarm at position: {position}"); + + // Instantiate the warning indicator at the Seeker's position + if (pingIndicatorPrefab != null) + { + GameObject indicator = Instantiate(pingIndicatorPrefab, position + Vector3.up * 1.5f, Quaternion.identity); + Destroy(indicator, duration); + } + else + { + // Fallback: log warning or use debug line draw + Debug.DrawLine(position, position + Vector3.up * 5f, Color.red, duration); + } + } + + private IEnumerator AlarmDurationRoutine() + { + // Stay active to play audio alarm for a bit + yield return new WaitForSeconds(trapData.EffectDuration); + DespawnTrap(); + } +} diff --git a/Assets/Scripts/Trap/AlarmTrap.cs.meta b/Assets/Scripts/Trap/AlarmTrap.cs.meta new file mode 100644 index 00000000..0aa542a4 --- /dev/null +++ b/Assets/Scripts/Trap/AlarmTrap.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: d3677b0b15c4801418e111e571f9ffdf \ No newline at end of file diff --git a/Assets/Scripts/Trap/BearTrap.cs b/Assets/Scripts/Trap/BearTrap.cs new file mode 100644 index 00000000..6c03bbe5 --- /dev/null +++ b/Assets/Scripts/Trap/BearTrap.cs @@ -0,0 +1,81 @@ +using System.Collections; +using Fusion; +using UnityEngine; +using Opsive.UltimateCharacterController.Traits; +using Opsive.UltimateCharacterController.Character; +using Opsive.UltimateCharacterController.Input; + +public class BearTrap : TrapBase +{ + protected override void OnTriggered(GameObject victim) + { + // 1. Server-side: Apply Damage to Opsive Health + ApplyDamage(victim); + + // 2. Server-side: Send RPC to victim client to stun them + var netObj = victim.GetComponent(); + if (netObj != null) + { + // Send RPC targeted to the victim client using targetPlayer + RPC_ApplyStun(netObj.InputAuthority, netObj.Id, trapData.EffectDuration); + } + + // 3. Despawn the trap after a short delay (e.g. 2 seconds for animation/sfx to play) + StartCoroutine(DespawnAfterDelay(2f)); + } + + private void ApplyDamage(GameObject victim) + { + var health = victim.GetComponent(); + if (health != null && health.IsAlive()) + { + // Apply damage using Opsive UCC Health system + health.Damage(trapData.Damage, transform.position, Vector3.zero, 0); + Debug.Log($"[Server] BearTrap applied {trapData.Damage} damage to {victim.name}"); + } + } + + [Rpc(RpcSources.StateAuthority, RpcTargets.InputAuthority)] + private void RPC_ApplyStun([RpcTarget] PlayerRef targetPlayer, NetworkId victimId, float duration) + { + // Find the victim GameObject on the client using NetworkId + var victimNetObj = Runner.FindObject(victimId); + if (victimNetObj != null) + { + StartCoroutine(StunRoutine(victimNetObj.gameObject, duration)); + } + } + + private IEnumerator StunRoutine(GameObject target, float duration) + { + Debug.Log($"[Client] Applying root/stun to {target.name} for {duration} seconds"); + + // Disable UCC inputs and locomotion handling to freeze the player + var locomotionHandler = target.GetComponent(); + var playerInput = target.GetComponent(); + var locomotion = target.GetComponent(); + + if (locomotionHandler != null) locomotionHandler.enabled = false; + if (playerInput != null) playerInput.enabled = false; + + // Stop any current velocity + if (locomotion != null) + { + locomotion.ResetRotationPosition(); + } + + yield return new WaitForSeconds(duration); + + // Re-enable UCC inputs and locomotion handling + if (locomotionHandler != null) locomotionHandler.enabled = true; + if (playerInput != null) playerInput.enabled = true; + + Debug.Log($"[Client] Root/stun ended for {target.name}"); + } + + private IEnumerator DespawnAfterDelay(float delay) + { + yield return new WaitForSeconds(delay); + DespawnTrap(); + } +} diff --git a/Assets/Scripts/Trap/BearTrap.cs.meta b/Assets/Scripts/Trap/BearTrap.cs.meta new file mode 100644 index 00000000..9499624f --- /dev/null +++ b/Assets/Scripts/Trap/BearTrap.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: d43e058dc396f994281cb98fdc320766 \ No newline at end of file diff --git a/Assets/Scripts/Trap/FlashbangScreenOverlay.cs b/Assets/Scripts/Trap/FlashbangScreenOverlay.cs new file mode 100644 index 00000000..10a90904 --- /dev/null +++ b/Assets/Scripts/Trap/FlashbangScreenOverlay.cs @@ -0,0 +1,67 @@ +using UnityEngine; +using UnityEngine.UI; + +public class FlashbangScreenOverlay : MonoBehaviour +{ + [SerializeField] private Image flashImage; + + private float currentIntensity = 0f; + private float fadeDuration = 3f; + private float elapsedTime = 0f; + private bool isFlashing = false; + + void Start() + { + if (flashImage == null) + { + flashImage = GetComponent(); + } + + if (flashImage != null) + { + Color c = Color.white; + c.a = 0f; + flashImage.color = c; + flashImage.enabled = false; + } + } + + void Update() + { + if (!isFlashing || flashImage == null) return; + + elapsedTime += Time.deltaTime; + float progress = elapsedTime / fadeDuration; + + if (progress >= 1f) + { + isFlashing = false; + Color c = Color.white; + c.a = 0f; + flashImage.color = c; + flashImage.enabled = false; + } + else + { + // Linear fade out for the white flashbang overlay + Color c = Color.white; + c.a = Mathf.Lerp(currentIntensity, 0f, progress); + flashImage.color = c; + } + } + + public void Flash(float duration, float intensity) + { + if (flashImage == null) return; + + flashImage.enabled = true; + isFlashing = true; + elapsedTime = 0f; + fadeDuration = duration; + currentIntensity = intensity; + + Color c = Color.white; + c.a = intensity; + flashImage.color = c; + } +} diff --git a/Assets/Scripts/Trap/FlashbangScreenOverlay.cs.meta b/Assets/Scripts/Trap/FlashbangScreenOverlay.cs.meta new file mode 100644 index 00000000..279fa97e --- /dev/null +++ b/Assets/Scripts/Trap/FlashbangScreenOverlay.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 1b76c3d733c2a8a40ad59d2652551c45 \ No newline at end of file diff --git a/Assets/Scripts/Trap/FlashbangTrap.cs b/Assets/Scripts/Trap/FlashbangTrap.cs new file mode 100644 index 00000000..8bd22e81 --- /dev/null +++ b/Assets/Scripts/Trap/FlashbangTrap.cs @@ -0,0 +1,56 @@ +using System.Collections; +using Fusion; +using UnityEngine; + +public class FlashbangTrap : TrapBase +{ + protected override void OnTriggered(GameObject victim) + { + float radius = trapData.EffectRadius; + float duration = trapData.EffectDuration; + + Debug.Log($"[Server] Flashbang Trap triggered at {transform.position}. Radius: {radius}m"); + + // Blind all Seekers in the explosion radius + Collider[] overlaps = Physics.OverlapSphere(transform.position, radius, LayerMask.GetMask("Player")); + foreach (var col in overlaps) + { + if (IsTargetValid(col.gameObject)) + { + var netObj = col.gameObject.GetComponent(); + if (netObj != null) + { + // Calculate visual falloff based on distance + float distance = Vector3.Distance(transform.position, col.transform.position); + float intensity = Mathf.Clamp01(1f - (distance / radius)); + + RPC_ApplyFlashbang(netObj.InputAuthority, netObj.Id, duration, intensity); + } + } + } + + // Wait for SFX/VFX to play, then despawn + StartCoroutine(DespawnAfterDelay(2f)); + } + + [Rpc(RpcSources.StateAuthority, RpcTargets.InputAuthority)] + private void RPC_ApplyFlashbang([RpcTarget] PlayerRef targetPlayer, NetworkId victimId, float duration, float intensity) + { + // Resolve the victim GameObject using NetworkId on the client + var victimNetObj = Runner.FindObject(victimId); + if (victimNetObj != null) + { + var overlay = victimNetObj.GetComponentInChildren(); + if (overlay != null) + { + overlay.Flash(duration, intensity); + } + } + } + + private IEnumerator DespawnAfterDelay(float delay) + { + yield return new WaitForSeconds(delay); + DespawnTrap(); + } +} diff --git a/Assets/Scripts/Trap/FlashbangTrap.cs.meta b/Assets/Scripts/Trap/FlashbangTrap.cs.meta new file mode 100644 index 00000000..c40f6ea9 --- /dev/null +++ b/Assets/Scripts/Trap/FlashbangTrap.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: aaed554f0d45575499a9984c3ea151b8 \ No newline at end of file diff --git a/Assets/Scripts/Trap/PoisonGasTrap.cs b/Assets/Scripts/Trap/PoisonGasTrap.cs new file mode 100644 index 00000000..bbb2c67d --- /dev/null +++ b/Assets/Scripts/Trap/PoisonGasTrap.cs @@ -0,0 +1,124 @@ +using System.Collections; +using System.Collections.Generic; +using Fusion; +using UnityEngine; +using Opsive.UltimateCharacterController.Traits; + +public class PoisonGasTrap : TrapBase +{ + private List affectedPlayers = new List(); + + protected override void OnTriggered(GameObject victim) + { + // Start the server-side poison gas zone routine + StartCoroutine(GasZoneRoutine()); + } + + private IEnumerator GasZoneRoutine() + { + float elapsed = 0f; + float tickInterval = 1.0f; // Deal damage every 1 second + float duration = trapData.EffectDuration; + float radius = trapData.EffectRadius; + float damagePerTick = trapData.Damage; // Sát thương mỗi tick + + Debug.Log($"[Server] Poison Gas Trap activated. Duration: {duration}s, Radius: {radius}m"); + + while (elapsed < duration) + { + // Find all potential targets in radius + Collider[] overlaps = Physics.OverlapSphere(transform.position, radius, LayerMask.GetMask("Player")); + List currentTicks = new List(); + + foreach (var col in overlaps) + { + if (IsTargetValid(col.gameObject)) + { + currentTicks.Add(col.gameObject); + + // Apply damage + var health = col.gameObject.GetComponent(); + if (health != null && health.IsAlive()) + { + health.Damage(damagePerTick, transform.position, Vector3.zero, 0); + Debug.Log($"[Server] Poison Gas applied {damagePerTick} damage to {col.gameObject.name}"); + } + + // If player is newly entered the gas, turn on their UI overlay + if (!affectedPlayers.Contains(col.gameObject)) + { + affectedPlayers.Add(col.gameObject); + var netObj = col.gameObject.GetComponent(); + if (netObj != null) + { + RPC_TogglePoisonOverlay(netObj.InputAuthority, netObj.Id, true); + } + } + } + } + + // If player left the gas area, turn off their UI overlay + for (int i = affectedPlayers.Count - 1; i >= 0; --i) + { + var p = affectedPlayers[i]; + if (p == null || !currentTicks.Contains(p)) + { + if (p != null) + { + var netObj = p.GetComponent(); + if (netObj != null) + { + RPC_TogglePoisonOverlay(netObj.InputAuthority, netObj.Id, false); + } + } + affectedPlayers.RemoveAt(i); + } + } + + yield return new WaitForSeconds(tickInterval); + elapsed += tickInterval; + } + + // Clean up: turn off overlay for any remaining players in zone + foreach (var p in affectedPlayers) + { + if (p != null) + { + var netObj = p.GetComponent(); + if (netObj != null) + { + RPC_TogglePoisonOverlay(netObj.InputAuthority, netObj.Id, false); + } + } + } + affectedPlayers.Clear(); + + // Despawn the trap + DespawnTrap(); + } + + [Rpc(RpcSources.StateAuthority, RpcTargets.InputAuthority)] + private void RPC_TogglePoisonOverlay([RpcTarget] PlayerRef targetPlayer, NetworkId victimId, bool show) + { + // Resolve the victim GameObject using NetworkId on the client + var victimNetObj = Runner.FindObject(victimId); + if (victimNetObj != null) + { + var overlay = victimNetObj.GetComponentInChildren(); + if (overlay != null) + { + overlay.SetOverlayActive(show); + } + } + } + + // Draw the gas radius in editor for debugging + private void OnDrawGizmosSelected() + { + if (trapData != null) + { + Gizmos.color = new Color(0, 1, 0, 0.3f); + Gizmos.DrawSphere(transform.position, trapData.EffectRadius); + } + } +} diff --git a/Assets/Scripts/Trap/PoisonGasTrap.cs.meta b/Assets/Scripts/Trap/PoisonGasTrap.cs.meta new file mode 100644 index 00000000..c517d412 --- /dev/null +++ b/Assets/Scripts/Trap/PoisonGasTrap.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 22d901fce76303a4a9039ba6ac32e7f6 \ No newline at end of file diff --git a/Assets/Scripts/Trap/PoisonScreenOverlay.cs b/Assets/Scripts/Trap/PoisonScreenOverlay.cs new file mode 100644 index 00000000..27bfae1b --- /dev/null +++ b/Assets/Scripts/Trap/PoisonScreenOverlay.cs @@ -0,0 +1,47 @@ +using UnityEngine; +using UnityEngine.UI; + +public class PoisonScreenOverlay : MonoBehaviour +{ + [SerializeField] private Image overlayImage; + [SerializeField] private float fadeSpeed = 2f; + + private float targetAlpha = 0f; + private float currentAlpha = 0f; + + void Start() + { + if (overlayImage == null) + { + overlayImage = GetComponent(); + } + + if (overlayImage != null) + { + Color c = overlayImage.color; + c.a = 0f; + overlayImage.color = c; + overlayImage.enabled = false; + } + } + + void Update() + { + if (overlayImage == null) return; + + if (Mathf.Abs(currentAlpha - targetAlpha) > 0.01f) + { + currentAlpha = Mathf.MoveTowards(currentAlpha, targetAlpha, fadeSpeed * Time.deltaTime); + Color c = overlayImage.color; + c.a = currentAlpha; + overlayImage.color = c; + + overlayImage.enabled = currentAlpha > 0.01f; + } + } + + public void SetOverlayActive(bool active) + { + targetAlpha = active ? 0.6f : 0f; // maximum 60% opacity green overlay + } +} diff --git a/Assets/Scripts/Trap/PoisonScreenOverlay.cs.meta b/Assets/Scripts/Trap/PoisonScreenOverlay.cs.meta new file mode 100644 index 00000000..2484df53 --- /dev/null +++ b/Assets/Scripts/Trap/PoisonScreenOverlay.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 8157e011a6f0cfe42be054813cfc0b99 \ No newline at end of file diff --git a/Assets/Scripts/Trap/Trap Plan Detail.md b/Assets/Scripts/Trap/Trap Plan Detail.md new file mode 100644 index 00000000..811e870a --- /dev/null +++ b/Assets/Scripts/Trap/Trap Plan Detail.md @@ -0,0 +1,575 @@ +# KẾ HOẠCH TRIỂN KHAI CHI TIẾT: HỆ THỐNG BẪY (TRAP SYSTEM) +**Dự án:** BABA_YAGA +**Công nghệ:** Unity, Photon Fusion (Shared/Host mode), Opsive Ultimate Character Controller (UCC) +**Tác giả:** Antigravity AI Pair Programmer +**Ngày lập:** 30/06/2026 + +--- + +## 📌 1. KIẾN TRÚC TỔNG QUAN (ARCHITECTURE OVERVIEW) + +Hệ thống bẫy được thiết kế theo mô hình **Server-Authoritative (Host-authoritative)** kết hợp với **Client-side Prediction/Visualization**. Điều này đảm bảo tính bảo mật (kẻ địch không thể cheat vị trí bẫy hoặc tự ý gỡ bẫy) và trải nghiệm mượt mà của người chơi. + +```mermaid +graph TD + Trapper[Trapper Client] -->|1. Di chuyển & Ngắm| Ghost[Ghost Trap Preview - Local] + Trapper -->|2. Click Đặt Bẫy| RPC[RPC_RequestPlaceTrap] + RPC -->|3. Nhận yêu cầu| Host[Host / Server] + Host -->|4. Kiểm tra hợp lệ| Spawn[Runner.Spawn TrapPrefab] + Spawn -->|5. Đồng bộ hóa| AllClients[All Clients Spawned] + AllClients -->|Trapper| ShowFull[Hiển thị rõ + Outline] + AllClients -->|Seeker| HideStealth[Ẩn bẫy/Dùng Stealth Shader] +``` + +### Các lớp đối tượng cốt lõi (Core Classes) + +| Tên File | Loại | Vai trò chính | +| :--- | :--- | :--- | +| `TrapBase.cs` | `NetworkBehaviour` | Lớp cha trừu tượng quản lý vòng đời, trạng thái mạng, va chạm và kích hoạt bẫy. | +| `TrapPlacementController.cs` | `MonoBehaviour` | Xử lý logic hiển thị bóng mờ (Ghost Mesh) và gửi RPC đặt bẫy từ Trapper. | +| `TrapVisibilityHandler.cs` | `MonoBehaviour` | Xử lý việc ẩn/hiện bẫy đối với từng Role (`Seeker` ẩn, `Trapper` hiện). | +| `TrapDataSO.cs` | `ScriptableObject` | Lưu trữ cấu hình bẫy (Thời gian hồi, sát thương, tầm quét, prefab, icon UI). | + +--- + +## 🛠️ 2. CHI TIẾT CÁC GIAI ĐOẠN TRIỂN KHAI + +--- + +### GIAI ĐOẠN 1: XÂY DỰNG CORE ARCHITECTURE & MẠNG (PHOTON FUSION) +*Mục tiêu: Đảm bảo bẫy được sinh ra đồng bộ trên tất cả các Client và có cơ chế quản lý trạng thái mạng.* + +#### 1. Định nghĩa enum trạng thái bẫy (`TrapState`) +```csharp +public enum TrapState +{ + Arming, // Đang thiết lập (chờ kích hoạt để tránh nổ ngay khi đặt) + Armed, // Đã sẵn sàng hoạt động (đang quét kẻ địch) + Triggered, // Đã bị dẫm trúng và đang chạy hiệu ứng + Despawning // Đang bị hủy / dọn dẹp +} +``` + +#### 2. Xây dựng lớp Base `TrapBase.cs` +Lớp này sẽ kế thừa từ `NetworkBehaviour` của Fusion. + +```csharp +using Fusion; +using UnityEngine; + +[RequireComponent(typeof(NetworkObject))] +public abstract class TrapBase : NetworkBehaviour +{ + [Header("Trap Config")] + [SerializeField] protected TrapDataSO trapData; + + [Networked] public PlayerRef Owner { get; set; } + [Networked, ChangedOnFields(nameof(OnStateChanged))] public TrapState State { get; set; } + [Networked] protected TickTimer ArmingTimer { get; set; } + [Networked] protected TickTimer LifetimeTimer { get; set; } + + protected Collider trapCollider; + protected Animator animator; + protected AudioSource audioSource; + + public override void Spawned() + { + trapCollider = GetComponent(); + animator = GetComponentInChildren(); + audioSource = GetComponent(); + + if (Object.HasStateAuthority) + { + State = TrapState.Arming; + ArmingTimer = TickTimer.CreateFromSeconds(Runner, trapData.ArmingDelay); + LifetimeTimer = TickTimer.CreateFromSeconds(Runner, trapData.Lifetime); + } + + // Tự động cấu hình hiển thị (Tàng hình với Seeker, Hiện với Trapper) + ConfigureVisibility(); + } + + public override void FixedUpdateNetwork() + { + if (!Object.HasStateAuthority) return; + + // Xử lý đếm ngược Arming + if (State == TrapState.Arming && ArmingTimer.Expired(Runner)) + { + State = TrapState.Armed; + } + + // Tự hủy nếu hết hạn tồn tại + if (LifetimeTimer.Expired(Runner)) + { + DespawnTrap(); + } + } + + protected virtual void OnTriggerEnter(Collider other) + { + if (!Object.HasStateAuthority) return; + if (State != TrapState.Armed) return; + + // Kiểm tra xem đối tượng chạm vào có phải là Seeker không + if (IsTargetValid(other.gameObject)) + { + TriggerTrap(other.gameObject); + } + } + + protected bool IsTargetValid(GameObject target) + { + // Tích hợp kiểm tra Role của đối tượng va chạm (không tự kích hoạt bẫy của chính mình/đồng đội) + var networkInfo = target.GetComponent(); + if (networkInfo != null) + { + // Kiểm tra PlayerData của target + var playerData = target.GetComponent(); + if (playerData != null && playerData.PlayerRole == _Role.Seeker) + { + return true; + } + } + return false; + } + + protected void TriggerTrap(GameObject victim) + { + State = TrapState.Triggered; + OnTriggered(victim); + } + + // Các hàm ảo để các bẫy cụ thể ghi đè (Override) + protected abstract void OnTriggered(GameObject victim); + + protected static void OnStateChanged(Changed changed) + { + changed.Behaviour.HandleStateVisuals(); + } + + protected virtual void HandleStateVisuals() + { + switch (State) + { + case TrapState.Arming: + // Play đặt bẫy SFX/VFX + break; + case TrapState.Armed: + // Bật đèn tín hiệu/nháy nhẹ (chỉ Trapper thấy rõ) + break; + case TrapState.Triggered: + if (animator != null) animator.SetTrigger("Trigger"); + if (audioSource != null && trapData.TriggerSFX != null) audioSource.PlayOneShot(trapData.TriggerSFX); + // Sinh VFX vụ nổ/sập bẫy + break; + } + } + + protected void DespawnTrap() + { + State = TrapState.Despawning; + Runner.Despawn(Object); + } + + protected abstract void ConfigureVisibility(); +} +``` + +--- + +### GIAI ĐOẠN 2: HỆ THỐNG ĐẶT BẪY (PLACEMENT MECHANICS) +*Mục tiêu: Người chơi Trapper có thể rê chuột chọn vị trí (Ghost Preview) và click để Spawn bẫy qua RPC mạng.* + +#### 1. ScriptableObject cấu hình bẫy (`TrapDataSO.cs`) +```csharp +using UnityEngine; + +[CreateAssetMenu(fileName = "NewTrapData", menuName = "BabaYaga/TrapData")] +public class TrapDataSO : ScriptableObject +{ + public string TrapName; + public TrapType Type; + public NetworkPrefabRef TrapPrefab; + public GameObject GhostPrefab; // Mô hình mờ để xem trước + public float Cooldown = 5f; + public float ArmingDelay = 1.5f; + public float Lifetime = 60f; + public float PlacementMaxDistance = 5f; + + [Header("Visuals & Audio")] + public Sprite Icon; + public AudioClip PlaceSFX; + public AudioClip TriggerSFX; + public GameObject TriggerVFX; +} +``` + +#### 2. Xử lý đặt bẫy `TrapPlacementController.cs` +Script này gắn trên nhân vật người chơi (chỉ kích hoạt với `Trapper` có Input Authority). + +```csharp +using Fusion; +using UnityEngine; + +public class TrapPlacementController : NetworkBehaviour +{ + [SerializeField] private TrapDataSO[] availableTraps; + [SerializeField] private LayerMask placementLayerMask; + + private int selectedTrapIndex = 0; + private GameObject currentGhostInstance; + private bool isPreviewing = false; + private float lastPlaceTime; + + void Update() + { + if (!Object.HasInputAuthority) return; + + // Nhấn nút để kích hoạt Preview (ví dụ: Phím Q hoặc số 1,2,3) + if (Input.GetKeyDown(KeyCode.Q)) + { + TogglePreview(); + } + + if (isPreviewing) + { + UpdateGhostPosition(); + + if (Input.GetMouseButtonDown(0)) + { + TryPlaceTrap(); + } + } + } + + void TogglePreview() + { + isPreviewing = !isPreviewing; + if (isPreviewing) + { + if (currentGhostInstance == null) + { + currentGhostInstance = Instantiate(availableTraps[selectedTrapIndex].GhostPrefab); + } + } + else + { + if (currentGhostInstance != null) + { + Destroy(currentGhostInstance); + } + } + } + + void UpdateGhostPosition() + { + Ray ray = Camera.main.ViewportPointToRay(new Vector3(0.5f, 0.5f, 0)); // Raycast từ tâm màn hình + if (Physics.Raycast(ray, out RaycastHit hit, availableTraps[selectedTrapIndex].PlacementMaxDistance, placementLayerMask)) + { + currentGhostInstance.SetActive(true); + currentGhostInstance.transform.position = hit.point; + + // Xoay bẫy theo mặt phẳng tiếp xúc (Normal của bề mặt) + currentGhostInstance.transform.rotation = Quaternion.FromToRotation(Vector3.up, hit.normal); + + // Kiểm tra xem vị trí có hợp lệ không (ví dụ: không đè tường, không quá dốc) + bool isValid = ValidatePlacement(hit.point); + UpdateGhostVisuals(isValid); + } + else + { + currentGhostInstance.SetActive(false); // Ẩn nếu chỉ vào khoảng không + } + } + + bool ValidatePlacement(Vector3 position) + { + // Check overlap sphere để đảm bảo không đè lên bẫy khác hoặc tường + Collider[] colliders = Physics.OverlapSphere(position, 0.5f, LayerMask.GetMask("Walls", "Trap")); + return colliders.Length == 0; + } + + void UpdateGhostVisuals(bool isValid) + { + // Thay đổi màu Material của Ghost (Xanh = Đặt được, Đỏ = Không đặt được) + Renderer[] renderers = currentGhostInstance.GetComponentsInChildren(); + Color color = isValid ? new Color(0f, 1f, 0f, 0.4f) : new Color(1f, 0f, 0f, 0.4f); + foreach (var r in renderers) + { + r.material.color = color; + } + } + + void TryPlaceTrap() + { + if (Time.time - lastPlaceTime < availableTraps[selectedTrapIndex].Cooldown) + { + Debug.Log("Trap is on Cooldown!"); + return; + } + + Ray ray = Camera.main.ViewportPointToRay(new Vector3(0.5f, 0.5f, 0)); + if (Physics.Raycast(ray, out RaycastHit hit, availableTraps[selectedTrapIndex].PlacementMaxDistance, placementLayerMask)) + { + if (ValidatePlacement(hit.point)) + { + // Gửi RPC yêu cầu Server spawn bẫy thực sự + RPC_RequestPlaceTrap(hit.point, Quaternion.FromToRotation(Vector3.up, hit.normal), selectedTrapIndex); + lastPlaceTime = Time.time; + TogglePreview(); // Tắt preview sau khi đặt + } + } + } + + [Rpc(RpcSources.InputAuthority, RpcTargets.StateAuthority)] + private void RPC_RequestPlaceTrap(Vector3 position, Quaternion rotation, int trapIndex) + { + if (trapIndex < 0 || trapIndex >= availableTraps.Length) return; + + TrapDataSO data = availableTraps[trapIndex]; + + // Host sinh bẫy trên mạng + NetworkObject spawnedTrap = Runner.Spawn(data.TrapPrefab, position, rotation, Object.InputAuthority); + + // Thiết lập thuộc tính bẫy + TrapBase trapScript = spawnedTrap.GetComponent(); + if (trapScript != null) + { + trapScript.Owner = Object.InputAuthority; + } + } +} +``` + +--- + +### GIAI ĐOẠN 3: CƠ CHẾ TẦM NHÌN & KHÔNG GIAN (STEALTH MECHANICS) +*Mục tiêu: Giữ bẫy tàng hình trước phe Seeker nhưng đồng đội/Trapper vẫn nhìn thấy.* + +#### Giải pháp Kỹ thuật: Layer & Camera Culling + Shader +1. **Thiết lập Layers**: + - Tạo Layer: `TrapperOnly` (Ví dụ Layer 10). + - Tạo Layer: `SeekerOnly` (Ví dụ Layer 11). + - Tạo Layer: `StealthTrap` (Ví dụ Layer 12). +2. **Camera Culling**: + - Camera của `Trapper` sẽ render cả Layer `Default` và `StealthTrap` (để nhìn thấy bẫy của mình). + - Camera của `Seeker` mặc định **sẽ bỏ tích (Cull)** Layer `StealthTrap` trong thuộc tính *Culling Mask*. Điều này giúp bẫy tàng hình tuyệt đối trên màn hình của Seeker mà không cần ẩn GameObject (giúp Collider vẫn hoạt động vật lý). +3. **Cơ chế Reveal (Bị phát hiện)**: + - Khi Seeker ở gần bẫy trong bán kính 3m, hoặc dùng kỹ năng dò quét, script cục bộ trên Seeker sẽ chuyển đổi Layer của bẫy từ `StealthTrap` sang `Default` hoặc bật Shader quét hồng ngoại để làm hiển thị bóng mờ bẫy. + +```csharp +// Trong script TrapBase.cs hoặc script bổ trợ TrapVisibilityHandler.cs: +protected override void ConfigureVisibility() +{ + var localPlayer = Runner.LocalPlayer; + PlayerDataManager pdm = PlayerDataManager.Instance; + + if (pdm != null && pdm.TryGetPlayerMetaData(localPlayer, out var meta)) + { + if (meta.Role == _Role.Trapper) + { + // Trapper nhìn thấy rõ + gameObject.layer = LayerMask.NameToLayer("Default"); + SetTrapAlpha(0.8f); // Hơi trong suốt để nhận biết là bẫy + } + else + { + // Seeker: Đưa vào layer ẩn + gameObject.layer = LayerMask.NameToLayer("StealthTrap"); + } + } +} + +private void SetTrapAlpha(float alpha) +{ + Renderer[] renderers = GetComponentsInChildren(); + foreach (var r in renderers) + { + foreach (var mat in r.materials) + { + // Đảm bảo Shader hỗ trợ chế độ trong suốt (Transparent) + Color col = mat.color; + col.a = alpha; + mat.color = col; + } + } +} +``` + +--- + +### GIAI ĐOẠN 4: LIÊN KẾT VỚI OPSIVE UCC (INTEGRATION WITH OPSIVE UCC) +*Mục tiêu: Bẫy tác động trực tiếp vào các chỉ số Máu (Health) và Khống chế (State/Abilities) của Opsive Character.* + +Opsive UCC có các lớp built-in rất mạnh mẽ để xử lý sát thương và hiệu ứng: + +#### 1. Gây sát thương lên người chơi (Apply Damage) +```csharp +using Opsive.Shared.Inventory; +using Opsive.UltimateCharacterController.Traits; // Namespace chứa Health + +protected void ApplyDamageToUCC(GameObject target, float damageAmount) +{ + Health victimHealth = target.GetComponent(); + if (victimHealth != null && victimHealth.IsAlive()) + { + // Gây sát thương thông qua API của Opsive + victimHealth.Damage(damageAmount, transform.position, Vector3.zero, 0); + } +} +``` + +#### 2. Trói chân / Khống chế di chuyển (Root / Stun Mechanism) +Có 2 cách tích hợp khống chế với UCC: +* **Cách A (Đơn giản):** Can thiệp trực tiếp vào CharacterLocomotion tốc độ di chuyển. +* **Cách B (Khuyên Dùng):** Kích hoạt/Tắt một custom Ability trong UCC (ví dụ: Ability `Stun` hoặc `Frozen` được cấu hình sẵn trong component *UltimateCharacterLocomotion*). + +```csharp +using Opsive.UltimateCharacterController.Character; +using Opsive.UltimateCharacterController.Character.Abilities; + +protected void ApplyStunToUCC(GameObject target, float duration) +{ + UltimateCharacterLocomotion locomotion = target.GetComponent(); + if (locomotion != null) + { + // Tìm ability "Stun" hoặc "Frozen" đã được thiết lập sẵn trong Opsive Editor + Ability stunAbility = locomotion.GetAbility(); // Cần tạo class StunAbility kế thừa từ Ability + if (stunAbility != null) + { + locomotion.TryStartAbility(stunAbility); + + // Lên lịch tắt ability sau duration giây + StartCoroutine(RemoveStunCoroutine(locomotion, stunAbility, duration)); + } + } +} + +private System.Collections.IEnumerator RemoveStunCoroutine(UltimateCharacterLocomotion loco, Ability ability, float delay) +{ + yield return new WaitForSeconds(delay); + if (loco != null && ability.IsActive) + { + loco.TryStopAbility(ability); + } +} +``` + +--- + +### GIAI ĐOẠN 5: HIỆN THỰC HÓA CÁC LOẠI BẪY CỤ THỂ (CONCRETE TRAPS) + +Dưới đây là thiết kế chi tiết cho 4 bẫy quan trọng nhất để bắt đầu: + +#### 1. Bear Trap (Bẫy kẹp sắt) - Sát thương đơn mục tiêu + Trói chân +* **Mô tả:** Khi Seeker chạm phải, kẹp sắt sập lại, gây 30 sát thương và trói chân tại chỗ trong 3 giây. +* **Mã nguồn:** +```csharp +public class BearTrap : TrapBase +{ + [Header("Bear Trap Settings")] + [SerializeField] private float damage = 30f; + [SerializeField] private float stunDuration = 3f; + + protected override void OnTriggered(GameObject victim) + { + // Gây sát thương Opsive Health + ApplyDamageToUCC(victim, damage); + + // Trói chân Opsive Locomotion + ApplyStunToUCC(victim, stunDuration); + + // Đợi kết thúc Animation sập bẫy trước khi biến mất + StartCoroutine(DespawnAfterDelay(2f)); + } + + private System.Collections.IEnumerator DespawnAfterDelay(float delay) + { + yield return new WaitForSeconds(delay); + DespawnTrap(); + } + + protected override void ConfigureVisibility() + { + // Logic tàng hình mặc định + } +} +``` + +#### 2. Gas Poison Trap (Bẫy độc hại) - Sát thương theo thời gian (DoT) + Giảm tầm nhìn +* **Mô tả:** Khi nổ, kích hoạt Particle System khí độc diện rộng (bán kính 4m). Bất kỳ Seeker nào đứng bên trong sẽ chịu 5 sát thương mỗi giây và bị che mờ camera bởi UI khói độc. +* **Mã nguồn:** +```csharp +public class PoisonGasTrap : TrapBase +{ + [SerializeField] private float damagePerSecond = 5f; + [SerializeField] private float gasDuration = 8f; + [SerializeField] private float gasRadius = 4f; + + protected override void OnTriggered(GameObject victim) + { + // Bật Particle System độc (đồng bộ qua State thay đổi hiệu ứng) + // Bắt đầu quét vùng gây sát thương định kỳ trên Server + StartCoroutine(ApplyGasDamageArea()); + } + + private System.Collections.IEnumerator ApplyGasDamageArea() + { + float elapsed = 0f; + while (elapsed < gasDuration) + { + Collider[] targets = Physics.OverlapSphere(transform.position, gasRadius, LayerMask.GetMask("Player")); + foreach (var col in targets) + { + if (IsTargetValid(col.gameObject)) + { + ApplyDamageToUCC(col.gameObject, damagePerSecond); + // Rpc_TriggerPoisonOverlayOnClient(col.gameObject.GetComponent().InputAuthority); + } + } + yield return new WaitForSeconds(1f); + elapsed += 1f; + } + DespawnTrap(); + } +} +``` + +#### 3. Alarm Trap (Bẫy còi báo động) - Tiết lộ vị trí Seeker +* **Mô tả:** Khi chạm vào, không gây sát thương nhưng hú còi cực to và ping vị trí Seeker lên bản đồ nhỏ (Minimap) của Trapper trong 5 giây. + +#### 4. Flashbang Trap (Bẫy mù) - Làm mù màn hình Seeker +* **Mô tả:** Khi dẫm phải sẽ phát nổ chói lóa. Gửi một RPC làm trắng màn hình UI của nạn nhân, giảm âm lượng âm thanh game về 0 và phục hồi dần trong 4 giây. + +--- + +## 📈 3. KẾ HOẠCH BẮT TAY THỰC HIỆN TỪNG BƯỚC (ROADMAP TO ACTION) + +Để bắt tay vào làm ngay một cách khoa học, chúng ta sẽ chia thành các Task nhỏ trong **3 Sprint chính**: + +### 🏃 SPRINT 1: CORE INFRASTRUCTURE (Dự kiến: 2-3 ngày) +1. [ ] **Tạo cấu trúc thư mục**: Dựng sẵn các folder `Trap/Base`, `Trap/Concrete`, `Trap/ScriptableObjects`. +2. [ ] **Tạo file cấu hình**: Viết class `TrapDataSO.cs`. +3. [ ] **Hoàn thiện Core Class**: Viết `TrapBase.cs` xử lý trigger va chạm vật lý và vòng đời Fusion NetworkObject. +4. [ ] **Tạo Prefab kiểm thử**: Tạo 1 khối Cube gắn `NetworkObject`, `Collider` (Is Trigger), `NetworkTransform` và script kế thừa từ `TrapBase`. + +### 🏃 SPRINT 2: PLACEMENT & VISIBILITY (Dự kiến: 3 ngày) +1. [ ] **Hệ thống Ghost Preview**: Viết `TrapPlacementController.cs` để chiếu tia Raycast từ camera và hiển thị mô hình mờ. +2. [ ] **Đồng bộ đặt bẫy**: Viết hàm RPC gửi tọa độ đặt bẫy lên Host để Host sinh bẫy thật. +3. [ ] **Tàng hình & Phát hiện**: Tạo các Layer `StealthTrap` và cấu hình Camera Culling Mask cho Seeker. Viết logic chuyển đổi shader/layer trên client của Trapper. + +### 🏃 SPRINT 3: OPSIVE INTEGRATION & CONCRETE TRAPS (Dự kiến: 3 ngày) +1. [ ] **Kết nối Opsive UCC**: Thực hiện code gây sát thương (Health) và viết custom Ability trói chân (Stun/Freeze). +2. [ ] **Hoàn thiện các bẫy cụ thể**: Viết `BearTrap.cs` (Kẹp sắt) và `PoisonGasTrap.cs` (Bẫy ga độc). +3. [ ] **Kiểm thử Multiplayer**: Build game ra 2 màn hình để test đồng bộ: + - Trapper đặt bẫy -> Có hao tốn Cooldown không? Có sinh bẫy đồng bộ không? + - Seeker đi qua bẫy -> Bẫy có nổ không? Seeker có bị trừ máu và đứng im không? + - Camera của Seeker có nhìn thấy bẫy trước khi nổ không? (Phải tàng hình). + +--- + +## ⚠️ 4. CÁC ĐIỂM CẦN LƯU Ý KHI LẬP TRÌNH (CRITICAL TIPS) +1. **Collider Network**: Hãy đảm bảo bẫy có Collider được cấu hình `Is Trigger = True`. Chỉ có Server mới được thực hiện hàm xử lý sát thương hay khống chế trong `OnTriggerEnter` để chống hack. +2. **Ủy quyền trạng thái (State Authority)**: Mọi biến trạng thái như `TrapState State` hay `TickTimer` đều phải được gắn nhãn `[Networked]`. Khi thay đổi các thuộc tính này trên Server, Fusion sẽ tự động đồng bộ xuống Client và gọi hàm Callback `OnStateChanged` để kích hoạt VFX/SFX cục bộ. +3. **Clean Up**: Luôn kiểm tra việc hủy bẫy (`Runner.Despawn`) để tránh tràn bộ nhớ khi đặt quá nhiều bẫy trong Maze (mê cung). diff --git a/Assets/Scripts/Trap/Trap Plan Detail.md.meta b/Assets/Scripts/Trap/Trap Plan Detail.md.meta new file mode 100644 index 00000000..4eb9d40d --- /dev/null +++ b/Assets/Scripts/Trap/Trap Plan Detail.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: a96b1d780a0a5914b8e7b96b34b18bb9 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Trap/Trap Plan.txt b/Assets/Scripts/Trap/Trap Plan.txt new file mode 100644 index 00000000..002cfef5 --- /dev/null +++ b/Assets/Scripts/Trap/Trap Plan.txt @@ -0,0 +1,113 @@ +Giai đoạn 1: Xây dựng Nền tảng (Core Architecture) +Mục tiêu: Tạo bộ khung cơ bản, xử lý các logic chung nhất mà bất kỳ bẫy nào cũng phải có, đặc biệt là đảm bảo tính đồng bộ trên mạng. + +Create Base Trap System: Tạo một class cha (ví dụ: TrapBase.cs). Tất cả các bẫy sau này sẽ kế thừa từ class này. Class này nên chứa các biến chung như máu của bẫy, thời gian tồn tại, và các hàm ảo (virtual functions) như OnTrigger(), OnDestroy(). + +Add Trap Ownership System: Thêm logic xác định người chơi nào đã đặt bẫy (lưu trữ ID của người chơi). Điều này rất quan trọng để tính điểm hạ gục hoặc tránh việc bẫy gây sát thương lên chính đồng đội. + +Synchronize Traps Online: Khởi tạo các thành phần đồng bộ mạng (như NetworkObject nếu dùng Photon Fusion). Đảm bảo rằng khi một bẫy được sinh ra (spawn), toàn bộ client trong phòng đều nhận biết được sự tồn tại của nó. + +Create Trap Prefabs: Dựng các Prefab cơ bản ban đầu cho bẫy (có gắn Mesh, Collider, và script TrapBase). + +Giai đoạn 2: Hệ thống Đặt Bẫy (Placement & UI) +Mục tiêu: Cho phép người chơi tương tác, đặt bẫy xuống môi trường một cách hợp lệ và hiển thị thông tin lên màn hình. + +Implement Trap Placement: Xử lý logic bắn Raycast từ camera hoặc người chơi để xác định vị trí hợp lệ trên mặt đất (Terrain/Sàn nhà) và Spawn Prefab tại đó. + +Add Trap Placement Limit: Giới hạn số lượng bẫy tối đa mà một người chơi có thể đặt cùng lúc để tối ưu hiệu suất và cân bằng game. + +Add Trap Cooldown: Thêm bộ đếm thời gian (timer) để ngăn người chơi spam bẫy liên tục. + +Create Trap UI Indicator: Cập nhật UI hiển thị icon bẫy, thời gian hồi chiêu (Cooldown), số lượng bẫy còn lại, hoặc hiển thị bóng mờ (ghost mesh) trước khi người chơi click đặt bẫy. + 3. Các bước tiếp theo (Giai đoạn 2-3) + Đăng ký bẫy lên Fusion và gán cho + 3a. Gán TrapPrefab vào TrapDataSO Player + + Mỗi .asset trong Assets/TEST CUA TUAN/TRAP/ cần: Context + 47,412 tokens + - Kéo TrapPrefab tương ứng vào ô TrapPrefab (BearTrapData → BearTrap_Network...) 24% used + - Set GhostPrefab (shadow preview mesh) $0.00 spent + - Set Icon, PlaceSFX, TriggerSFX, TriggerVFX + LSP + 3b. Tạo Layer "StealthTrap" trong Tags & Layers LSPs are disabled + + Vào Edit > Project Settings > Tags and Layers, tạo User Layer (ví dụ Layer 10) tên StealthTrap. Code ConfigureVisibility() trong TrapBase.cs đã dùng layer này để ẩn bẫy với + Seeker. + + 3c. Cấu hình Camera Culling + + - Camera của Seeker: Trong Culling Mask, bỏ tick layer StealthTrap → bẫy sẽ hoàn toàn tàng hình + - Camera của Trapper: Giữ tick layer Default để thấy bẫy + + 3d. Tạo UI Trap Selection & Cooldown + + Thêm Hotbar UI hiển thị: + + - Icon 4 bẫy (đã có sẵn trong TrapDataSO.Icon) + - Cooldown overlay (xám đi khi đang CD) + - Số lượng bẫy còn lại (nếu có limit) + + 3e. Thêm Trap Placement Limit + + Hiện tại TrapPlacementController chưa giới hạn số bẫy. Cần thêm [Networked] int trapsPlaced trong PlayerData và kiểm tra trong TryPlaceTrap(). + ⬖ Getting started ✕ + 3f. Kiểm tra đồng bộ mạng + OpenCode includes free models + Build 2 client, test flow: so you can start immediately. + + - Trapper nhấn Q → ghost preview hiện → Click Left Mouse → RPC gửi lên Host → Runner.Spawn() → cả 2 client thấy trap Connect from 75+ providers to + - Seeker chạy qua → OnTriggerEnter server-side → gọi OnTriggered() → damage/stun/VFX/SFX đồng bộ + +Giai đoạn 3: Logic Kích hoạt & Vòng đời (Trigger & Lifecycle) +Mục tiêu: Xử lý những gì xảy ra khi kẻ địch dẫm phải bẫy và cách bẫy biến mất. + +Add Trap Trigger Detection: Xử lý va chạm (ví dụ: OnTriggerEnter). Phân loại rõ đối tượng chạm vào là ai (kẻ địch, đồng đội hay chính mình) để quyết định kích hoạt. + +Add Trap Animation & Add Trap Sound Effects: Gắn Animator và AudioSource vào Base System. Kích hoạt hiệu ứng hình ảnh/âm thanh khi bẫy nổ hoặc sập xuống. + +Add Trap Interaction Effects: Kích hoạt các Particle System (hiệu ứng hạt) hoặc apply sát thương cơ bản/hiệu ứng vật lý lên người dẫm phải. + +Add Trap Despawn Logic: Logic dọn dẹp bẫy. Hủy GameObject sau khi đã kích hoạt xong, hoặc sau một khoảng thời gian tồn tại nhất định để giải phóng bộ nhớ. + +Giai đoạn 4: Cơ chế Tầm nhìn (Visibility & Counterplay) +Mục tiêu: Tạo chiều sâu chiến thuật cho game bằng cách cho phép giấu bẫy và dò bẫy. + +Add Trap Visibility Logic: Làm cho bẫy tàng hình hoặc mờ đi với phe địch, nhưng vẫn hiển thị rõ với người đặt và đồng đội. Có thể can thiệp qua Layer hoặc thay đổi Shader/Material. + +Add Trap Reveal Mechanic: Chức năng cho phép kẻ địch phát hiện bẫy ẩn (ví dụ: lại gần trong bán kính 3m, hoặc dùng một kỹ năng dò đường đặc biệt). + +Giai đoạn 5: Phát triển các Bẫy Cụ thể (Concrete Trap Types) +Mục tiêu: Kế thừa class TrapBase để tạo ra các loại bẫy với chức năng riêng biệt. Bạn có thể làm nhóm nào trước tùy theo độ ưu tiên của dự án. + +Nhóm Sát thương & Khống chế: + +Create Bear Trap Logic (Trói chân, sát thương đơn mục tiêu) + +Create Spike Trap Logic (Sát thương vật lý diện rộng) + +Create Poison Gas Trap (Sát thương theo thời gian - DoT, giảm tầm nhìn) + +Create Net Trap Logic (Khống chế/Bắt giữ) + +Nhóm Chiến thuật & Thông tin: + +Create Sound Trap Logic (Phát ra âm thanh lớn) + +Create Alarm Trap Logic (Ping lên minimap hoặc báo động cho phe mình) + +Create Flashbang Trap (Làm mù mắt kẻ địch trong thời gian ngắn) + +Create EMP Trap Logic (Vô hiệu hóa kỹ năng/màn hình UI của robot địch) + +Nhóm Đánh lừa (Deception): + +Create Fake Trap Logic (Bẫy giả không có tác dụng, chỉ để hù dọa) + +Create Decoy Trap Logic (Tạo hình nhân/hologram giả mạo) + +Create Fake Exit Trap & Add Exit Lock Trap (Bẫy liên quan đến lối thoát hiểm để dụ địch) + +Giai đoạn 6: Kiểm thử (Testing & Polish) +Test Multiplayer Trap Sync: Build game ra ít nhất 2 client khác nhau. Kiểm tra xem bẫy của Client A đặt xuống thì Client B có nhìn thấy đúng trạng thái tàng hình không, khi dẫm vào thì âm thanh và sát thương có đồng bộ chính xác trên cả 2 máy không. + +Việc đi theo trình tự này giúp bạn có một "cái móng" (Giai đoạn 1, 2, 3) thật chắc. Đến Giai đoạn 5, việc thêm một cái bẫy mới chỉ đơn giản là tạo script mới kế thừa TrapBase và viết thêm đúng logic đặc thù của nó mà không phải code lại phần mạng hay UI. \ No newline at end of file diff --git a/Assets/Scripts/Trap/Trap Plan.txt.meta b/Assets/Scripts/Trap/Trap Plan.txt.meta new file mode 100644 index 00000000..6598137e --- /dev/null +++ b/Assets/Scripts/Trap/Trap Plan.txt.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 29f287241c813d849b277aaf18a91f57 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Trap/TrapBase.cs b/Assets/Scripts/Trap/TrapBase.cs new file mode 100644 index 00000000..32ee6242 --- /dev/null +++ b/Assets/Scripts/Trap/TrapBase.cs @@ -0,0 +1,205 @@ +using Fusion; +using UnityEngine; + +public enum TrapState +{ + Arming, // Newly placed, arming delay active + Armed, // Active and scanning for targets + Triggered, // Tripped by a target, applying effects + Despawning // Mark for cleanup/destruction +} + +[RequireComponent(typeof(NetworkObject))] +public abstract class TrapBase : NetworkBehaviour +{ + [Header("Trap Config")] + [SerializeField] protected TrapDataSO trapData; + + [Networked] public PlayerRef Owner { get; set; } + [Networked, OnChangedRender(nameof(OnStateChanged))] public TrapState State { get; set; } + [Networked] protected TickTimer ArmingTimer { get; set; } + [Networked] protected TickTimer LifetimeTimer { get; set; } + + protected Collider trapCollider; + protected Animator animator; + protected AudioSource audioSource; + + public override void Spawned() + { + trapCollider = GetComponent(); + animator = GetComponentInChildren(); + audioSource = GetComponent(); + + if (Object.HasStateAuthority) + { + State = TrapState.Arming; + ArmingTimer = TickTimer.CreateFromSeconds(Runner, trapData.ArmingDelay); + LifetimeTimer = TickTimer.CreateFromSeconds(Runner, trapData.Lifetime); + } + + ConfigureVisibility(); + } + + public override void FixedUpdateNetwork() + { + if (!Object.HasStateAuthority) return; + + // Count down the arming delay + if (State == TrapState.Arming && ArmingTimer.Expired(Runner)) + { + State = TrapState.Armed; + } + + // Auto-despawn when lifetime timer expires + if (LifetimeTimer.Expired(Runner)) + { + DespawnTrap(); + } + } + + protected virtual void OnTriggerEnter(Collider other) + { + // Physics collision triggers are only processed on Server/Host (State Authority) + if (!Object.HasStateAuthority) return; + if (State != TrapState.Armed) return; + + if (IsTargetValid(other.gameObject)) + { + TriggerTrap(other.gameObject); + } + } + + protected bool IsTargetValid(GameObject target) + { + // Verify target has a NetworkObject and check role through PlayerData + var netObj = target.GetComponent(); + if (netObj != null) + { + var playerData = target.GetComponent(); + if (playerData != null && playerData.PlayerRole == _Role.Seeker) + { + return true; + } + } + return false; + } + + protected void TriggerTrap(GameObject victim) + { + State = TrapState.Triggered; + OnTriggered(victim); + } + + // Abstract methods to be implemented by specific traps + protected abstract void OnTriggered(GameObject victim); + + protected virtual void ConfigureVisibility() + { + var localPlayer = Runner.LocalPlayer; + PlayerDataManager pdm = PlayerDataManager.Instance; + + if (pdm != null && pdm.TryGetPlayerMetaData(localPlayer, out var meta)) + { + if (meta.Role == _Role.Trapper) + { + // Trapper sees their traps clearly + gameObject.layer = LayerMask.NameToLayer("Default"); + SetTrapAlpha(0.8f); + } + else + { + // Seeker: place in stealth layer if exists, otherwise disable MeshRenderers as fallback + int stealthLayer = LayerMask.NameToLayer("StealthTrap"); + if (stealthLayer != -1) + { + SetLayerRecursively(gameObject, stealthLayer); + } + else + { + SetRenderersEnabled(false); + } + } + } + } + + private void SetLayerRecursively(GameObject obj, int newLayer) + { + if (obj == null) return; + obj.layer = newLayer; + foreach (Transform child in obj.transform) + { + SetLayerRecursively(child.gameObject, newLayer); + } + } + + private void SetTrapAlpha(float alpha) + { + Renderer[] renderers = GetComponentsInChildren(); + foreach (var r in renderers) + { + foreach (var mat in r.materials) + { + Color col = mat.color; + col.a = alpha; + mat.color = col; + } + } + } + + private void SetRenderersEnabled(bool isEnabled) + { + Renderer[] renderers = GetComponentsInChildren(); + foreach (var r in renderers) + { + r.enabled = isEnabled; + } + } + + public void OnStateChanged() + { + HandleStateVisuals(); + } + + protected virtual void HandleStateVisuals() + { + switch (State) + { + case TrapState.Arming: + // Play placement sound effect or visual cue locally + if (audioSource != null && trapData.PlaceSFX != null) + { + audioSource.PlayOneShot(trapData.PlaceSFX); + } + break; + case TrapState.Armed: + // Visual indicators of trap active state (e.g. flashing light) + break; + case TrapState.Triggered: + // When triggered, reveal the trap mesh to everyone + SetRenderersEnabled(true); + + if (animator != null) + { + animator.SetTrigger("Trigger"); + } + if (audioSource != null && trapData.TriggerSFX != null) + { + audioSource.PlayOneShot(trapData.TriggerSFX); + } + if (trapData.TriggerVFX != null) + { + Instantiate(trapData.TriggerVFX, transform.position, Quaternion.identity); + } + break; + } + } + + protected void DespawnTrap() + { + if (Object != null && Object.IsValid && Object.HasStateAuthority) + { + State = TrapState.Despawning; + Runner.Despawn(Object); + } + } +} diff --git a/Assets/Scripts/Trap/TrapBase.cs.meta b/Assets/Scripts/Trap/TrapBase.cs.meta new file mode 100644 index 00000000..4016bbf8 --- /dev/null +++ b/Assets/Scripts/Trap/TrapBase.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 1ec3d61910ea79340acc47196c3b78c3 \ No newline at end of file diff --git a/Assets/Scripts/Trap/TrapDataSO.cs b/Assets/Scripts/Trap/TrapDataSO.cs new file mode 100644 index 00000000..bc1ad836 --- /dev/null +++ b/Assets/Scripts/Trap/TrapDataSO.cs @@ -0,0 +1,37 @@ +using UnityEngine; +using Fusion; + +public enum TrapType +{ + BearTrap, + PoisonGasTrap, + AlarmTrap, + FlashbangTrap +} + +[CreateAssetMenu(fileName = "NewTrapData", menuName = "BabaYaga/TrapData")] +public class TrapDataSO : ScriptableObject +{ + [Header("Basic Info")] + public string TrapName; + public TrapType Type; + public NetworkPrefabRef TrapPrefab; + public GameObject GhostPrefab; // Preview mesh for Trapper client + + [Header("Gameplay Variables")] + public float Cooldown = 5f; + public float ArmingDelay = 1.5f; // Time before trap becomes active + public float Lifetime = 60f; // Time before trap despawns automatically + public float PlacementMaxDistance = 5f; + + [Header("Specific Effects")] + public float Damage = 30f; + public float EffectDuration = 3f; // Stun/Blind/Alarm duration + public float EffectRadius = 4f; // For AoE traps like gas/flashbang + + [Header("Audio & Visuals")] + public Sprite Icon; + public AudioClip PlaceSFX; + public AudioClip TriggerSFX; + public GameObject TriggerVFX; +} diff --git a/Assets/Scripts/Trap/TrapDataSO.cs.meta b/Assets/Scripts/Trap/TrapDataSO.cs.meta new file mode 100644 index 00000000..1dd6bc65 --- /dev/null +++ b/Assets/Scripts/Trap/TrapDataSO.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: e0918021c117c7d4a8e8d5ae50f16367 \ No newline at end of file diff --git a/Assets/Scripts/Trap/TrapPlacementController.cs b/Assets/Scripts/Trap/TrapPlacementController.cs new file mode 100644 index 00000000..d461138f --- /dev/null +++ b/Assets/Scripts/Trap/TrapPlacementController.cs @@ -0,0 +1,244 @@ +using Fusion; +using UnityEngine; + +public class TrapPlacementController : NetworkBehaviour +{ + [Header("Placement Setup")] + [SerializeField] private TrapDataSO[] availableTraps; + [SerializeField] private LayerMask placementLayerMask; + + private PlayerData playerData; + private int selectedTrapIndex = 0; + private GameObject currentGhostInstance; + private bool isPreviewing = false; + private float[] cooldownTimers; + + public override void Spawned() + { + playerData = GetComponent(); + + // Initialize cooldown tracking for each trap type + if (availableTraps != null) + { + cooldownTimers = new float[availableTraps.Length]; + } + } + + void Update() + { + // Only run placement logic for the local player who is a Trapper + if (!Object.HasInputAuthority) return; + if (playerData == null || playerData.PlayerRole != _Role.Trapper) return; + + // Handle cooldown timers update + UpdateCooldowns(); + + // 1. Input: Select Trap Type via Alpha Keys (1, 2, 3, 4) + HandleTrapSelectionInput(); + + // 2. Input: Toggle Preview (Q key) + if (Input.GetKeyDown(KeyCode.Q)) + { + TogglePreview(); + } + + // 3. Update Preview & Handle Placement Click + if (isPreviewing) + { + UpdateGhostPosition(); + + if (Input.GetMouseButtonDown(0)) // Left Click to Place + { + TryPlaceTrap(); + } + else if (Input.GetMouseButtonDown(1)) // Right Click to Cancel + { + CancelPreview(); + } + } + } + + private void UpdateCooldowns() + { + for (int i = 0; i < cooldownTimers.Length; ++i) + { + if (cooldownTimers[i] > 0) + { + cooldownTimers[i] -= Time.deltaTime; + } + } + } + + private void HandleTrapSelectionInput() + { + for (int i = 0; i < availableTraps.Length; ++i) + { + if (Input.GetKeyDown(KeyCode.Alpha1 + i)) + { + if (selectedTrapIndex != i) + { + selectedTrapIndex = i; + Debug.Log($"Selected trap: {availableTraps[selectedTrapIndex].TrapName}"); + + // If already previewing, recreate ghost for the new type + if (isPreviewing) + { + DestroyGhost(); + CreateGhost(); + } + } + } + } + } + + private void TogglePreview() + { + if (isPreviewing) + { + CancelPreview(); + } + else + { + CreateGhost(); + } + } + + private void CreateGhost() + { + if (selectedTrapIndex < 0 || selectedTrapIndex >= availableTraps.Length) return; + + var data = availableTraps[selectedTrapIndex]; + if (data.GhostPrefab != null) + { + currentGhostInstance = Instantiate(data.GhostPrefab); + isPreviewing = true; + } + } + + private void CancelPreview() + { + DestroyGhost(); + isPreviewing = false; + } + + private void DestroyGhost() + { + if (currentGhostInstance != null) + { + Destroy(currentGhostInstance); + currentGhostInstance = null; + } + } + + private void UpdateGhostPosition() + { + if (currentGhostInstance == null) return; + + // Perform raycast from viewport center + Ray ray = Camera.main.ViewportPointToRay(new Vector3(0.5f, 0.5f, 0)); + var data = availableTraps[selectedTrapIndex]; + + if (Physics.Raycast(ray, out RaycastHit hit, data.PlacementMaxDistance, placementLayerMask)) + { + currentGhostInstance.SetActive(true); + currentGhostInstance.transform.position = hit.point; + + // Align rotation with the surface normal + currentGhostInstance.transform.rotation = Quaternion.FromToRotation(Vector3.up, hit.normal); + + // Validate placement (make sure no walls, players, or other traps block it) + bool isValid = ValidatePlacement(hit.point); + UpdateGhostVisuals(isValid); + } + else + { + currentGhostInstance.SetActive(false); // Hide preview when looking in the air/out of bounds + } + } + + private bool ValidatePlacement(Vector3 position) + { + // Simple check to ensure we don't stack traps on top of each other or clip through walls + Collider[] overlaps = Physics.OverlapSphere(position, 0.5f, LayerMask.GetMask("Walls", "Trap")); + return overlaps.Length == 0; + } + + private void UpdateGhostVisuals(bool isValid) + { + if (currentGhostInstance == null) return; + + // Visual indicator: Green transparency for valid, red for invalid + Renderer[] renderers = currentGhostInstance.GetComponentsInChildren(); + Color ghostColor = isValid ? new Color(0f, 1f, 0f, 0.4f) : new Color(1f, 0f, 0f, 0.4f); + + foreach (var r in renderers) + { + foreach (var mat in r.materials) + { + // Set standard rendering properties to handle transparent coloring + mat.SetFloat("_Mode", 3); // Transparent mode + mat.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha); + mat.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha); + mat.SetInt("_ZWrite", 0); + mat.DisableKeyword("_ALPHATEST_ON"); + mat.EnableKeyword("_ALPHABLEND_ON"); + mat.DisableKeyword("_ALPHAPREMULTIPLY_ON"); + mat.renderQueue = 3000; + mat.color = ghostColor; + } + } + } + + private void TryPlaceTrap() + { + if (selectedTrapIndex < 0 || selectedTrapIndex >= availableTraps.Length) return; + + // Check local cooldown + if (cooldownTimers[selectedTrapIndex] > 0) + { + Debug.LogWarning($"{availableTraps[selectedTrapIndex].TrapName} is on cooldown!"); + return; + } + + var data = availableTraps[selectedTrapIndex]; + Ray ray = Camera.main.ViewportPointToRay(new Vector3(0.5f, 0.5f, 0)); + + if (Physics.Raycast(ray, out RaycastHit hit, data.PlacementMaxDistance, placementLayerMask)) + { + if (ValidatePlacement(hit.point)) + { + // Send placement request RPC to host + RPC_RequestPlaceTrap(hit.point, Quaternion.FromToRotation(Vector3.up, hit.normal), selectedTrapIndex); + + // Set cooldown timer + cooldownTimers[selectedTrapIndex] = data.Cooldown; + CancelPreview(); + } + } + } + + [Rpc(RpcSources.InputAuthority, RpcTargets.StateAuthority)] + private void RPC_RequestPlaceTrap(Vector3 position, Quaternion rotation, int trapIndex) + { + if (trapIndex < 0 || trapIndex >= availableTraps.Length) return; + + TrapDataSO data = availableTraps[trapIndex]; + + // Host spawns the networked trap prefab + NetworkObject spawnedTrapObj = Runner.Spawn(data.TrapPrefab, position, rotation, Object.InputAuthority); + + // Configure ownership + TrapBase trap = spawnedTrapObj.GetComponent(); + if (trap != null) + { + trap.Owner = Object.InputAuthority; + } + + Debug.Log($"[Host] Spawned trap '{data.TrapName}' requested by Player {Object.InputAuthority.PlayerId}"); + } + + private void OnDestroy() + { + DestroyGhost(); + } +} diff --git a/Assets/Scripts/Trap/TrapPlacementController.cs.meta b/Assets/Scripts/Trap/TrapPlacementController.cs.meta new file mode 100644 index 00000000..66bba124 --- /dev/null +++ b/Assets/Scripts/Trap/TrapPlacementController.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 517119b8bcd57fd40b9bfa76493b234f \ No newline at end of file diff --git a/Assets/Scripts/Trap/WorldSpacePing.cs b/Assets/Scripts/Trap/WorldSpacePing.cs new file mode 100644 index 00000000..a99bc111 --- /dev/null +++ b/Assets/Scripts/Trap/WorldSpacePing.cs @@ -0,0 +1,14 @@ +using UnityEngine; + +public class WorldSpacePing : MonoBehaviour +{ + void LateUpdate() + { + // Face the main camera + if (Camera.main != null) + { + transform.LookAt(transform.position + Camera.main.transform.rotation * Vector3.forward, + Camera.main.transform.rotation * Vector3.up); + } + } +} diff --git a/Assets/Scripts/Trap/WorldSpacePing.cs.meta b/Assets/Scripts/Trap/WorldSpacePing.cs.meta new file mode 100644 index 00000000..b993b279 --- /dev/null +++ b/Assets/Scripts/Trap/WorldSpacePing.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 57851794d79358542a14d9c4e421ecf8 \ No newline at end of file diff --git a/Assets/Scripts/UI/MainMenuController.cs b/Assets/Scripts/UI/MainMenuController.cs index d4d3e60b..6e09a147 100644 --- a/Assets/Scripts/UI/MainMenuController.cs +++ b/Assets/Scripts/UI/MainMenuController.cs @@ -43,7 +43,6 @@ namespace Hallucinate.UI // Lắng nghe sự kiện thay đổi kích thước toàn màn hình root.RegisterCallback(OnScreenResize); - /*_logo.RegisterCallback(OnLogoClicked);*/ var settingsBtn = root.Q