一、巡逻地图
1、添加背景房间,命名。如:Level
2、生成地图
(1) Window-AI-Navigation(Obsolete)——(已淘汰。新的后面学会了再说)
(2) 选中Hierarchy面板上的Level,在它的Inspector面板右侧,勾选Static后,选择yes
物体被标记为Navigation Static后,Unity会在Bake过程中将这些物体的几何信息纳入导航网格中,从而使得游戏中的角色或其他可移动对象能够知道哪些区域是可行走的,哪些是不可行走的
(3) 点击右下角的Bake按钮,生成地图
(4) 可以根据需要,取消勾选Level的子物体(如天花板、地板下面一层的Plane等)上的Static,从而精准控制需要巡逻的位置。进行取消勾选的设置后需要重新生成地图(Bake)
二、巡逻对象
1、添加巡逻对象,命名。如Ghost
2、巡逻路径
(1) 思路:提供路径起点、途经占、终点、巡逻地图后,由Navigation系统自动计算巡逻路径。
(2) 方法:添加Navigation系统——给Ghost添加Nav Mesh Agent组件
Nav Mesh Agent组件:
① 作用:实现游戏角色的导航功能。使角色能够在场景中找到路径并朝目标移动
② 面板:
Nav Mesh Agent组件中的Agent Type与Navigation中的Agent对应
Navigation中可以根据需要增加Agent类型
speed:巡逻速度改为1.5
Stopping Distance:一般不为0。可改为0.2
当靠近目标位置的距离达到此值时,代理将停止。
即:可以设置指定代理(Agent)在距离目标位置多远的地方停止移动
3、巡逻路径起止点
(1) Create Empty,命名为WayPoints。Reset
(2) 以WayPoints为父物体,Create Empty,2个,分别命名为WayPoint0,WayPoint1
(3) 设置二者的 Postion
4、给Ghost添加WayPointsCtrller.cs组件
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class WayPointsCtrller : MonoBehaviour
{
private int pointIndex = 0;//路径点索引
public Transform[] wayPoint;//路径点数组
public NavMeshAgent enemyAgent;//动态敌人的导航代理组件
void Start()
{
// 确保至少有两个路径点
if (wayPoint.Length > 1)
{
// 将enemyAgent的目标位置设置为wayPoint数组中的第一个元素的位置
//一旦执行了这句代码,enemyAgent将会开始尝试移动到这个新的目标位置
enemyAgent.SetDestination(wayPoint[pointIndex].position);//SetDestination:设置代理(动态敌人)的目标位置
}
else
{
Debug.LogError("至少需要两个路径点!");
}
}
void Update()
{
if (enemyAgent.remainingDistance < enemyAgent.stoppingDistance) //enemyAgent到达 wayPoint[0]的位置
{
//在0和1两个点之间巡逻
pointIndex = (pointIndex+1)%wayPoint.Length;
enemyAgent.SetDestination(wayPoint[pointIndex].position);//向wayPoint[1]位置移动
}
}
}
pointIndex = (pointIndex + 1) % wayPoint.Length;
目的:
更新pointIndex
,使其指向wayPoint
数组中的下一个路径点,如果已是最后一个路径点,则循环回到第一个路径点
解释:
pointIndex + 1
:将当前的索引值加1。% wayPoint.Length
:
作用:确保pointIndex
的值不会超出wayPoint
数组的范围。实现循环遍历数组的效果。
解释:当pointIndex
到达即数组的最后一个元素的索引时,加1后再取模将pointIndex
重置为0
取模:
enemyAgent.SetDestination(wayPoint[pointIndex].position);
目的:
调用NavMeshAgent
组件的SetDestination
方法,设置enemyAgent
(一个敌人的导航代理)的新目标位置
解释:
wayPoint[pointIndex].position
:
通过pointIndex
索引访问wayPoint
数组中的当前路径点,并获取其位置(position
)
enemyAgent.SetDestination(...)
:
将enemyAgent
的目标位置设置为上一步获取到的路径点位置。
之后,enemyAgent
开始计算到达这个新目标位置的路径,并尝试沿着路径移动。
pointIndex = (pointIndex + 1) % wayPoint.Length;
enemyAgent.SetDestination(wayPoint[pointIndex].position);
效果:敌人沿着预定义路径点循环移动
逻辑:
更新pointIndex
以指向下一个路径点(或如果已经是最后一个则回到第一个),然后将enemyAgent
的目标位置设置为这个新的路径点的位置