在很多游戏中都会看到,当人物进入怪物的仇恨区域时,怪物就会自动寻路到人物处进行攻击;当人物离开区域时,怪物便会停下或者继续巡逻。这就是AI的功能。最近了解到一种制作简单AI的方式,分享一下。
首先,会用到这个组件 NavMesh Agent
NavMesh Agent
Base Offset :碰撞圆柱相对于变换轴心点的偏移量
Speed:最大移动速度
Angular Speed:角速度,即转向的速度
Acceleration:最大加速度
Stopping Distance:停止距离,即距离物体多远停止
Auto Braking:自动减速,启用此选项时,当人物将要到达目的地时将会减速。
Radius:半径
Height:高度
Quality : 躲避的水平,一般我们选默认的High Quality就行了
Priority :躲避优先级
将此组件添加到相应的怪物身上,在场景中创建一个平面,将平面设置为Navigation Static然后打开Navigation进行烘焙(如果没有Navigation可以在Window里面找到)
Navigation
接下来便可以在怪物的身上添加脚本了,首先定义个枚举类型,将需要的动作都存入其中,并将初始状态设置为idle
public enum EnemyState
{
idle,
run,
attack,
death
}
public EnemyState CurrentState = EnemyState.idle;
在start中初始化参数,获取怪物身上的动画组件,寻路组件,以及要追击的玩家
void Start()
{
_animator = GetComponent<Animator>();
agent = GetComponent<NavMeshAgent>();
Player = GameObject.FindWithTag("Player").transform;
}
我们要时刻判断玩家是否在怪物的仇恨区域内,所以状态转换写在在Update中
我们根据距离来判断,所以第一步要获取怪物与玩家之间的距离
float distance = Vector3.Distance(Player.position, transform.position);
- 如果怪物和玩家的距离大于10,则怪物停留在原地或者继续巡逻
- 如果距离在2到10之间,则怪物将会追击玩家
- 如果距离小于2,则怪物便攻击玩家
用switch语句来进行状态切换
switch (CurrentState)
{
case EnemyState.idle:
if (distance > 2 && distance <= 10)
{
CurrentState = EnemyState.run;
}
if (distance < 2 )
{
CurrentState = EnemyState.attack;
}
_animator.Play("Idle");
agent.isStopped = true;
break;
case EnemyState.run:
if (distance > 10)
{
CurrentState = EnemyState.idle;
}
if (distance < 2 )
{
CurrentState = EnemyState.attack;
}
_animator.Play("Run");
agent.isStopped = false;
agent.SetDestination(Player.position);
break;
......
这两段代码通俗易懂,仅仅是当怪物处于何种状态是便播放相应的动画,在这个阶段中,如果怪物与玩家的距离发生了变化,则就会立刻改变怪物当前的状态。

AI.gif












网友评论