unity有限状态机和模糊状态机(怪物AI、自动寻路)

自动寻路步骤:

1、把场景中不同的物体勾选static

2、烘培寻路网格

3、添加NavMeshAgent组件

4、给需要寻路的物体添加脚本

游戏中有限状态机的体现:小怪的巡逻和追逐功能

模糊状态机的体现:当玩家离小怪比较近时,小怪会追逐玩家,当玩家离小怪比较远时小怪会停止追逐玩家并且回到出生点,这里的比较近和比较远就是一个模糊概念。在游戏的设计中,是以小怪为圆心,8为半径画圆,当玩家出现在这个范围内,小怪就会追逐玩家,当玩家超出这个范围,小怪就会停止追逐玩家。

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;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/lxy20011125/article/details/130318794