From f970c7819207ffd8c174584276c7f3efb31b41e6 Mon Sep 17 00:00:00 2001 From: manhduyhoang90 Date: Thu, 4 Jun 2026 15:41:01 +0700 Subject: [PATCH] Update NPC: Nav, find Player --- Assets/Scenes/Cho môn AI/Only AI.meta | 8 + Assets/Scenes/Cho môn AI/Only AI.unity | 209 +++++++++++++++--- .../Only AI/NavMesh-NavManager.asset | Bin 0 -> 83176 bytes .../Only AI/NavMesh-NavManager.asset.meta | 8 + Assets/Scripts/AI NPC/EnemyAI.cs | 133 ++++++----- ProjectSettings/NavMeshAreas.asset | 8 +- 6 files changed, 280 insertions(+), 86 deletions(-) create mode 100644 Assets/Scenes/Cho môn AI/Only AI.meta create mode 100644 Assets/Scenes/Cho môn AI/Only AI/NavMesh-NavManager.asset create mode 100644 Assets/Scenes/Cho môn AI/Only AI/NavMesh-NavManager.asset.meta diff --git a/Assets/Scenes/Cho môn AI/Only AI.meta b/Assets/Scenes/Cho môn AI/Only AI.meta new file mode 100644 index 00000000..2334a3f2 --- /dev/null +++ b/Assets/Scenes/Cho môn AI/Only AI.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7f8aea511f659ac4dad9a6c8d60dfc59 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scenes/Cho môn AI/Only AI.unity b/Assets/Scenes/Cho môn AI/Only AI.unity index 56434590..13ed3f3b 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: 1408989034} m_Modifications: - target: {fileID: -8789529727683405701, guid: b96d0fcc541b0b947907dd08b9f5beab, type: 3} propertyPath: notificationText @@ -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,43 @@ 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 &258369249 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 258369250} + m_Layer: 0 + m_Name: _MANAGER + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &258369250 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 258369249} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 10.00109, y: 1.17286, z: 15.33649} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1892936536} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &282447033 GameObject: m_ObjectHideFlags: 0 @@ -42218,7 +42255,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 333057065} serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 3.62463, y: 13.27338, z: -19.50002} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 @@ -42268,7 +42305,7 @@ Transform: - {fileID: 375187854} - {fileID: 1061793569} - {fileID: 1398230979} - m_Father: {fileID: 0} + m_Father: {fileID: 1408989034} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &333831099 GameObject: @@ -42650,12 +42687,12 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 348410791} serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 5.7248, y: 1.5, z: -32.50002} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] - m_Father: {fileID: 0} + m_Father: {fileID: 1408989034} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &365978100 GameObject: @@ -85097,7 +85134,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 0} + m_TransformParent: {fileID: 1408989034} m_Modifications: - target: {fileID: 5687887011233860168, guid: 15df559ce497e104a81254e0adf3107e, type: 3} propertyPath: m_Layer @@ -85121,15 +85158,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 @@ -85159,6 +85196,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 @@ -85343,7 +85385,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 0} + m_TransformParent: {fileID: 1408989034} m_Modifications: - target: {fileID: -8789529727683405701, guid: b96d0fcc541b0b947907dd08b9f5beab, type: 3} propertyPath: notificationText @@ -85379,7 +85421,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 @@ -85426,6 +85468,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 @@ -88453,7 +88500,7 @@ Transform: m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] - m_Father: {fileID: 0} + m_Father: {fileID: 1408989034} m_LocalEulerAnglesHint: {x: 90, y: -90, z: 0} --- !u!114 &678938551 MonoBehaviour: @@ -102350,7 +102397,7 @@ RectTransform: m_Children: - {fileID: 1007024365} - {fileID: 292895766} - m_Father: {fileID: 0} + m_Father: {fileID: 1408989034} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -128666,12 +128713,12 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1098531124} serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: -16.49995, y: 10.56881, z: 19.27294} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] - m_Father: {fileID: 0} + m_Father: {fileID: 1408989034} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1143870345 GameObject: @@ -135446,6 +135493,47 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1398230978} m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1408989033 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1408989034} + m_Layer: 0 + m_Name: _SCENE + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1408989034 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1408989033} + 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: + - {fileID: 678938550} + - {fileID: 333057066} + - {fileID: 1098531126} + - {fileID: 348410792} + - {fileID: 963322862} + - {fileID: 1793734345} + - {fileID: 628283018} + - {fileID: 241771775} + - {fileID: 1813306720} + - {fileID: 572767393} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1453277286 GameObject: m_ObjectHideFlags: 0 @@ -141009,12 +141097,12 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1793734342} serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + 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: 0} + m_Father: {fileID: 1408989034} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1001 &1813306719 PrefabInstance: @@ -141022,7 +141110,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 0} + m_TransformParent: {fileID: 1408989034} m_Modifications: - target: {fileID: -8789529727683405701, guid: b96d0fcc541b0b947907dd08b9f5beab, type: 3} propertyPath: notificationText @@ -141058,7 +141146,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 @@ -141105,6 +141193,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 @@ -141780,6 +141873,70 @@ Transform: m_Children: [] m_Father: {fileID: 333057066} m_LocalEulerAnglesHint: {x: 0, y: 45, z: 0} +--- !u!1 &1892936535 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1892936536} + - component: {fileID: 1892936537} + m_Layer: 0 + m_Name: NavManager + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1892936536 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1892936535} + 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: 258369250} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1892936537 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1892936535} + 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: 8204ba29e85cfee47bf2cdd081e429f4, type: 2} + m_BuildHeightMesh: 0 --- !u!43 &1951987860 Mesh: m_ObjectHideFlags: 0 @@ -144775,13 +144932,5 @@ Transform: SceneRoots: m_ObjectHideFlags: 0 m_Roots: - - {fileID: 678938550} - - {fileID: 333057066} - - {fileID: 1098531126} - - {fileID: 348410792} - - {fileID: 963322862} - - {fileID: 1793734345} - - {fileID: 628283017} - - {fileID: 241771774} - - {fileID: 1813306719} - - {fileID: 572767392} + - {fileID: 1408989034} + - {fileID: 258369250} diff --git a/Assets/Scenes/Cho môn AI/Only AI/NavMesh-NavManager.asset b/Assets/Scenes/Cho môn AI/Only AI/NavMesh-NavManager.asset new file mode 100644 index 0000000000000000000000000000000000000000..55574413bf7191945420b5339912765d02589352 GIT binary patch literal 83176 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 + 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; + nextShootTime = Time.time + Random.Range(minShootDelay, maxShootDelay); InitBehaviorTree(); + FindPlayer(); } - - 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) + { + FindPlayer(); + } + + // 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) behaviorTreeRoot?.Evaluate(); } + private void FindPlayer() + { + GameObject playerObj = GameObject.FindGameObjectWithTag("Player"); + if (playerObj != null) + { + player = playerObj.transform; + } + } + private void InitBehaviorTree() { // Player có artifact -> focus + shoot @@ -54,14 +83,14 @@ public class EnemyAI : MonoBehaviour new TaskNode(ActionMoveToPlayer) }); - // Không thấy ai -> scan - var scanNode = new TaskNode(ActionRotationScan); + // Không thấy ai -> Tuần tra bằng NavMesh + var patrolNode = new TaskNode(ActionPatrol); behaviorTreeRoot = new Selector(new List { laserSequence, chaseSequence, - scanNode + patrolNode }); } @@ -69,18 +98,14 @@ public class EnemyAI : MonoBehaviour private NodeState CheckHasArtifact() { - return playerHasArtifact - ? NodeState.Success - : NodeState.Failure; + return playerHasArtifact ? NodeState.Success : NodeState.Failure; } private NodeState CheckCanSeePlayer() { - if (player == null) - return NodeState.Failure; + if (player == null) return NodeState.Failure; - float distance = - Vector3.Distance(transform.position, player.position); + float distance = Vector3.Distance(transform.position, player.position); if (distance <= detectRange) { @@ -94,66 +119,74 @@ public class EnemyAI : MonoBehaviour #region ACTIONS - private NodeState ActionRotationScan() + private NodeState ActionPatrol() { - Debug.Log("Scanning..."); + Debug.Log("Patrolling..."); + 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 - transform.Rotate( - Vector3.up, - rotateSpeed * Time.deltaTime); + // Kiểm tra xem NPC đã đến điểm đích chưa + if (!agent.pathPending && agent.remainingDistance <= agent.stoppingDistance) + { + 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; + } + } return NodeState.Running; } private NodeState ActionMoveToPlayer() { - if (player == null) - return NodeState.Failure; + if (player == null) return NodeState.Failure; Debug.Log("Chasing Player"); - - Vector3 dir = - (player.position - transform.position).normalized; - - transform.position += - dir * - moveSpeed * - Time.deltaTime; + + agent.isStopped = false; + agent.speed = moveSpeed; // Phục hồi tốc độ rượt đuổi + agent.SetDestination(player.position); return NodeState.Running; } private NodeState ActionFocusAndShoot() { - if (player == null) - return NodeState.Failure; + if (player == null) return NodeState.Failure; + + Debug.Log("Focus and Shoot!"); + + // Dừng NavMeshAgent lại để đứng bắn, tránh bị trượt + agent.isStopped = true; // Focus player - Vector3 dir = - player.position - transform.position; - + 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, - 5f * Time.deltaTime); + Quaternion targetRotation = Quaternion.LookRotation(dir); + transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, rotateSpeed * Time.deltaTime); } // Shoot with random delay if (Time.time >= nextShootTime) { ShootLaser(); - - nextShootTime = - Time.time + - Random.Range(minShootDelay, maxShootDelay); + nextShootTime = Time.time + Random.Range(minShootDelay, maxShootDelay); } return NodeState.Running; @@ -161,14 +194,8 @@ public class EnemyAI : MonoBehaviour private void ShootLaser() { - if (laserPrefab == null || firePoint == null) - return; - - Instantiate( - laserPrefab, - firePoint.position, - firePoint.rotation); - + if (laserPrefab == null || firePoint == null) return; + Instantiate(laserPrefab, firePoint.position, firePoint.rotation); Debug.Log("Laser Shot!"); } diff --git a/ProjectSettings/NavMeshAreas.asset b/ProjectSettings/NavMeshAreas.asset index 3b0b7c3d..4031b4b7 100644 --- a/ProjectSettings/NavMeshAreas.asset +++ b/ProjectSettings/NavMeshAreas.asset @@ -69,9 +69,9 @@ NavMeshProjectSettings: cost: 1 - name: cost: 1 - m_LastAgentTypeID: -887442657 + m_LastAgentTypeID: -334000983 m_Settings: - - serializedVersion: 2 + - serializedVersion: 3 agentTypeID: 0 agentRadius: 0.5 agentHeight: 2 @@ -84,7 +84,9 @@ NavMeshProjectSettings: cellSize: 0.16666667 manualTileSize: 0 tileSize: 256 - accuratePlacement: 0 + buildHeightMesh: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 debug: m_Flags: 0 m_SettingNames: