Unity中实现基于状态机的简单敌人AI

本文介绍了如何在Unity中利用状态机实现敌人的AI,包括巡逻和追击两种状态的切换。状态机作为一种行为树的逻辑实现,通过封装不同状态为独立的类,并由Manager类进行管理。文章还探讨了状态转移的两种实现方式,并提供了代码示例。
摘要由CSDN通过智能技术生成

最早的游戏的敌人ai只有简单的寻路功能,随着技术发展,现代游戏中逐渐融入AI元素,它们有着最常规,以及特定情景的判断能力与数据处理能力。判断,也称为分析。大量的分析,即逻辑。逻辑,即AI。

本文在unity中使用状态机,实现可以在巡逻和追击两个状态之间切换的简单敌人ai。

状态机

状态机的本质是行为树的逻辑实现。游戏AI的开发是从其行为模式和变化逻辑开始的。

下图就是一个简单的行为树:

在这里插入图片描述
AI在任一时刻必定处于巡逻、追击、搜索、逃离四种状态中的一种,当触发另一状态所需的条件时,从一个状态改变到另一状态。

我们可以将每一个状态封装成一个有执行方法、认知标识的类,通过编写一个Manager类,将需要的状态进行存放、管理和控制,在需要的时候进入预想的状态。

整个状态机的基本结构如下图所示:

在这里插入图片描述

在这个基础上还可以进行另一种改动:把状态转移函数的判决从Update函数中转移到执行函数的内部,使整个状态机的结构更加紧凑,但是这种方式不便于多种类敌人的适配,选择哪种方式还要看实际需求。

代码实现

public class EnemyCntroller : MonoBehaviour
{
   
    GameObject player;
    Transform thistf, playertf;
    Rigidbody2D thisrb;

	StateManager statemanager;
    Vector3 point1, point2;//在point1和point2之间来回巡逻
    public bool target;//true表示点2为目标,false表示点1
    float moveSpeed;

    // Start is called before the first frame update
    void Start()
    {
   
        player = GameObject.FindGameObjectWithTag("Player");
        thistf = this.GetComponent<Transform>();
        thisrb = this.GetComponent<Rigidbody2D>();
        playertf = player.GetComponent<Transform>();

        statemanager = new StateManager();
        statemanager.RegionState("Idle");
        statemanager.RegionState("Chase");
        statemanager.SetDefaultState("Idle");

        point1 = new Vector3(5, 0, 0);
     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值