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自動導航到此處。相比過去舊的寫法,這方式可以自動尋徑繞過建築物。
接著程式碼上菜!註解自己看吧!
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();
theThirdPersonCharacter = GetComponent();
aiCharacterControl = GetComponent ();
// 自動在場景中新增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 ().stoppingDistance = walkMoveStopRadius;
break;
case enemy:
// 取得滑鼠點擊到的GameObject
GameObject enemyObejct = raycastHit.collider.gameObject;
// 追蹤Enemy
aiCharacterControl.SetTarget (enemyObejct.transform);
GetComponent ().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);
}
}

留言
張貼留言