2-12 Player Pathfinding To Enemies
本章要介紹製作Player走到Enemy面前的方法,大家可以參考2-9 Make Enemies Pathfind To Player
基本上,原理是一樣的,所以就不多做額外的說明啦!首先,當然要將Player新增Nav Mesh Agent跟AI Character Control兩個組件。
再來修改PlayerMovement.cs,其原理大致上是建立一個Empty GameObject名為WalkTarget,然後將WalkTarget設置到偵測滑鼠點擊的位置,並由Nav Mesh Agent自動導航到此處。相比過去舊的寫法,這方式可以自動尋徑繞過建築物。
接著程式碼上菜!註解自己看吧!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | using System; using UnityEngine; using UnityEngine.AI; using UnityStandardAssets.Characters.ThirdPerson; [RequireComponent( typeof (NavMeshAgent))] [RequireComponent( typeof (AICharacterControl))] [RequireComponent( typeof (ThirdPersonCharacter))] public class PlayerMovement : MonoBehaviour { [SerializeField] float walkMoveStopRadius = 0.2f; [SerializeField] float attackMoveStopRadius = 5f; ThirdPersonCharacter theThirdPersonCharacter = null ; CameraRaycaster cameraRaycaster = null ; Vector3 clickPoint; AICharacterControl aiCharacterControl = null ; GameObject walkTarget = null ; private void Start() { cameraRaycaster = Camera.main.GetComponent<cameraraycaster>(); theThirdPersonCharacter = GetComponent<thirdpersoncharacter>(); aiCharacterControl = GetComponent<aicharactercontrol> (); // 自動在場景中新增GameObject walkTarget = new GameObject ( "WalkTarget" ); cameraRaycaster.notifyMouseClickObservers += ProcessMouseMovement; } private void ProcessMouseMovement(RaycastHit raycastHit, int layerHit){ const int walkable = 8, enemy = 9; switch (layerHit) { case walkable: // 取得滑鼠點擊到的位置,並把WalkTarget設置在那裡 walkTarget.transform.position = raycastHit.point; // 追蹤WalkTarget aiCharacterControl.SetTarget (walkTarget.transform); GetComponent<navmeshagent> ().stoppingDistance = walkMoveStopRadius; break ; case enemy: // 取得滑鼠點擊到的GameObject GameObject enemyObejct = raycastHit.collider.gameObject; // 追蹤Enemy aiCharacterControl.SetTarget (enemyObejct.transform); GetComponent<navmeshagent> ().stoppingDistance = attackMoveStopRadius; break ; default : print ( "Unexpected layer found." ); break ; } } void OnDrawGizmos(){ //繪製移動路徑 Gizmos.color = Color.black; Gizmos.DrawLine (transform.position, clickPoint); Gizmos.DrawSphere (clickPoint, 0.1f); //繪製攻擊範圍 Gizmos.color = new Color(255f, 0f, 0f, 0.5f); Gizmos.DrawWireSphere (transform.position, attackMoveStopRadius); } } </navmeshagent></navmeshagent></aicharactercontrol></thirdpersoncharacter></cameraraycaster> |
留言
張貼留言