调整敌人的大小以及血条的位置,设置好后将其Override
转到groundfloor,将下面的400子物体的Tag设置为floor
点击windows/AI/Navigation,选中这些物体,将它们Navigation.Static勾选后,再Bake好后,生成一个导航网格的地面,这样可以控制AI在上面移动。如下图所示:
在Enemy_01上添加Nav Mesh Agent组件(Nav Mesh Agent 组件可帮助您创建在朝目标移动时能够彼此避开的角色。代理 (Agent) 使用导航网格来推断游戏世界,并知道如何避开彼此以及其他移动障碍物。寻路和空间推断是使用导航网格代理的脚本 API 进行处理的。)
编写一个C#脚本,将其命名为Ryun_EnemyController,并将其赋给Enemy_01,具体代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class Ryun_EnemyController : MonoBehaviour
{
public NavMeshAgent enemyAgent;//编写一个NavMeshAgent 类型的enemyAgent对象
public GameObject player;//声明一个Player对象
public GameObject wayPointParent;//声明一个wayPointParent,这里场景中已经创建了一个wayPointParent以及它的子物体wayPoint,后面要将该物体拖给该公有变量
public Transform[] wayPoints;//声明一个Transform[]的数组类型
public int nextIndex = 0;//设置数组初始索引值为0
public float mindistance = 10;//设置一个检测玩家的最小距离
public Ryun_PlayerController PlayerController;//声明一个Ryun_PlayerController类型的变量
// Start is called before the first frame update
void Start()
{
PlayerController = GameObject.FindObjectOfType<Ryun_PlayerController>();//让其获取其组件
enemyAgent = this.GetComponent<NavMeshAgent>();//让其获取NavMeshAgent的组件
player = GameObject.FindGameObjectWithTag("Player");//这里我们已经将玩家的Tag设为了“Player”
enemyAgent.destination = player.transform.position;
//设置enemyAgent.destination为玩家所在的position
if (wayPointParent)//如果wayPointParent为true
{
wayPoints = wayPointParent.GetComponentsInChildren<Transform>();
//让wayPoints获取wayPointParent下的含Transform组件的物体
SetNextPoint();//调用SetNextPoint函数
}
}
// Update is called once per frame
void Update()
{
if (!enemyAgent.pathPending && enemyAgent.remainingDistance < 0.5f) {
SetNextPoint();//调用寻迹函数进行巡逻
}
if (Vector3.Distance(enemyAgent.transform.position, PlayerController.transform.position) < mindistance)//用于检测玩家靠近后自动追踪
{
enemyAgent.destination = PlayerController.transform.position;
}
else {
SetNextPoint();//否则就继续自动巡逻
}
}
private void SetNextPoint() //用于敌人巡逻的自动寻迹移动
{
if (wayPoints.Length <= 1) return;
enemyAgent.destination = wayPoints[nextIndex].position;
nextIndex=(nextIndex+1)%wayPoints.Length;//用于循环nextIndex变量
}
}