自动寻路步骤:
1、把场景中不同的物体勾选static
2、烘培寻路网格
3、添加NavMeshAgent组件
4、给需要寻路的物体添加脚本
文章来源地址https://uudwc.com/A/3waJp
游戏中有限状态机的体现:小怪的巡逻和追逐功能
模糊状态机的体现:当玩家离小怪比较近时,小怪会追逐玩家,当玩家离小怪比较远时小怪会停止追逐玩家并且回到出生点,这里的比较近和比较远就是一个模糊概念。在游戏的设计中,是以小怪为圆心,8为半径画圆,当玩家出现在这个范围内,小怪就会追逐玩家,当玩家超出这个范围,小怪就会停止追逐玩家。
文章来源:https://uudwc.com/A/3waJp
1、新建一个plane,window->AI->Navigation,然后在右边就会有Navigation。(如果敌人的路径不是在平面上,选择你要追踪的路径即可,这里是在平面上进行追踪,所以对plane进行烘焙)
2、点击右侧的Navigation,选中plane,设置参数如下,然后点击Bake,点击右下角的Bake进行烘焙网格。(这里是2018.3.6版本,有些版本的Bake在Object界面,找到Bake进行烘焙即可),烘焙完成后可以看到plane变成下面这个样子,说明烘焙成功。
3、导入敌人,这里导入的是资源商店中的资源,(下图最上面那个,它包含两个角色,我用到了其中的一个),导入后把预制体拖到场景中,命名为monster,然后修改他的角色控制器(它原有的状态有很多,但是我这里只用到了巡逻和追逐两个状态),具体操作如下。
1)新建角色控制器
2)把两个状态拖入角色控制器中,这里选择了以下两种,可根据需求修改
3)新建一个bool型来控制状态转换,对两个箭头的设置如下(右侧)
4)把角色控制器赋予monster,并给monster添加刚体和碰撞。
3、添加网格代理,网格代理的参数可适当改变。
4、写代码,把代码赋予monster,当玩家与monster的距离小于8时,monster追踪玩家,当距离大于8时,monster停止追踪并回到原来的位置,代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class MosterController : MonoBehaviour
{
private Animator _animator;
public Transform player;
private float distance;
public NavMeshAgent agent;
Vector3 sta;
// Start is called before the first frame update
void Start()
{
_animator = GetComponent<Animator>();
sta = this.transform.position;
_animator.SetBool("isattack", false);
}
// Update is called once per frame
void Update()
{
Vector3 playerPosition = player.transform.position;
Vector3 ZombieToPlayer = playerPosition - this.transform.position;
distance = ZombieToPlayer.magnitude;
if (distance < 8f)
{
_animator.SetBool("isattack", true);
agent.destination = player.position;
this.transform.LookAt(player);
}
else
{
_animator.SetBool("isattack", true);
agent.destination = sta;
}
}
}