From fcf8353ec24e148acd4d00b177250a4a17be9a33 Mon Sep 17 00:00:00 2001 From: manhduyhoang90 Date: Fri, 5 Jun 2026 14:10:16 +0700 Subject: [PATCH] Update AI --- Assets/Scenes/Cho môn AI/Only AI.unity | 409 +++++++++++++----- .../Only AI/NavMesh-NavManager 1.asset | Bin 0 -> 85132 bytes .../Only AI/NavMesh-NavManager 1.asset.meta | 8 + Assets/Scripts/AI NPC/EnemyAI.cs | 276 ++++++++---- 4 files changed, 497 insertions(+), 196 deletions(-) create mode 100644 Assets/Scenes/Cho môn AI/Only AI/NavMesh-NavManager 1.asset create mode 100644 Assets/Scenes/Cho môn AI/Only AI/NavMesh-NavManager 1.asset.meta diff --git a/Assets/Scenes/Cho môn AI/Only AI.unity b/Assets/Scenes/Cho môn AI/Only AI.unity index e20229a1..d9229eb3 100644 --- a/Assets/Scenes/Cho môn AI/Only AI.unity +++ b/Assets/Scenes/Cho môn AI/Only AI.unity @@ -41361,7 +41361,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 0} + m_TransformParent: {fileID: 1625646592} m_Modifications: - target: {fileID: -8789529727683405701, guid: b96d0fcc541b0b947907dd08b9f5beab, type: 3} propertyPath: notificationText @@ -41381,15 +41381,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 600579176653881994, guid: b96d0fcc541b0b947907dd08b9f5beab, type: 3} propertyPath: m_LocalPosition.x - value: 18.23 + value: 10.72584 objectReference: {fileID: 0} - target: {fileID: 600579176653881994, guid: b96d0fcc541b0b947907dd08b9f5beab, type: 3} propertyPath: m_LocalPosition.y - value: 10.363 + value: 6.58385 objectReference: {fileID: 0} - target: {fileID: 600579176653881994, guid: b96d0fcc541b0b947907dd08b9f5beab, type: 3} propertyPath: m_LocalPosition.z - value: 42.18 + value: 17.501871 objectReference: {fileID: 0} - target: {fileID: 600579176653881994, guid: b96d0fcc541b0b947907dd08b9f5beab, type: 3} propertyPath: m_LocalRotation.w @@ -41397,7 +41397,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 600579176653881994, guid: b96d0fcc541b0b947907dd08b9f5beab, type: 3} propertyPath: m_LocalRotation.x - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 600579176653881994, guid: b96d0fcc541b0b947907dd08b9f5beab, type: 3} propertyPath: m_LocalRotation.y @@ -41444,6 +41444,11 @@ PrefabInstance: m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: b96d0fcc541b0b947907dd08b9f5beab, type: 3} +--- !u!4 &241771775 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 600579176653881994, guid: b96d0fcc541b0b947907dd08b9f5beab, type: 3} + m_PrefabInstance: {fileID: 241771774} + m_PrefabAsset: {fileID: 0} --- !u!1 &282447033 GameObject: m_ObjectHideFlags: 0 @@ -46884,7 +46889,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 0} + m_TransformParent: {fileID: 1625646592} m_Modifications: - target: {fileID: 5687887011233860168, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_Layer @@ -46892,15 +46897,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalPosition.x - value: 2.6 + value: -4.90416 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalPosition.y - value: 4.53 + value: 0.7508502 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalPosition.z - value: 51.2 + value: 26.521872 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalRotation.w @@ -46908,15 +46913,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalRotation.x - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalRotation.y - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalRotation.z - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -46978,6 +46983,11 @@ Rigidbody: m_Interpolate: 0 m_Constraints: 112 m_CollisionDetection: 0 +--- !u!4 &310459322 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} + m_PrefabInstance: {fileID: 310459319} + m_PrefabAsset: {fileID: 0} --- !u!1 &333057065 GameObject: m_ObjectHideFlags: 0 @@ -47002,8 +47012,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 333057065} serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 3.62463, y: 13.27338, z: -19.50002} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -3.87953, y: 9.49423, z: -44.178146} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: @@ -47053,7 +47063,7 @@ Transform: - {fileID: 375187854} - {fileID: 1061793569} - {fileID: 1398230979} - m_Father: {fileID: 0} + m_Father: {fileID: 1625646592} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &333831099 GameObject: @@ -47435,12 +47445,12 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 348410791} serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 5.7248, y: 1.5, z: -32.50002} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -1.7793598, y: -2.27915, z: -57.178146} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] - m_Father: {fileID: 0} + m_Father: {fileID: 1625646592} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &365978100 GameObject: @@ -90060,7 +90070,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 0} + m_TransformParent: {fileID: 1625646592} m_Modifications: - target: {fileID: 5687887011233860168, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_Layer @@ -90068,15 +90078,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalPosition.x - value: -8.9 + value: -16.40416 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalPosition.y - value: 1.08 + value: -2.69915 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalPosition.z - value: 45.2 + value: 20.521872 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalRotation.w @@ -90084,15 +90094,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalRotation.x - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalRotation.y - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalRotation.z - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -90154,13 +90164,18 @@ Rigidbody: m_Interpolate: 0 m_Constraints: 112 m_CollisionDetection: 0 +--- !u!4 &570772204 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} + m_PrefabInstance: {fileID: 570772201} + m_PrefabAsset: {fileID: 0} --- !u!1001 &572767392 PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 0} + m_TransformParent: {fileID: 1625646592} m_Modifications: - target: {fileID: 5687887011233860168, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_Layer @@ -90168,15 +90183,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalPosition.x - value: 9.72 + value: 2.2158403 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalPosition.y - value: 1.08 + value: -2.69915 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalPosition.z - value: 15.75 + value: -8.928129 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalRotation.w @@ -90184,15 +90199,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalRotation.x - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalRotation.y - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalRotation.z - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -90222,6 +90237,11 @@ PrefabInstance: insertIndex: -1 addedObject: {fileID: 1665376262} m_SourcePrefab: {fileID: 100100000, guid: 15df559ce497e104a81254e0adf3107e, type: 3} +--- !u!4 &572767393 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} + m_PrefabInstance: {fileID: 572767392} + m_PrefabAsset: {fileID: 0} --- !u!43 &593490377 Mesh: m_ObjectHideFlags: 0 @@ -90406,7 +90426,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 0} + m_TransformParent: {fileID: 1625646592} m_Modifications: - target: {fileID: 5687887011233860168, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_Layer @@ -90414,15 +90434,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalPosition.x - value: -13.62 + value: -21.12416 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalPosition.y - value: 1.08 + value: -2.69915 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalPosition.z - value: 25.6 + value: 0.9218712 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalRotation.w @@ -90430,15 +90450,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalRotation.x - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalRotation.y - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalRotation.z - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -90500,13 +90520,18 @@ Rigidbody: m_Interpolate: 0 m_Constraints: 112 m_CollisionDetection: 0 +--- !u!4 &626847832 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} + m_PrefabInstance: {fileID: 626847829} + m_PrefabAsset: {fileID: 0} --- !u!1001 &628283017 PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 0} + m_TransformParent: {fileID: 1625646592} m_Modifications: - target: {fileID: -8789529727683405701, guid: b96d0fcc541b0b947907dd08b9f5beab, type: 3} propertyPath: notificationText @@ -90526,15 +90551,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 600579176653881994, guid: b96d0fcc541b0b947907dd08b9f5beab, type: 3} propertyPath: m_LocalPosition.x - value: -6.4864435 + value: -13.990603 objectReference: {fileID: 0} - target: {fileID: 600579176653881994, guid: b96d0fcc541b0b947907dd08b9f5beab, type: 3} propertyPath: m_LocalPosition.y - value: 10.22 + value: 6.4408503 objectReference: {fileID: 0} - target: {fileID: 600579176653881994, guid: b96d0fcc541b0b947907dd08b9f5beab, type: 3} propertyPath: m_LocalPosition.z - value: 35.790524 + value: 11.112394 objectReference: {fileID: 0} - target: {fileID: 600579176653881994, guid: b96d0fcc541b0b947907dd08b9f5beab, type: 3} propertyPath: m_LocalRotation.w @@ -90589,6 +90614,11 @@ PrefabInstance: m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: b96d0fcc541b0b947907dd08b9f5beab, type: 3} +--- !u!4 &628283018 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 600579176653881994, guid: b96d0fcc541b0b947907dd08b9f5beab, type: 3} + m_PrefabInstance: {fileID: 628283017} + m_PrefabAsset: {fileID: 0} --- !u!43 &631793619 Mesh: m_ObjectHideFlags: 0 @@ -92503,7 +92533,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 0} + m_TransformParent: {fileID: 1625646592} m_Modifications: - target: {fileID: 5687887011233860168, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_Layer @@ -92511,15 +92541,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalPosition.x - value: 17.43 + value: 9.92584 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalPosition.y - value: 12.07 + value: 8.29085 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalPosition.z - value: 39.186 + value: 14.507872 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalRotation.w @@ -92527,15 +92557,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalRotation.x - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalRotation.y - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalRotation.z - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -92597,6 +92627,11 @@ Rigidbody: m_Interpolate: 0 m_Constraints: 112 m_CollisionDetection: 0 +--- !u!4 &640822036 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} + m_PrefabInstance: {fileID: 640822033} + m_PrefabAsset: {fileID: 0} --- !u!43 &643120550 Mesh: m_ObjectHideFlags: 0 @@ -93626,7 +93661,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 0} + m_TransformParent: {fileID: 1625646592} m_Modifications: - target: {fileID: 5687887011233860168, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_Layer @@ -93634,15 +93669,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalPosition.x - value: 1.5 + value: -6.00416 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalPosition.y - value: 1.08 + value: -2.69915 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalPosition.z - value: -4.2 + value: -28.878128 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalRotation.w @@ -93650,15 +93685,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalRotation.x - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalRotation.y - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalRotation.z - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -93720,6 +93755,11 @@ Rigidbody: m_Interpolate: 0 m_Constraints: 112 m_CollisionDetection: 0 +--- !u!4 &665174409 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} + m_PrefabInstance: {fileID: 665174406} + m_PrefabAsset: {fileID: 0} --- !u!1 &678938548 GameObject: m_ObjectHideFlags: 0 @@ -93812,11 +93852,11 @@ Transform: m_GameObject: {fileID: 678938548} serializedVersion: 2 m_LocalRotation: {x: 0.5, y: -0.5, z: 0.5, w: 0.5} - m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalPosition: {x: -7.50416, y: -0.77915, z: -24.67813} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] - m_Father: {fileID: 0} + m_Father: {fileID: 1625646592} m_LocalEulerAnglesHint: {x: 90, y: -90, z: 0} --- !u!114 &678938551 MonoBehaviour: @@ -107713,7 +107753,7 @@ RectTransform: m_Children: - {fileID: 1007024365} - {fileID: 292895766} - m_Father: {fileID: 0} + m_Father: {fileID: 1625646592} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -107726,7 +107766,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 0} + m_TransformParent: {fileID: 1625646592} m_Modifications: - target: {fileID: 5687887011233860168, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_Layer @@ -107734,15 +107774,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalPosition.x - value: 9.7 + value: 2.19584 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalPosition.y - value: 1.08 + value: -2.69915 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalPosition.z - value: 27 + value: 2.3218708 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalRotation.w @@ -107750,15 +107790,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalRotation.x - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalRotation.y - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalRotation.z - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -107820,6 +107860,11 @@ Rigidbody: m_Interpolate: 0 m_Constraints: 112 m_CollisionDetection: 0 +--- !u!4 &1004365739 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} + m_PrefabInstance: {fileID: 1004365736} + m_PrefabAsset: {fileID: 0} --- !u!1 &1007024362 GameObject: m_ObjectHideFlags: 0 @@ -134129,12 +134174,12 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1098531124} serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -16.49995, y: 10.56881, z: 19.27294} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -24.00411, y: 6.7896605, z: -5.4051895} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] - m_Father: {fileID: 0} + m_Father: {fileID: 1625646592} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1143870345 GameObject: @@ -134532,12 +134577,12 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1158761164} serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -2.42363, y: 10.37505, z: 16.23287} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -9.92779, y: 6.5958996, z: -8.445259} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] - m_Father: {fileID: 0} + m_Father: {fileID: 1617980815} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!43 &1167863508 Mesh: @@ -145093,6 +145138,39 @@ Transform: m_Children: [] m_Father: {fileID: 333057066} m_LocalEulerAnglesHint: {x: 0, y: 90, z: 0} +--- !u!1 &1617980814 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1617980815} + m_Layer: 0 + m_Name: _MANAGER + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1617980815 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1617980814} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 7.50416, y: 3.77915, z: 24.67813} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1158761166} + - {fileID: 1922855029} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1620426061 GameObject: m_ObjectHideFlags: 0 @@ -145449,13 +145527,61 @@ Transform: m_Children: [] m_Father: {fileID: 333057066} m_LocalEulerAnglesHint: {x: 0, y: -45, z: 90} +--- !u!1 &1625646591 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1625646592} + m_Layer: 0 + m_Name: _SCENE + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1625646592 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1625646591} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 7.50416, y: 3.77915, z: 24.67813} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 678938550} + - {fileID: 333057066} + - {fileID: 1098531126} + - {fileID: 348410792} + - {fileID: 963322862} + - {fileID: 628283018} + - {fileID: 241771775} + - {fileID: 1813306720} + - {fileID: 572767393} + - {fileID: 665174409} + - {fileID: 2145701570} + - {fileID: 1004365739} + - {fileID: 626847832} + - {fileID: 310459322} + - {fileID: 570772204} + - {fileID: 1645920189} + - {fileID: 640822036} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1001 &1645920186 PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 0} + m_TransformParent: {fileID: 1625646592} m_Modifications: - target: {fileID: 5687887011233860168, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_Layer @@ -145463,15 +145589,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalPosition.x - value: 14.3 + value: 6.7958403 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalPosition.y - value: 1.08 + value: -2.69915 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalPosition.z - value: 35.1 + value: 10.421869 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalRotation.w @@ -145479,15 +145605,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalRotation.x - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalRotation.y - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalRotation.z - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -145549,6 +145675,11 @@ Rigidbody: m_Interpolate: 0 m_Constraints: 112 m_CollisionDetection: 0 +--- !u!4 &1645920189 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} + m_PrefabInstance: {fileID: 1645920186} + m_PrefabAsset: {fileID: 0} --- !u!43 &1649158037 Mesh: m_ObjectHideFlags: 0 @@ -146559,7 +146690,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 0} + m_TransformParent: {fileID: 1625646592} m_Modifications: - target: {fileID: -8789529727683405701, guid: b96d0fcc541b0b947907dd08b9f5beab, type: 3} propertyPath: notificationText @@ -146579,15 +146710,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 600579176653881994, guid: b96d0fcc541b0b947907dd08b9f5beab, type: 3} propertyPath: m_LocalPosition.x - value: 2.08 + value: -5.42416 objectReference: {fileID: 0} - target: {fileID: 600579176653881994, guid: b96d0fcc541b0b947907dd08b9f5beab, type: 3} propertyPath: m_LocalPosition.y - value: 3.29 + value: -0.48915005 objectReference: {fileID: 0} - target: {fileID: 600579176653881994, guid: b96d0fcc541b0b947907dd08b9f5beab, type: 3} propertyPath: m_LocalPosition.z - value: 51.64 + value: 26.96187 objectReference: {fileID: 0} - target: {fileID: 600579176653881994, guid: b96d0fcc541b0b947907dd08b9f5beab, type: 3} propertyPath: m_LocalRotation.w @@ -146595,7 +146726,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 600579176653881994, guid: b96d0fcc541b0b947907dd08b9f5beab, type: 3} propertyPath: m_LocalRotation.x - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 600579176653881994, guid: b96d0fcc541b0b947907dd08b9f5beab, type: 3} propertyPath: m_LocalRotation.y @@ -146642,6 +146773,11 @@ PrefabInstance: m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: b96d0fcc541b0b947907dd08b9f5beab, type: 3} +--- !u!4 &1813306720 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 600579176653881994, guid: b96d0fcc541b0b947907dd08b9f5beab, type: 3} + m_PrefabInstance: {fileID: 1813306719} + m_PrefabAsset: {fileID: 0} --- !u!43 &1820026756 Mesh: m_ObjectHideFlags: 0 @@ -147317,6 +147453,70 @@ Transform: m_Children: [] m_Father: {fileID: 333057066} m_LocalEulerAnglesHint: {x: 0, y: 45, z: 0} +--- !u!1 &1922855028 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1922855029} + - component: {fileID: 1922855030} + m_Layer: 0 + m_Name: NavManager + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1922855029 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1922855028} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1617980815} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1922855030 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1922855028} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7a5ac11cc976e418e8d13136b07e1f52, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.AI.Navigation::Unity.AI.Navigation.NavMeshSurface + m_SerializedVersion: 0 + m_AgentTypeID: 0 + m_CollectObjects: 0 + m_Size: {x: 10, y: 10, z: 10} + m_Center: {x: 0, y: 2, z: 0} + m_LayerMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_UseGeometry: 0 + m_DefaultArea: 0 + m_GenerateLinks: 0 + m_IgnoreNavMeshAgent: 1 + m_IgnoreNavMeshObstacle: 1 + m_OverrideTileSize: 0 + m_TileSize: 256 + m_OverrideVoxelSize: 0 + m_VoxelSize: 0.16666667 + m_MinRegionArea: 2 + m_NavMeshData: {fileID: 23800000, guid: 84212f9f021e4404f8fe07ca27865272, type: 2} + m_BuildHeightMesh: 0 --- !u!43 &1951987860 Mesh: m_ObjectHideFlags: 0 @@ -150314,7 +150514,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 0} + m_TransformParent: {fileID: 1625646592} m_Modifications: - target: {fileID: 5687887011233860168, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_Layer @@ -150322,15 +150522,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalPosition.x - value: -8.8 + value: -16.304161 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalPosition.y - value: 1.08 + value: -2.69915 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalPosition.z - value: 8.1 + value: -16.578129 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalRotation.w @@ -150338,15 +150538,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalRotation.x - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalRotation.y - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalRotation.z - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -150408,25 +150608,14 @@ Rigidbody: m_Interpolate: 0 m_Constraints: 112 m_CollisionDetection: 0 +--- !u!4 &2145701570 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 6442306242859885696, guid: 15df559ce497e104a81254e0adf3107e, type: 3} + m_PrefabInstance: {fileID: 2145701567} + m_PrefabAsset: {fileID: 0} --- !u!1660057539 &9223372036854775807 SceneRoots: m_ObjectHideFlags: 0 m_Roots: - - {fileID: 678938550} - - {fileID: 333057066} - - {fileID: 1098531126} - - {fileID: 348410792} - - {fileID: 963322862} - - {fileID: 628283017} - - {fileID: 241771774} - - {fileID: 1813306719} - - {fileID: 572767392} - - {fileID: 665174406} - - {fileID: 2145701567} - - {fileID: 1004365736} - - {fileID: 626847829} - - {fileID: 310459319} - - {fileID: 570772201} - - {fileID: 1645920186} - - {fileID: 640822033} - - {fileID: 1158761166} + - {fileID: 1625646592} + - {fileID: 1617980815} diff --git a/Assets/Scenes/Cho môn AI/Only AI/NavMesh-NavManager 1.asset b/Assets/Scenes/Cho môn AI/Only AI/NavMesh-NavManager 1.asset new file mode 100644 index 0000000000000000000000000000000000000000..9bbb6b32f0a3238bfa75efdd3700cdea1518e622 GIT binary patch literal 85132 zcmce92YgjU_Ww-?9i#~YQUV6iC`c1QT0)azK_C&Z5K8DZfMS1GQ4tVCQ4vKK%L`)f zt|Zu2#kDM0P+8Z8tFFDR_5b~zGw0rUFFYUq{$_7JFZY}|XJ*cK+C6vf+_^yz9!)|j z*zb0sGmc)SVf(#fvhJNab?Vr)W9Lp&ItRc0_S2JT?@x{yEmu>s*r25bF ze{s^s)tawE=rdJ~?GAkPRc$_!#9E`8eYd-m6?5I@oWS{39O!4Tjp1!$IUZOUWJMGx4Q(HZ5# zALT5=j67dnMapk~q`|VOOSzPk#jg?^kGM1Nquu*dkY@xt5O*lTnSMQ-8^rL>9m)CE zM|guWlQOTw{2NdniA6pJJo9Jz4JnUB3K>C`-wFLZ) z5uTWTwctkJGyLo*iSn%A64dPigcI9-735VV{uu~o`87=;Ki|olrI52TGJf+E@-bEd3Fl<^G@C-g?zh{v!5rHzm_k?04bjX zQpi7Y@|+a%ubjMH3i;1YeqaiDHB=7kr+t#V3PS5c&PC-0g<{<4#EtWPc<#^34Whwnko>(j?h-hB^p#{a>| zahej{A8I^YMDpa*tx2addp`1v$sJBPoyh^2G7I7v*`r zJaK&OO?f0n>#7nALE0SOjzKuvs4wUE`YmLI(8+_WZv}Z(X`fReXZ!7!LO#>U^HRv? zI(dEy`2r{JpF)0`lMhHCKhwzvrjVcO66!H~L&g*Dm z`D^*EcJg5<|C($5oJ5P4Le~ zK;9sT;lCakLDdBR?05tx%CiF49J?3kv;U05FVQ~jAAg0M{bLm6G5m8!vi~s};q}W* z$}|)EM*-!LSmfJ~Hv0$DFQhycDVYE9rpy0?3i3q%gT72+|4j5h#!?<7kNm3zA2|Pm z8P+j`phsdA(@5B`HkDUCZ6!MRq{NxI9^{+m4_)eibhJWrr{bgXx4*kpV z2>(5NMU=a^JemK+@}>O~@Jp04G>CnN{OLPQtRSx{q^oRZ>e{WL)SY@ahJ zkKvy?lIv#{!hf%RW>apFac227L)xsLZ18jNOO#ia^3Qen=Zc(~dhlMtFaLQ6PQH=TmGk3kXM)StqbyJOFd2G_~#Dx zPx=SloP06D6U$G>ukMhu{!XVn<|5;iJbv*$BC-Aw$FDOfkD?=fm0%Fkw)#7(f;>y= zZ!C1!f6f+pHva3u@!7Axa}bg$}d(yuK7=J`7fy;Pt5{@eI=smQWJ4c4z;KbNJDTlp+YA-D3myn-*qC7{vA8v)MJVlOdB|1;e=qsh=nD+ z2Th*7aBj(<#S4q)ESNrbPTyem_`%a>6%QQ?FE6yNZPZ?KV-s!X~D$P7Zxu#vD3+p=xjt6Bf1*V&4|N|=x)RjM)WYE zrxBf_q{Fm3hlzI%Q|}xm-x=vUyZbMiK5O!*;)M&R&zZU)!j>33VQTT5g`-cO$HEbM z+usl@|J=FW3kvnMPbwrKXe{7EHq z7c3Y!UCT6>J$=r|;;E>F{F34c!R!fh7EPEnpm^4-QPa;T4kj6);Vg9tUueWcLeTVC z^oYNB*xZRH%q^K&T(TgTS5my7xa8DgsjcG{EnF~ta&iB;i{?xYt4^>EES|V%YFG}F z$+1Dqnjod3sn4D;Z$S`}Qrim_l}wp1sd)6<(ZwYt6Q<7ziaT|}uQPsK@aq~BcLv`X zd}r{T!FK`Q1$-CqUBGt*-xYjU@LjtG3pE`{eENcsa~DonSUee)MEKC=BE~hj!s3#J z(L&~kDfkf=7J!9(Zac2fXjWe|Na@r=SogD|aE2^l!OqPTU-&2dffQpn9$N0aHu6`vBlg7T_Zya%&bZ_WT-Khb+U3`L zo`aw)FC!Lv;x8Z0DI!sW<4c|}9nwsl^AkKWV?j&^{9~TXJ33S=Q)UJkrz+&F z@T(Q%1oS8?9=ngaVcemQt$bukZnK*2-??mokMqa9z!|`P!&z8Rkbsji!&v}XGOgHD zXU{mZVzhW~a0Y@i$Vi3rlfO-S=g7{_-}}hj%d>i}Uvj;V^QXPQNoECulwQee_vg4_wwp>Iy~Qfr-_q8)w^}?>y#<_E&sc z@9}GjmMnU@hL004_X1~bh!gb}`1R>yqs%ZHtvD5bW#cUEv8`{>Zz~=+WcnS`KYifp z&wQM;CtZC~$E(l&K2FLE8!-1zrWKp&R5s4b4zH2*-SAK1=UhJO`_4_K^zm_WJWq#{ z_D4A52{;q6#XX!#yZV&y%Enpyw_b&7s+QC_=kIx^wRv{L7d}q<0qJqZL!3|_;MXVm zXNZk5t52g9XN0+;pO6)U?w@k~oX}{WlXC~${n65@=iPqazi*iC}Q zfRi%AhPtglYaOaiW!Gn|g0V#_-W~BokCEM%zB+5$1Rp1Tt#mkPzv09+KLMwYjWWY* zwAQEMuWX#XTQA-Bf(c8jUb1%Qb?aYzd5Dj*>R#Za&4v@JIudXi9$r5Scg&A)I-1x_ zXAd}$dsYnp{y@7eP3hkrckxZzuD`xV*vL>iAS;@Pb~bg zf5LXqksnXr*8F&%roQ>{8b8sGuNIT6_6jHc_(1%4QP+sx|1B9MU$mG!`}R7YWnOpg z;OB4kaS~%XoV1Vi$usf!I2p#aN^IuG`?O+H9i@|TX2odg-um%W%~5qmOE}i`nR@SM z?H{;oMXfoHKlE&egzF0Z_;fgl&2XYWCg7yZa8i~`6PxK&HqPp8ZaRGWaZOIR>giWU zEPJmy8U#*BR)?0 z@#%2VX2WTIJnM-4)9|pZn(yw@icRrXHqLIhK0fZ-&yT+7)N5CN{p}5-AM$b1k57lw z{CHP4;>R0K^W%vP^|saO(`b#Oetc!)EZO|j_{;adtk2+69&P*flCR$LaRTOE;8Z_e z?NmQL!Wm&h-HNYE%tl+;5PxOkEZ*MZ{rOe5ox7po2j9LsBcs2MllG*mPwGVNHdp*x z!%3M}hvEaey7m3R(AVcs>CX>Ui)F=-#Gf+WW_SMNxYZ*cYq<7bZ@#j9+@fQmp^;jwcEN5y`fL5p)IGM>Eom?kRGS{ z@oJ~~@e$4l8s zPouRyqx+c3?4KK3-}TYvXFn`joKffJ8j}`1>*J&!pAIK&w)!+b9$|9*G(3XS`R+b# zWs{;lgFikF(U0G=f4lIjEx#=4+3Avzr=2kD#V!2`eVp{;>H7h0IOe7D;}x6w@u)|^ zX+Ao6^W%M*aZE?!Cy%$xIm%l({@?R_{O|ekKWv(_t>B3+Z+!mjw&gdUamPX*C+jjD zPSy$QlXmjQ{%JTVV_lJFJtotNO?CE+Gb=_^e}*65qu}-0b{_2rNC>%6;i@&)q}?my|rr^88`4X63>wB7gP z$(tYV(~3>;S2oUHmc{2~H=6drRd>xDeBE*TT;SIy{rGe^&5w6=BYwQ$G(Vm^e&Wab zw8l|CzOr%t)b{R^+Em{#yZQF_2421OA2~iwz}yR*>c^{{>c>YoBW$R5@ncoy=BBmX z3jWH*IkL*P^$vRR8|N!e zOs%$jXhypak2&DFrm-qnrxeG$$G8+qrT0GX{ zv9S+a_F|tC>(&2!sgJYDUf`t7QGM!syx}xFTA%92`m~kJ|DxRSi` zyf*0mLvHeM(vMGHpX$fcX8e-sGr~rh)u+*n1Kbi$x-#o?|BwHfb?TC?clCU))icA| z-~N`5lYV?UoV3~M)BJd=Ps2mr=Hq>u*i46X63#!>j~~72!GhHXcROY2d%GVzD})={d%jPk2?FhOMIMcv*~cMy|LZWX8wGflo125QIenqGF~iI>Eh`}GN!dx6uftC4nR>uL;Vgbn!Id^BYVey`xKY@D?Yt9r$O!HZ?3 z0|r0$uZwrae4Ml=U42p~YPaggBgooqhz&TzzopD*#TH?%%>H?5pH<}xzr8oJ>+;vX ztNZ+-$v#eAx6;Cv&gZ&cL z-_nmyk5m14wbRzsSi6m|At~|ih|_4rsXCR7v+ol#3+8_x>v!^g8|I$5dvLB_pH=n( zCvA@E)7I65?KZ>)92ICQoBxHM@XA3K&fD_-*EQE4(rJ6Qu4laA-J>dLP{rHjxyDi;)$BwIiJ>&NCt6sFDsgIL>JbeY&7GA4U`SG-$ z{;ba5#<$W>Fdv;hg8A`2%{Zo`@ssNlp*a2wKmMM#pBUF}UFpjEA8q*bA^n^E=;Ndx zpAM(_@i0exRUfDM@x*3+yiYTZ=_s9yGb@Jhy~3H!A9}Y#kpEEUvQslY>9-+&{hBpzTX@0z` z8#fY*h31IF8PFq*Q{$=y= zhBLxOnboJ!IJ4afe$tiMKfiDD={YwIowxJd3x0a~tL1;~>(?jkNmrlLiQ29D@m{+P zu>p_x@or2K8d0Teh+pZ-tIt(~%h$hr>QN(WUwhTX<32sCg^!cht#mkPe}q&0c*B{9 zP5oHK8Tq}YQ`tD5ZuWqOOF8=DF`;Yc<(vMG%Q~h|gQ~me|XM_!M@%xC= zXvTrASGSc{pI`m-hz<2tfhJDI z|6jD*wNLju@{oVjJHPkx(GRtoG36c~C;j+zIBCD(q_67xLq0ajY#cJ0I88?}S6+SI zw5zatNv)Qf?!Nk^f-PN}-|XY0AD<2o@-A)|qemIO)gp8VVaiA2XF7uh`6w&rR^-QD>napGd>MkHwx~J!|~r z`ee>g-pcX+A759q;DKk~IrEv}2To{o(h0*ZxH{p!jDCDNoaV>VPSlO_ZxyHc=)`7z zd?L+${ChaFVnnq!_bciA__ZBAnQ_|9PcA;U?!cWbj&79T_tB3}hm+XYZiy2Z5^z$c zb(I_X@x)0ztHVf#n3L=C&%;@EMzfk{?0>?`KQ#Gj+qx$&NLZIjKRz8!+H5#c^a(g4 zJgi^!V~I1Oqx+aWx7$At=O;_%KR@v7TNa#l%-{cZbFY`S`2CY(P&%Bn*>KWU9dC)H zEHA>78~X9Y$+5`lGt#Nt`keNUhkx0+>*}5Nym$BFcdy*B$j3>H>2MNTgj3&h)jH$) z1j8e3)nW5#)~D%IF3#_7%Q)@ZQ|nyQwWx7}Z{`o1+!Pm0+gAWEL!32G@Qv`}nd1WY z9pI0c3@2E5&o#oSK05irf~U%@uNqxga3ky8g>PVc7Js-j?$gq?!}{M8uN9^2&eZkLbdJ>k)pRq?t%}-D-Ii7IfV@x}d7)1VI;%K6Go9 zAPc)1RHNxU@GO(wl|OcJ%uzY^O2DoOS@<8xdF2RW%lJg8%9&Dilz7dcp@cEM>Dt)5 zPf!o_P*>#qSKU!2Z;05nWd8-c#ReJckB7Z>RjNU{fZ-CgfrKUCSZ z{$*D9&-^qcvymzp!9XzV_=47zc+59RwT`hPZGUE9E|lV++&rt`9C9j+-`~biw%3 z&c%&r?eD5XnthA=s`1E*v9DIce}*X*_EokMJ9=Y4&Lc06)q#ydmzfAPpWdp`cKU!QD~>2T8is6K73L2>%n zP>*sCuJvg&u^Il##n~or)N`@Li<-Xh={t9xd)X;*A1C`~I-IoMaN@ossXh%4eWh^i zpGQl(b@(e6XK?)2uf4v{`uj?^jyUUJC zrxxrF+%rS!2i`M7avAPk+oy>+nrmSEZTZ;8|Te?apSDkL(YCJZ|YM+h9>My#JL6@RJOd5aiZOYIAM1JPRfXZ@hMBDiPLlx zb8>xV#TeJ}CauRG$GL9S4O>6#weKs9@?X4j#QH&N{C3N^1|Ce?@=C@@`>j5qmVnd8 zMw#I>n%GQ-G;>h|xIV{t|C1GiZkRV|J^nb(?HSA0zxnUC+h)vZyQtUd+^2n<^gDPk z?Nm4+3UP8=p}(oNl;u%o*ld1*GNTon>Qpw)>^H}C{ApSJ2S0rA#>1w*wEY1eC&yYI zv@I1*Vzc_Btv*i53@2sDG{a1%vT@da_1WT~$Iq#8+u7|`Jagl!M)Tl6+Wmu~RGdcx z>jwOI-VeVU@Zg0{I2rL*4Mo>y29(WUXvpi@?+ z;RT@Y5;_RRgmhuS$zeLB@m-;vq{kHO5IYMCJ_v1QI4h0i?C2n(?+W$JHtcp;KDwZt z!$P`lNRKFJEc(=m=(j?93JWg8yQderGPw}pv5?*r&)oz4a+v<6c>nUd;xi}T8{c&Uu@Rz_Qzg#{bKG=tzqp=o~*EDpsTO^J!m)`EH7jgN~NrruZ46ui-vT9c`GuzhM7YWhm6Z6jQn6d~_nLbINY23C~CO4rVV;I{asd!WalJzwkf1=Zga9~s&i z1bLwUBDN`gV@O-O(s1kJ*}yVLbeLyhL7$Ljy%QJ1qp~_OY=@iTN8%aDJudwkA-yS{ zi8Rla@S=hpsE;C{?}`sY`Wu~oHn9BYu)I_@rr?8+W*gG>^A7Uf>F6(D!v(GkX-&+d zt(;$ij?x^fIG4(F#uVI-@PnLw4B>4ZT_pNicO17bceW`#;)I67` z>@^rVdN3W12jFB}9Z_(&M;DNmKFj%Gv`hep6%;zVSl!~*j|lhdmzp0gSAiAoMD0E67x_$QhsWeAR5uJjR@QiiX9%1|E$=kMPR zlOBw-m6ORkK*Qt#%CV)>HF^8s(4a%8(H`*=^X~);+PgRbYAQK?ub^|#C6pf?WGAJ6 zWYEi#w+^vb{zpRE)wOxXwX&p~_zw@d+M&IASp1==-(kTJ7s?v$Ahg9Fjys=Y0)Ej8 zM@;_9Ka(F9jKH@)N2*{C^1@(fm^yRs=#sGf3n3jG@QYfSGcoY6^algss9>~c5c?7M zF%8ODeq-^qs}qA0f-#`|!{ny~u-Kg65vY|401<*Ia~Zi!KwJ> z!9o+_oLE2o(RUU*>47-sJDTxXKl9MTOwPWgsYmrQ9~vg_i`WB_;_Fu<=DSdy674%P zI1ArHI!EMcnW~!oSK(_fYlABT{bmehk^RIU3zh`u;fq4&QWRrlI&Vy$-8BuVkFXtA#VKdE`j*8q8ThKJ(Ql-5EmbbxUcz##E8;Z0IpA_1k)Mj?k*# z&Z7?$TH|uGWNwU`E3~Ggqp^nDXi6O&`!rm~IZa2$B#o8S6ZI@SxBul8Ei?<@LB=Lwx9_74y9ZPP1*>JRgDh6}CX$9Un#df_8L(?4b% z>iDcHB*r;?hMy?3hMz2S711y9XdPWLBz&@`KSgK_pX$-mJbJoE&k$Pkn&pMh_QK~1 zoh5lK@N{$p(zvHexY~KT7xzq$KHH0{ql4Nh{TywE*khjlc^-X%(3<|mpm`6%ky(3b zhR|0y9fn_tA6JdAAFP$|Orfv!=ygI@33?oHLV5lA?fa2^?BQnRHI}Xxdhz0i%8dTv z+eKybiqDepp!LsNoc@++tFJFBdV49ux729;v+3i0Yb@^J8X!FOxKFojJ5Iu5*Ie_s zPc!c!FD%&-1gDgf{^Ij7pl1pF!)ePv>s*UZM>^SM7Wc->I+p3Zco1Yi^3j%`drc{0 zdOUvaHMlI+;wYqrSr*){7qxh1OMrP5(q*+@gUu(GlfE(j@fKbuv}QSSaP1BIL<9V1 z`_95&RZv`w!TT#+V^s@$HFs}V4R={J!RwleESx!B@yvQjzm|t%BG*RPIoTeLb8L}Z znM7+S-&4BOW6LtRrDx|X#M4&AFT(Mw!Hn_8?TgY;%V-VD&GM;ee_|Q*>m~D1eu?GA z*1~?zn&FviFL|zp`mFA1jdjF2)c#RLGE7p?#(mE-yiZH2jt%j`F{%kdB|_${jjV7)bx~3UPB0&`2HHx zr(D-!k#8An0-q~uy&}FfP^o^)ATDy2sjfj}{&xl6BY)+~A@3E&&kdBX8|rKNECcEf z2{b;R!Jm$MN8@=tR{2h(H#$sjWS~5K&qzK})`Xsj^wtGhKL0^_ebk3T_PTq5L6u?m5Aea^FdN-f(jIi58#rtL4S?)qg2|*dsUnlcWk$i&8 zy+rXRh5A~5V`W~B@(ICK#GfSdOynnGr782b@|lSAi_qp2&p61p2oH=XnO2CY`8Rj? zCb{@5pLL#`_a03D0w=fhjBn@CTPNw=j9DZr?;xW;%7^WV@mYUdGi&y(lm4P>Y*o(s zSdY7ScumlM(#h%bF9moGnKX-^!ljPH(C$@aC$$#c+(*uH$8?JMGSjkNOL18++iQ~w>tZ;g>U2;L6) zu~J_D_4po6eh}tLBa%S(BVS0m+~j`ogr^2V@-2=V11P_>^aU zC(1q0r;tx^@-{C1)eax+VR~0fdw(#YUayC=?mSp*$JHNuI(d^bJ@ST^^Cs_w>D?_)94LQ8@O~=odz;5IKHCrF zEbn26zfH>PW!SST$dmlW1^>XcfxNbFULSeA*o9er)i*iQ)A%g!T`~{(GSXA|8x`jN z5k1)c!p2|k%{yUZ?VFa)`RuyM7dLH=XS?n@s+1$i-*{$SPIc$DI4{C)27Wwj4HDM; z$U6)gT9$|2p2ugqg$0eaVx3G#+q(x0H(J*V*}4&~qtkaAm=@EuXU9gXe)RqWW+q(v zT&q*$=>KxxLZM6JxabDij;;k-bxPx0Q}j|8*X+?XKkrC*5Hy5NjeNyYJEY+?W3AYX zJU;&|ET|dMxRV2Ysf5FPV0=pG()h2i=VPZ|1v*OOi6-dhoIck_tqEzS&wNYcH4whY z(V4K}Mo0e&ylOx5Vwzf3v_WawMjJGoYq6}X>Vmd1--UG%_D;wy*x69<^7(&hym|hJ zD~6YmrjAeli1`k;wkOc?k##;ob1hJ5yq4sv>w>iWxn9WXBEXsu)8U#8vq$MKByM5B z;S6`>e>iNYy9fFy=+wyPbN?ITam=~Y_voe}P5UFAY{9~H4X{VTbqzzdq>pug5>8y3 z;@q=e%Li$PwCY6be8Bg!^*p4bbv~%EaQ%;#IoCB%N7MId&OMpV8PNGybeL~cZnR;e zln=vEhOWL2f=-#}D;A{@5A{^w^kbNN(lX?F7Nfat!pfQJDJ);Eg|RfbZpCcS@R+1Y z8ucW!>Ztu(Pf{Ac*5%7}BUXm&*KPCJez=A%z+vlE&}aMFx)G)4VU8@0H5j>qi}PjF zXSs1r3)a%**?JH3+mN<8rLNUGX$#LQD3Ek)EeGqu)_8cd=-3($of*(nIImqr$sohg zd{$OWj{rwzjQ_J@_$Tr#5}?cX+GogBtKWmCBHL^vb{~9^k?BgnqmcJwCN)4`1 zXysBN65jVSKGV-Z>1m!|fQ@tOJS=^E)_k&rvE*9^S@^GV)_V?O*K{iY=&zYAj8FN2 zxNANLXCB%3H6?+=(r*V1le4spHu(YY>g%``#`{aG9E#y2@tJ;CJjdmIq#j(^p+^*- z@6YN%+pI23u4_5yiSgjmD!IQ3(?0;{w8r&GF>T-x#pha$LnW*QJZe9G+IJ$Jvuo*z zO4wE`etY2OeH0J2fE=Ns^n0T9(-+dCrh8uJ%ek6Ek2W~55Am?{dqR4I1|e>Z3hB2; z?meAGHuU`Xw7(bbJo|(zbX-C>F@4H)tw(+&2(n^iOs;D^=t|Jh;j3y?bIm)vn!xE>;skHl&fJ-XmzZOP=v10UBr>A@Kg)u5dAbEV5+ zZmmjywwM*;tXyQDFky&>V~my%)}PUOUC?kH)K0=VcWvvCc)jHs zGagE7n^c`cyl@>gREH%`n;F+y0O?K)cHyi)OVetBI&7B~Znej79TzlxjsZ>4bBO79 z{Fo+bwoT5-x54>D{1{G}V-|gnwm6T+kBCW66gorbNgh2}=qw4J=7moeTGN^7h0pTB z=Xl|BJ$jx;&-e5fIGU&MIVWg){z)Hh#1*~D%Hp~3JKN=NUiMlZ-rs=VM*6|L7SB`> ze>(HsO?f?*Hxhcx5v%e>7aSn;NzLZwEqjma+S}!y)U01#9BYQfpL?=q-updDgf4pf zwthjdL})$-Zt=`Yp|cOa`0;prti6v} zG;uXO`B0&WH|M%KLbFV!-Sb8niYB3EJ=Tz}c&M`@!f&TupxQhC}|ICz9;*6f5^Vt_UJ}2Xu zHcCV#|?7TFoF<6bvajuH`N^B)y2oQGEn&SQPc_G(A^GyFT1OIEwSyw@G-2r`Qp6h_h!2h~(t_#n2Uxe3%|J_K=`+&+2 zkDupy;+bdR%=Lae)7R&D&*dB8tLgBid*;mb4SeRj=k!>P(b@uC)2@8tv&`i3uGsFh zJ?Xt(>Sw@~&feBqcS5Q0V0tR&T%q#yMPKg&Ox|Algvz5;d& z`-q?A?mH;2D{}P-I5%HI;#+<PK?g z>+>9g4-DnKWR8L9cMmgc8{8mBC>7z}Ey;nm9X|Fa&hi+~ z`ZAvFjrS2<@oeUEXD{thzBkI}haemBo}Rod_(MWo`;+q2*ZxHQ2h=fn-p6$peNC?o zc&7J*vyb`p_IO@XBl%Cb&Q?5Tbv$*`OJ}~&{PK%W`1RmbH6Pp#6?<01{)Z&d$B{XH zS?)|e)BSKC;Pxq!ckC0M6;a0dT;DSI7;*eEm1 zMk`LmU)ebCdpjrg^6n#tuWK}9<~Pm8uJmzMfkEkT(q`}3pX}d*FdSuh_!nXWjtaD5 zvweyxw?6;UV8LsXv)_xq@x$DfpZ)gzS3XX*({wm#zv09)lmwhUHp;9%jV4ahAzhj6 zw(QW=+czI~$thz?S}w0uy)0qRRrBk@qwX**-<874C`LpE$iei27$l z`}Bmgq#M)ydo+IXIAozZ1}ew@7001;`xL#^^1@rr>oa5H1s`5nd;k8|-r~1g?o(uG zry6eqw@(rEP&cx#4eCa4QpUDQ-u5Z-X-)h0aAw7*V|kO-qax09$+by+#Aps|4hLf^nnsH2rbY=F>Z`(cE@bC@m z=bhE+(e3U3(kI);Y2O`E3sPP`L!8h{!0BV7%y1gbbWMkJW#a60YV}hZemQ&BxxLTd z*!I3P*ZDZ1@x!U}~f+JjB z5p6nogF13Of#{Pq{bZUtQEec%nD$@h%le?t!P#++**qAA*_W8n43D0UGc<_#x{S{` zG0r0C!5vGpVmiO4&!^b4$n)UXksP0MVYdHo5TlkJ)?RdfVcrelh{=EXXY#}l#b79D zpM_|?8dCB33oWxJ+nHkLp5||<#c-w-&3i@f)R>&P`2KG)Z{stbPh{9U0F%zaPsiWL zUsj7-1-Co7_UBeulcxGC2c~yB*3>aRZTrai+f1L==ZN1f_f^Jo4Jd8?5AN$XL$^D2 z$LDZ+j^ZQT8Z>}ukGoA>ry|g;FUBq|F4-L{;Z25u?!=dKyTLTtr*|5iO z9^*&rVxqlIY#$Wr*j_2Be~|2e+=K<)9}TvOfE&5Jwn>w4<>P+815Ovu_%W0 zXNNX#icj=te?ORF3x~zFk5s#S?vp*@iWAHDoQQi1{n)EeXefp2i~_gM4a00dbFQQE z_mA=SmANhcaT)85>(zqboshPDfVf`D-y6x_Gby68^R4^~3wEIH7K!~zD_*4)7wI6F z=5z}BaX%>9pl!qUNeW<(wi7^seVbi7SrfJyhI{P<`nnGj)*8ZwYa~ss)54paA#M8} z6&5sx&59ReIB3n6Ya9y;E(z<@(q|heEZ7jHgT16fnsHtGM_x*!e+bQb=UT3)oqrJ8 ziJpk?n_OP~VT0}+g}r+~ALQChQ(WV2a_RG)Me}7p#apRixM9@(dzFN9EgjR;vb|sI zadrw`4X=xSeTV377SKMK|3p!TU^~DC$XL*h}A`aZ`pmSIGh%5F-dA=Yz-{83>eSpG( z+sjF#KB044`H#Jtlwlk~_(q{I4v7xKOXFK5-)~OahU@#ol5f_#_rcEQ(7D3dvob&0 zdv7Il%F49=&O;x(Uuf=Mj`|b2G(HjfKRUVu>0b&vXTpYM&?%BWi}s5?Tg&P6&*yqS zripeHhNG?!_bOLD<3O(x8hd+zULMk18>#k;LHbP{-2=4laa9`cBKBzc&w$O}x_Y7g zA9(bIpx**^X?sGm?QyN+n5QQpy?LNBg+`x{G&AQm@GNexg5xaY^ItABl^$iEvGa;T&UiJg2_y<)%6t(1r&i{mn@KLeU}3ey8o{ z5zsd}oyQSZu@n}R1Iv1s7yFBbm&X4N{k72Nwd1b{Un6vBoatzqg#}-RbPzllwmqMw z4%;OCVXX6pZ9B@0W`8l7^%c<B%M`2vHB~AY&;8MD<;BDA{OS!IV{z%H?#cMUl-AMF9FzZcjdtQ zyM#NZAbCDbR|7By+#|*0B>yt-pFVpX+T|2cP94 zf1w$l6nBW@bAKLu)?+r9ocpWs8IB!xhi3UFuiLFCZyd(20W7u#)Z%kR!hW)nmU&C; z81u6HTj05*tu+m>MpcnS__(5?h0~zzeE!D6;_JF!u2|(kjeUhO`GI)4*H%LK?{Jib z9%kQxkRIT|c<--kyQ2JG#~sw$!E2(C8S8;_Rt*2b{B>Prw074@nCbI=mOGqvWCR>m z_M|O;?n>8<0XTS1)kLUB&gXoFjdPMW< zhE;TY=A}oA3h|FX>$Le1wpgnxvtRc}Qw`pYHgzdc&h}Re_xwk?FqQ|OpYyQzJ)v=A zxU!cmIGbXTGk$MacbMBZN>~22PmpunDxZDw(6x#}hVi?j&f%!bLEBq9+Vby#r*Yhc zEnmX<99S)&oc8A9=^JZZkNqpe=MHUy+`dn$qfhV|pZ53j*2Pk8ZO!uUhgGdZkUtN$ z(*s=&7Jmp<>|e^aDA#KmFm$?->^gnNbZ7JSAp zhoyhKtok*D4i)6b2HfRM54Q8<_#=?|0Ia0sK5?wMLu7@>!BRhL?*mYF$7^(1PnjH_ ztAcfhH>c!QTv+)Wja9t`NL>%ErZ`AQlOKnCxi*-`!SY}KnS2bM;d7TbIbwR^f0K_7 zxC0z_f=fIoXZaQf+yyNzPSS&-#m$QI!k}I_!F>FbQ*Ti(!)lADF2CwIn7C# zw)J(!uY%ufw3;^I4r(01j=(R9KNowL&5(W8Bv?v{8kWEAzcyEe=qu4`SZ%*MgSRmL zy&-b;V_ZpMWEh|An`@3r7=VMNXys(~?ZgbwTO!qe)|X7aC3rk|)yZezJj>B0*FD~J zr!^;%6Xk3_w#VAJz7RC!te?wdm$OJ{eZkUS8C;=&oXSz|Y;x|fc7dlc*!6YFiC=eE zbCGZw>`05Rd$>jNyd?Pr*kghFv_*%eVCm})ZILwDe(vseStPEI|Hat=C!Zh4sZ)mn`QFaaTI|aGZxZ+TySB_O~1A zWIUOCHTIah%7s&Yw4+Tv1L@7_E4RP7EX<0@$2qVpq%x;R(4qh zfrI0WjTDyt^@wTtGj|)yOnx2SYQNrTj6(e5m=F%j{~F|Qql9SwBOPt=*JGF5Yn(;_ zWH#1W{B_s?c7uz6*|-4Vd>w5^w)3~s^fZFHRANQ=J_ z(%W2EA~`$rz@tE7pCmN%r+wUClKb59 zs21beo}NOR{ATO|d6R?$GD`aCbNq`3rPxd14%LV`MVu@?caXfA1th~gK8@90_lJ0ZP~v*b85?j)fpC;o@<*1Ad= zJP}t4JuLqH!2@`YU5`aLCCeW~3Y&xbod(mMEVQM6H|%?uZ?fYklK=Y8y{t{L$Zr33EUl3jiP5wggV(=0)wn4fOzu7@n3@3?S73aSN&tetY^9*u_ zUdb1?(yCqJ-$bIgYmc?+>=3e0HFf@Zi<+G-&~p6W_h4y}v@vV;X*ogCIuQ@a+g5 zb#X;jp?r5B_M?n|gLQwJP*M3i7N<-h^*>YB{-c^&mPXSq)35H)HHFr=wLo)4Im-Y( z2U6GXk2V5b3->e(Yl9!tB;6LjYPfrBf^$dw7=v^tp{mGzNmoZV$GJOx)FG`tNfn{l zMwuqVdwX;rkJh^l)zN#4EYTm}=?wJfK|*U@>R)JFy_RdZUN@E2YoOA{dg zjHWZnOTWO=FZ9B7TvvS^!!;cnjfwYUFRuD=s?UCJWl|)x;+-tC>J$sDHc$0v^=vg< z`@YiJ%GHK>UOMbwd_$rY&SnU*d%(;vx%RyUkind@FPnp??5P``Pz@l<*9pe*(=i6KK+v2qx)gLLr+*pfE}$8M zbT_BJ5_B&K&yc-NdwX;rkM1jUrs(8(;rSlj-_sfB(Stpmqda;DXyUp8HVgyJI%2y! z#_5ng*6CacdV~uneZ0_B#77=2bf(aSp3VuL&NwgpL{I-@FZ>kH+%u5veUj55UF>v7 zPjU1a>&KVB^V|=8-+JHErg4@fFe&JtRf?y}+x^FB0S)SAJdBk1id~Yy7`a$eoJnvhD z<~J}u$h)_k?@1OGjLHwn?g8Bo;U&1D> zRXL@Sew`;)<$u$=wEUqiyZUvhb6Ng_vrEhGnv;|FP4Cn4n_fhEbY9;Vr{?#0u~h7D zc2Up#^}9<2*Tkl|33-hv*jV;6p1)unQ$l%i?+!jUJn8W@D2o8}@Uq@_cg^EFrlhma z`l27d3qzeNkGTrpiz$%uzw($SD9;-(SN|X|az6h?p-bbR;+e>KWq0g99r9!HTRf9d zPP*sv^YOgq?XnY|o{6%*48Jd+GaKo zlJJri&Ic&=h6`Vq?ETd@J_ zMdeu`%ZJZ%{W9^(s>j=Fkj{eqyIwsv|DY;6gnqp1y!_i*-7oZGZ;a0`y6k?WxhQ{K zb}WDCyfw(HB>%79kIx_R;&kZD%|D{*y!@iA-y(cY{^O13<-b0c`t$S0)?AwZ&f7bL ze(cfl3HJDQ`u6*{67fd$?w9}4j?YP((dU>O+;i&N&^}fR&1aEAx<4yAkA8GhzOVmI zkGO;<>sZ_%*qo5g7oS~=zBZz4>Xgm-mn^+f=mXkr&Oe~-a>;Ag+kDok`7-WNgI7s7 zpKmT+aI>>>GulR!uOHV>)6eUf`D-Pek`_;(9@in?yfW$g9?f+Wv<=_W%C~;hpuyb< z`TF+w`U6kD+}Zg^7?*v}@0)&~_4m;B_ty5u&!Szqg7@kN^1^;id;D=AX?zGc4y<@@ zF~^F47%`p*%`qS0{qmL%DC2nE@|oLF&i?qY&W(+`(blgLnq!4efBxC3@-IGbD$o9^ zAbo$W9q&{8eYK5G)=TD1k8hva-Ui&qSMOHz{b=&KSE zxGE^#Uzz>1o_h~7U#7{@;QqwSnP+`&$^7|E1?H*WpQ;W`;^AA1JaaEqjf@Q%*Z{U-HCqNsiC^z~5U-8R1H-*Q$t@xPLcuWNIwC=pABvJA-;L)}_D0}qxOe3F<%xy} z=hO8D2xtG{xfW&<_>O!nd1}scZBYF7MJCSr?mhR);#y>$`Fx%CHteJPUR%_j*~0w2 z3%J*T_ABbMwR3;&s5}zOE4f^g`6wUuUXCY3%(IrA_Fvtxp7~fi;5q6KnkRKDwvWX2 z71@~>9@(LIEg!XmCCRaY^~D+@N8H-()GliNk#WKHjL^LzqH&6KPtNSvn{>54_@9>1 zo(A|e6C1gQo3=-uIqq>U1&(k$v#sujA6pL3Y(G5nD-dj-{5k~BT${mjv{wV?JXr4g z$eF7%$g^#6PlznEKc3kN*`6D~ipI#b87ychHq?-3`1>KJCg7VO<$ZDHj&99yZjO|i z;@lJ|G{U()V)NV>DQNutT)cgS-xo0`Z;lu|bH0V?HHMVusD9aEX9pO$Aev^eU~U(l~kkY}1av($K|KSCQ= zs`Ni-ie z-z7=>Q%U@L9^W1M_6`f?PBX~sJ1l&sWESS*A9U*o65lCd{%=Az2fupE8T@8E3Csz~ z+_Mzga~9%n5BC-^-rj-Xa}mD7q6hO+eVv15ddizV`5dID^U~Cxj`Yi9epJijnxF{s zFM)4{%v4_mzK-P2efK#NorAJvdOpuOQT}|9v+gwhxf0*>tKy4qIY^J=_zZcX%I`wx z=*Il(;EA%2mpu2)w)o077fZCfi2p%(HZ~KXTRptS6YpH)Hxo}xOuitrSL>VgsrD0p z2iY5fJZB@7*Rk`%_;rwim5-*+cak(eme(O+{6Nyz zYYOGfF`GeKefM05JTv-VgBTEunyxek>_B&o67kt<1FNddG3r(_z^E# z-etjg$m2GNuly45*UH)-@~fP@GvY5n{8fmXiy!eW5%~pJhjkU=sC+AA#CQaFEpOs| zBVd13z8rYY3Ru4pf0WcO`8ol=n{t%Yukx(#CbClPLdcstIrH~<Hh`!wUzQ!p8ZF^vtWDArTVf3d@v(lDUjcrW_@n#;#J@y%&7b*^ z=XWw`592G(_Hmu8)mbJbrSh4Gzs!qIeabgUecdn5)-HGXF@7QRmxITVaTU_%^)}*{ zN&mgx$%~LO`!BzvLVfbA?~NfpRO(y#M}em~?oIfe1=AlY_J8d7T&z3oA@Xtf&+jnw z7H`>4pZNJ52pq_-uf#V#7d&JBP5!@z_;qnFqThL;et+0U{QPc<@{Qm*2Eo^1{>$Wf z^z|Zt67d^JefvD~*Z5CjRbC@6J$@IXk@%gyyav+0UhKIU>FM=3;yIfa1UEun1>+Uv zyk8=Zd0p_eqHXME5?|%KZ@V>&ulbR$f;CG_pZ8mlob!NM->?Jq zJzMH?1?m`eQt%Z%%nrtZ2!BKJB|%_(#Dv2LhE3 zaB@EPegX1s@*Ry61z*H#eJZ~j@%y3%1FS|d{l2(^)%bn!9PE(Vg*bQS}XOH zkAtrz_pjt@Ie81{^E(`excu3E_#F=NQ*dT{@<#y=c|P<1)X9s2JXu$=4cCUD*!_(4 zLw)kY9X|;AJ4F6IMwH=LWy$pkt@xZjV^1D!0o20)g z|28nslGVB7XQ4bPXa2_X`f)V!yAu6nEqpo3Cxc%D{WDzp#JdLa)xuvd@yV|ZUWfkm zvhE;~ua)&`7C*<0Z{!)D{7Fdv21)-z*ms_+Z6t5_Sij`4W(fGypHluE=$|F|YkcKL zxb#j7$e$r=HQz$~^Id%6eM{_pANF1=YvFb~c@D;t6A_>9oLm0H`-$TzXZ)`{ehTy{ zUo3c*$-0P-!t&Aa{1cB~BnnGuAEp9}nB3 z0Pmd1-fBDtL0KL|^4$!+uZ=K#TVq~X5X2mv2U-vN{)TXF9{{{}EZ@Z7Itrsr-}VQv z@6sU6eq8I|()VcYfe?KIgz@>lE#LKy=x@PC-|nD{I+Qa_qXYMy7KZa(YYm@<=W(_A zYrgW%oujEW#Mu+kx)+M-lg1M<(dT|CM)UnUlvQ4YCH!^@)=y|S_iEr?0MyZU;T5~m z`Yn_o$jh_u^XPlo`b{CyR#qBb51sFmNAIV%M84Ia^E%?T6n(r83jOGP zTi}s=`K~3~x7zSzsH5-6?#$!+n0zl4?~3N}oz2oX-%EW&Xp9&VSKsB-xJH-8GxPbb ztH!Mx(tPJ%!{3#>sITvPek^&ZJvBrJS9Iv;cZB$kXGGVW^w z+AZR08@6;bUrkeKO(&VQG#O5sX)4VjX^7DJ{;7TIsUd8u>*|j0pDL~STKO|yYh$_W zBZ7tJli?wbk*hW5fH_8G#;BWtUlx9RBSZ=gG-t%=r}Ln^3Vu2VTb)62REuTBNLYM* z2bC%Fs20;*lp;Bwec0D$vLK}f4~x%d9rU$%n2faL&o@L*mQj_V$R|cmHj3X2_;l^6 zhMJ`oU*B=%sH_L(q+_Hke|~!=lJa}qdRTmY2UWx9quXKf{oz};c7e5Vrk~8i2_h!e|{v&A1GZ#W($ zVf2|*8sX;~vT_#(SyTKPiDs03HfGjL&Zl4gC! z2f*87xE_rwq|f*F^gTdov=lYg7vtkz0@k;2Z~f6a`%XnGC+=I?rodM{;o)& zo0Deae1M}Z{{xY}$+fgq!Q_Xc{0?_c z9O2`ab^6N6Y*omL>Dl7*9qi~WX4Vd7Lvfh=0BJLvE!B4eR2s=C$-vv8oQXIXzfNBL zv3&W4?_ivHMD0Z5b9@{M`9P8K-yuM&hvDZtyaQ#WIK!C&N7*R{uGAZ$?;q@X zh}k~^chI<}2#@6U!6!FW!na#FIw#`y-f)#P=%ey5`}htlzrUnM=O8OaNo1ce@=r&O zXmru*gN-OGE2DJ`R!tpGHBBA4HC)G14c9SK!|O>p8m`wOrK3{Qey$eUc%^Z*?W?|y zGaAluO`o{gJLr6dXnk2}9a)st@lI(iZ>6)vHa>&4exl*p`}7%&wr>q@4?Wfn+X-uh zHn2}>8`0NY`gRRz?Q5#9eMadcAY%^H>4Bd<&(-%>_|%&9&>ufa zNDsu1t8aKcIvPKQlRj2xu22Zv`-)uK61Xu;=~3XBKI`WM{K%2kcT4o09L#G#gDY}^ zpa?(OMtXwKnYe#=A| zv<|y|ezZQjW&SN#!(AGG32U7n&Er}_`rLk+3tIdn=^wd#bN-RbKM|dl&)k}SOU640 zA5pgAw>y#VFL_*tT^j!^pFX+NEu*e+WERJnqIJ#zr&y!6*-I?t&TFb!x!JZMtPtMOzZ%@zK_tu_N z`Tkyh{xfj1Bg&8U$PvKSM(DG1`pLw{)e+RClxt$5H5OWK)ujF^K6_^@y`o2JYPi0F zWy~|v<1>4%j3Cdn>2-5GDAP>FlM1)tv9spN(UrDx{LnQqwvHn?T|XYz05P7f0rJ;u z=vo)9AhC4(cz!?7XX-&l5t{Y&nB(#J7nAsZC-L?@4~~kx@eIn=6tGk{GtNAj-bTpz zOpJ408ZDsi#f!|`%-%~J&tr8gChJ`=8XR)u;j3t zI=-oV|3trUL3va7T+GkXZ;I$@2Ruwx)u7 z4*u?Uz81g5t#VDT6Zk_VzFuEh9{e7Qervl5^5^$$a)OwA&!%q3H<$0Hkk1skKJzEv z(DA%Z)ED`_h~H4kJL0*9NaegLP|o|M244Cs5AxM;7eP6F1Yb`3RZjbw%e~fqVSKJ} zVL#wAXSJVmun|94%3Jxyh(B07J=(AO_?kNOeV*6p_MyBlETVtSXB>SHKPGdM%C`rv z@qM2DNHft_Ij?`@`@8tePkG7*$$ef6$Ok!j8<#&$(m&WAXpiyi5Bxrf@$3)1J)Y(H zisM*VfrT6=C;vwHx%0Ex; z1&4>}-74c1?Wa5!PpfFJ@hneEU*ivwyEV!ONqRA{m+2dy4MSC~_0bmm!H_S72gLN5 z9{FYPxX5!&fiI`M%Cmp1kTnDRGLXgR{S4(RP#)}G{9cXny`=xp{zF9G3%&9-$&c|@ z;C>|+drP3qaYw-TDrbJm)1E8D>+cS&tDL-@kitCnHZ^qI_!W+f9e0!q)x%^cI`*s z^w=>zPU5g5HBSBhiPMwsWe{HwMBhJAKK%X%Wd8R;6u-u=Je>OsoBZ{c{cd_b`_o67 ze>m;czxp^?W_F~)3AubPgL=S|fRi%T6>(CQOfwD+30Jc6aDM#hD?4{Q{*Q(o*Y7T(L@1La{)A!gv=gq$8#ezrw zx+Uj}ZHp)F{%>a=C&xvLl&U`M`zMOczJC%IoYD7B;{7wiZ-n@CZvRM!Ws}@)4ZW7J za{OO$97^~7lV;7=HNE?zlJ7UY|CcSzzPV$rkCWd&Nry9V-#?Lh3cr7%I4RS%8uz|` z;?u-tI(x#I6(cGuW72w5#F=iq?fT%lcODw~?s5N|-0P%CS8saM$4S2;9Zs}6`CbNb z;^)2#qBtotoRn3h(Vjz{%Eh^@?jeouKlijFK7Hf0*>~qpINQg`@1LZ@N&DG9i4$d= zfYZlDnc<9REgKE5T%12O9a*!(p(nmr^i{(zCq4Fbj*pXmM>?Fe*>K|e@4gG7^%>!b zhu=J*k6_*!n$Kj~zDC@Y3E#0KBj-jhF+&QJJd*5)Z! zcX_Jyvwt6Z)0L&)wDEB=?Q}S4zu}~>TD8lsc($N8eQcB&&WM(F>tU`uoMSo^zSR4d z8}im(`r`e^f4u)>A1D3zbU10V;f(xv#Tns=dw#r6i$9bK=b!4w7hm-9yd&pzTitZp z=AE~1nsc*{lYV?A8x9WQ_3M}6{6&5|v8f-A-~qhPHXoh5`SCu@dN&zfI@I*ZAbSm%ELf_+ImeZ&)#E@~1<5ob=<<;UqS#Pt=q1<6(&4G#{P3eaFzJ z6`T3-ET?3gSuyDE70z`1bJ)}W`L$2REn82Tc=X7feLCIdO!%JY~r=ahlGa>oY5cxPJ=HCrgL^{KBrDrwsYD!w-{w&P?!!=*OqSN&5{aOiIA% zW24M)8cl4bQ`tC&op(v@+fN0%Z$I<<+8s}OJz;)`etbHdwApaNR`G8U=Gtw9&3t#t zj8<&^eN5%G+gQnqX%8XWQ=EqlVea?U2 z?EUh(#8!5{rSsS}n~O4hoV;$O!%3SXoa)CLPQ#34Q`GrpIZ1ytG^K`y!kXHimiaR%pfP`}&nP4jp{iXZ>4Fda}ph!wUv( ze(U46{Q9i27dUBuRG;d{8%`e^>Ndn_v}?B^=E@w0GKXK@arLU&TgFX2{;-qJX?}u_ zlYUva?Jb3`8esvr^88` ztv=0av~CmHZSZH##~;1wvoo`=?%8s8=4q=IJ#h0fA1D2Iwp||P zOY_Xb`mXu$2*Ma^^YOVd-bOxpZs^Ce%_jKtG4*dXege)|wHQKiSl-I<{~!0`zwAC{ z{k*4o)_b|z!;`-IV8SpTC;j+zIL(ho<^xbS;`b2??^n!^CvSedPcx3`D4mQmD~9mB z!kNyG|De;BSI#`{i^Vt8>3Y>IwKqNK}U+Lon%)P*=e!Qz2`<^q}AlD~E*dTXv)+~d_r#Br0A-wX&p_5L+mA1CceSD)1J>eJ1~hwV1R20YG>l`% z_GvR@ppTQ+t#mkPe}vQK8G{dGfp|r8Or5pH(G1rj0$ceNRZ8TlwP!nBh?{nV! zzwiIvOTDalJlpX+=f3aZ{(t9r&pFS1xyacl$AVL8a1y^{HqXyb_myT^og23t3U1qY zyr^s*=R_9JbIKeq>!kU3;#6#Cr)!loww&2aKNq=&ZCkMU*C&2EUsd?s%%POvFXnd6BQZRDq53ee!BK4$y*&X#YT zO>MsqynQq*{Ql1VIowZy*$qybkH_^T=i?QpVnZ7-la`!3>zg-j`?w0)ilSoSM;mGBA^#j>9;a>C`lMZ_zD^n$ANTatnyj&$ zli$xtV~d5JpQu@J${bIe#3R{c*5w+U)Cbzk>vQ}QwVw!VL3|ZYYbmlqE2^O87 z;`;J(ita}4Q=EzoZR9O!$;q?6d4AeIxxMrGyw|Pq@17sDs@JIc1&_tbPOI6AJp*3kw3Vf$niQ()K8q0K>Ss^u=v*+)XC4eWUdM_0 ziBp_wA5PAOHsT}=HtJ(GXXvuzD=yclspl_O&Ue`3mT*6j<8_>p^Tx4^goAr$r+2OzlsuVpBFF1E!KOGV$4gF?(H-#3$nm&7NlQQX zd-J`SGLS!_ec=7h_qLqGb7A8{%+@uMcN`>mmI3}-g;`h3Q6X~V#+BWlmi$%w9YTTXJ$ zp55R?{mM_u@!oOkWfQ&yXgW6!W86BX#?++U>xj5e{bggty$cgLC$g>HPnqLUGgkgw z;cRFlKS^UteW1=43(amEWYxnS&c x@sH)&k*MqaQ_n0sdGv?K(); - agent.speed = moveSpeed; - - // Lưu lại vị trí ban đầu để làm tâm của khu vực tuần tra - startPosition = transform.position; + rb = GetComponent(); + // Tự động tìm các điểm tuần tra nếu chưa gán + if (patrolPoints == null || patrolPoints.Length == 0) + { + patrolPoints = GameObject.FindGameObjectsWithTag("PatrolPoint") + .Select(go => go.transform).ToArray(); + } nextShootTime = Time.time + Random.Range(minShootDelay, maxShootDelay); + InitBehaviorTree(); - FindPlayer(); + StartCoroutine(FindTargetWithDelay(0.1f)); // Chạy FOV quét mục tiêu } private void Update() { - // Nếu mất reference (Player chết hoặc chưa spawn), liên tục tìm lại - if (player == null) + if (player == null) FindPlayer(); + if (Input.GetMouseButtonDown(0) && canSeePlayer && !isDodging && Time.time >= nextDodgeTime) { - FindPlayer(); + StartCoroutine(DodgeRoutine()); } - - // Chỉ chạy AI nếu đã tìm thấy player (hoặc bạn có thể cho tuần tra ngay cả khi chưa có player tùy logic game) + if (isDodging) return; behaviorTreeRoot?.Evaluate(); } private void FindPlayer() { GameObject playerObj = GameObject.FindGameObjectWithTag("Player"); - if (playerObj != null) + if (playerObj != null) player = playerObj.transform; + } + + // Coroutine tối ưu việc quét mục tiêu + private IEnumerator FindTargetWithDelay(float delay) + { + while (true) { - player = playerObj.transform; + yield return new WaitForSeconds(delay); + FindVisibleTargets(); + } + } + + private void FindVisibleTargets() + { + canSeePlayer = false; + Collider[] colliders = Physics.OverlapSphere(transform.position, viewRadius, targetLayerMask); + + foreach (var col in colliders) + { + Transform target = col.transform; + Vector3 direction = (target.position - transform.position).normalized; + + float angle = Vector3.Angle(transform.forward, direction); + + // Nếu nằm trong góc nhìn + if (angle < viewAngle / 2) + { + float distanceToTarget = Vector3.Distance(transform.position, target.position); + + // Nếu không có vật cản che khuất + if (!Physics.Raycast(transform.position, direction, distanceToTarget, obstacleLayerMask)) + { + canSeePlayer = true; + isInvestigating = true; + lastKnownPlayerPosition = target.position; + + Debug.DrawLine(transform.position, target.position, Color.blue, 0.1f); + break; // Thấy player rồi thì dừng vòng lặp + } + } } } private void InitBehaviorTree() { - // Player có artifact -> focus + shoot + // 1. Cầm Artifact -> Đứng bắn var laserSequence = new Sequence(new List { new TaskNode(CheckHasArtifact), new TaskNode(ActionFocusAndShoot) }); - // Thấy player -> chạy tới + // 2. Thấy Player -> Đuổi theo var chaseSequence = new Sequence(new List { new TaskNode(CheckCanSeePlayer), new TaskNode(ActionMoveToPlayer) }); - // Không thấy ai -> Tuần tra bằng NavMesh + // 3. Mất dấu Player -> Đi tới vị trí cuối cùng để điều tra + var investigateSequence = new Sequence(new List + { + new TaskNode(CheckShouldInvestigate), + new TaskNode(ActionInvestigate) + }); + + // 4. Không có gì -> Tuần tra theo điểm var patrolNode = new TaskNode(ActionPatrol); behaviorTreeRoot = new Selector(new List { laserSequence, chaseSequence, + investigateSequence, patrolNode }); } @@ -109,22 +169,12 @@ public class EnemyAI : MonoBehaviour private NodeState CheckCanSeePlayer() { - if (player == null) return NodeState.Failure; + return canSeePlayer ? NodeState.Success : NodeState.Failure; + } - float distance = Vector3.Distance(transform.position, player.position); - - if (distance <= detectRange) - { - if (!hasSpottedPlayer) - { - hasSpottedPlayer = true; - AudioManager.Instance?.Play(alertSound, position: transform.position); - } - return NodeState.Success; - } - - hasSpottedPlayer = false; // Reset nếu player ra khỏi tầm mắt - return NodeState.Failure; + private NodeState CheckShouldInvestigate() + { + return isInvestigating ? NodeState.Success : NodeState.Failure; } #endregion @@ -133,32 +183,19 @@ public class EnemyAI : MonoBehaviour private NodeState ActionPatrol() { - // Debug.Log("Patrolling..."); - if (!agent.isActiveAndEnabled || !agent.isOnNavMesh) return NodeState.Failure; + if (patrolPoints.Length == 0) return NodeState.Failure; - agent.isStopped = false; // Đảm bảo NPC được phép di chuyển - agent.speed = moveSpeed * 0.5f; // Đi dạo nên đi chậm lại một chút + Debug.Log("Patrolling..."); + agent.isStopped = false; + agent.speed = moveSpeed; - // Kiểm tra xem NPC đã đến điểm đích chưa - if (!agent.pathPending && agent.remainingDistance <= agent.stoppingDistance) + // Đi tới điểm tuần tra hiện tại + agent.SetDestination(patrolPoints[currentPatrolIndex].position); + + // Nếu đã tới nơi, chuyển sang điểm tiếp theo + if (agent.remainingDistance <= agent.stoppingDistance && !agent.pathPending) { - currentWaitTime += Time.deltaTime; - - // Chờ một lúc rồi mới chọn điểm mới - if (currentWaitTime >= patrolWaitTime) - { - // Tìm một điểm ngẫu nhiên trong bán kính cho trước - Vector3 randomDirection = Random.insideUnitSphere * patrolRadius; - randomDirection += startPosition; - NavMeshHit hit; - - // Đảm bảo điểm ngẫu nhiên nằm trên bề mặt NavMesh hợp lệ - if (NavMesh.SamplePosition(randomDirection, out hit, patrolRadius, 1)) - { - agent.SetDestination(hit.position); - } - currentWaitTime = 0f; - } + currentPatrolIndex = (currentPatrolIndex + 1) % patrolPoints.Length; } return NodeState.Running; @@ -168,39 +205,48 @@ public class EnemyAI : MonoBehaviour { if (player == null) return NodeState.Failure; - // Debug.Log("Chasing Player"); - - if (!agent.isActiveAndEnabled || !agent.isOnNavMesh) return NodeState.Failure; - + Debug.Log("Chasing Player..."); agent.isStopped = false; - agent.speed = moveSpeed; // Phục hồi tốc độ rượt đuổi + agent.speed = chaseSpeed; agent.SetDestination(player.position); return NodeState.Running; } + private NodeState ActionInvestigate() + { + Debug.Log("Investigating last known position..."); + agent.isStopped = false; + agent.speed = moveSpeed; + + agent.SetDestination(lastKnownPlayerPosition); + + // Nếu đi tới nơi mà vẫn không thấy player -> Hủy điều tra, quay về tuần tra + if (agent.remainingDistance <= agent.stoppingDistance && !agent.pathPending) + { + isInvestigating = false; + return NodeState.Success; + } + + return NodeState.Running; + } + private NodeState ActionFocusAndShoot() { if (player == null) return NodeState.Failure; - // Debug.Log("Focus and Shoot!"); + agent.isStopped = true; // Đứng lại để bắn - if (!agent.isActiveAndEnabled || !agent.isOnNavMesh) return NodeState.Failure; - - // Dừng NavMeshAgent lại để đứng bắn, tránh bị trượt - agent.isStopped = true; - - // Focus player + // Xoay người về phía player Vector3 dir = player.position - transform.position; dir.y = 0f; - if (dir != Vector3.zero) { Quaternion targetRotation = Quaternion.LookRotation(dir); transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, rotateSpeed * Time.deltaTime); } - // Shoot with random delay + // Bắn if (Time.time >= nextShootTime) { ShootLaser(); @@ -214,9 +260,67 @@ public class EnemyAI : MonoBehaviour { if (laserPrefab == null || firePoint == null) return; Instantiate(laserPrefab, firePoint.position, firePoint.rotation); - AudioManager.Instance?.Play(shootSound, position: transform.position); - // Debug.Log("Laser Shot!"); + Debug.Log("Laser Shot!"); } #endregion + #region DODGE MECHANIC + + private IEnumerator DodgeRoutine() + { + Debug.Log("Dodging!"); + isDodging = true; + nextDodgeTime = Time.time + dodgeCooldown; + + // 1. Tắt AI tìm đường để Vật lý tiếp quản + agent.enabled = false; + rb.isKinematic = false; // Đảm bảo Rigidbody có thể nhận lực + + // 2. Tính toán hướng né: Random nhảy sang Trái hoặc Phải + int randomDirection = Random.Range(0, 2) == 0 ? -1 : 1; + + // Lấy vector hướng ngang của NPC nhân với trái (-1) hoặc phải (1) + Vector3 dodgeDir = transform.right * randomDirection; + + // Có thể cộng thêm một chút lực nhảy lên (trục Y) nếu muốn NPC hơi nảy lên + // dodgeDir.y = 0.5f; + + // 3. Tác dụng lực đẩy tức thời (Impulse) + rb.AddForce(dodgeDir * dodgeForce, ForceMode.Impulse); + + // 4. Chờ NPC văng đi trong thời gian chỉ định + yield return new WaitForSeconds(dodgeDuration); + + // 5. Thắng gấp (Dừng toàn bộ gia tốc vật lý lại) + // Lưu ý: Unity 6 dùng linearVelocity thay vì velocity như các bản cũ + rb.linearVelocity = Vector3.zero; + rb.angularVelocity = Vector3.zero; + + // 6. Bật lại AI tìm đường + rb.isKinematic = true; // Trả lại Rigidbody về trạng thái không ảnh hưởng vật lý + agent.enabled = true; + + isDodging = false; + } + + #endregion + // Vẽ FOV trên Scene để dễ debug + private void OnDrawGizmosSelected() + { + Gizmos.color = Color.white; + Gizmos.DrawWireSphere(transform.position, viewRadius); + + Vector3 viewAngleA = DirFromAngle(-viewAngle / 2); + Vector3 viewAngleB = DirFromAngle(viewAngle / 2); + + Gizmos.color = Color.yellow; + Gizmos.DrawLine(transform.position, transform.position + viewAngleA * viewRadius); + Gizmos.DrawLine(transform.position, transform.position + viewAngleB * viewRadius); + } + + private Vector3 DirFromAngle(float angleInDegrees) + { + angleInDegrees += transform.eulerAngles.y; + return new Vector3(Mathf.Sin(angleInDegrees * Mathf.Deg2Rad), 0, Mathf.Cos(angleInDegrees * Mathf.Deg2Rad)); + } } \ No newline at end of file