2024-07-12 Unity AI状态机1 —— 框架介绍

文章目录

  • 1 有限状态机
  • 2 状态机实现框架
    • 2.1 StateMachine
    • 2.2 BaseState
    • 2.3 ...State
    • 2.4 IAIObject
  • 3 框架类图

本文章参考 B 站唐老狮 2023 年直播内容。点击前往唐老狮 B 站主页。

1 有限状态机

​ 有限状态机(Finite - State Machine,FSM),又称有限状态自动机,简称状态机。是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。

  • 有限:有限度,不是无限的。

  • 状态:指所拥有的所有状态。

举例说明:

​ 人会做很多个动作,即有很多种状态,包括站立、走路、跑步、攻击、防守、睡觉等等。我们每天都会在这些状态中切换,而且这些状态虽然多但是是有限的。当达到某种条件时,就会在这些状态中进行切换,且这种切换时随时可能发生。

​ 游戏中的怪物 AI 表现一般为巡逻、朝玩家移动、攻击、逃跑、格挡等等状态。即使怪物 AI 表现看起来比较复杂,但是深入观察和分析,它们的状态一般是有限的,只是在不同条件下切换不同状态,由于状态的多样性和美术表现的多样性,让我们觉得它是比较智能的。

​ 因此,“有限”和“行为状态”这两个特点,使得游戏 AI 适用于使用有限状态机实现。

2 状态机实现框架

  1. StateMachine(状态机类,用于统一管理各个状态)。

  2. BaseState(状态基类,抽象出状态的共有内容)。

  3. …State(各状态类,有多少个状态就有几个状态类,均继承状态基类)。

  4. IAIObject(怪物 AI 接口,用于规范所有 AI 的共同行为)。

2.1 StateMachine

​ 有限状态机类,用于管理各个状态之间的切换。同时需要记录所有状态,因此需要如下成员:

  1. StateDictionay:记录所有状态。
  2. NowState:当前处于的状态。
  3. AIObject:附属在哪个 AI 对象上。
  4. AddState():向外部提供添加状态的方法(执行一帧)。
  5. ChangeState():向外部提供切换状态的方法(执行一帧)。
  6. UpdateState():向外部提供更新状态的方法(每帧调用)。

​ 基本结构如下:

using System;
using System.Collections.Generic;/// <summary>
/// 有限状态机类,用于管理各个状态之间的切换
/// </summary>
public class StateMachine
{/// <summary>/// 管理所有状态的字典容器/// </summary>private Dictionary<EAIState, BaseState> _stateDic = new Dictionary<EAIState, BaseState>();private BaseState _nowState; // 当前状态public IAIObject AIObject; // 管理的 AI 对象/// <summary>/// 初始化方法/// </summary>/// <param name="aiObject">待管理的 AI 对象</param>public void Init(IAIObject aiObject) {AIObject = aiObject;}/// <summary>/// 添加 AI 状态/// </summary>public void AddState(EAIState state) { ... }/// <summary>/// 切换状态/// </summary>/// <param name="state"></param>public void ChangeState(EAIState state) { ... }/// <summary>/// 更新当前状态/// </summary>public void UpdateState() { ... }
}

2.2 BaseState

​ 状态基类负责提取所有状态共有的特性,并声明为抽象类(Abstract),规范每个状态的共同行为。其共有特性基本包括如下:

  1. AIState:状态类型(所有状态需要告诉外面自己是哪种类型)。
  2. StateMachine:附属的状态机。
  3. OnStateEnter():进入状态时执行的逻辑(执行一帧)。
  4. OnStateUpdate():处于该状态时不断更新的逻辑(每帧更新)。
  5. OnStateExist():离开状态时执行的逻辑(执行一帧)。

​ 基本结构如下:

using UnityEngine;/// <summary>
/// 状态基类
/// </summary>
public abstract class BaseState
{public virtual EAIState AIState { get; } // 状态类型protected StateMachine _stateMachine; // 附属的状态机public BaseState(StateMachine stateMachine) {_stateMachine = stateMachine;}/// <summary>/// 进入状态/// </summary>public abstract void OnStateEnter();/// <summary>/// 保持状态/// </summary>public abstract void OnStateUpdate();/// <summary>/// 离开状态/// </summary>public abstract void OnStateExit();
}

2.3 …State

​ 在各个具体状态中,可以有独立的数据或逻辑,但每个状态都需要实现由基类规范的共同逻辑。

​ 以 PatrolState(巡逻状态)为例,其基本结构如下:

using System;
using UnityEditor;
using UnityEngine;
using Object = UnityEngine.Object;
using Random = UnityEngine.Random;/// <summary>
/// 巡逻状态类,处理巡逻逻辑
/// </summary>
public class PatrolState : BaseState
{// 巡逻数据...public override EAIState AIState { get => EAIState.Patrol; } // 表示自己是巡逻状态public PatrolState(StateMachine stateMachine) : base(stateMachine) {// 初始化...}public override void OnStateEnter() { ... }  // 进入巡逻状态的逻辑实现public override void OnStateUpdate() { ... } // 处于巡逻状态的逻辑实现public override void OnStateExit() { ... }   // 退出巡逻状态的逻辑实现// 其他逻辑、方法封装等...
}

2.4 IAIObject

​ AI 对象接口,规定 AI 对象必须继承该接口,用于规范 AI 对象的行为。

​ 在 StateMachine 中,不会存储具体的 AI 对象,而是存储 IAIObject,指向对应的 AI 对象。不同的 AI 对象均需要实现 IAIObject 中规范的逻辑,从而使 StateMachine 能够适用于具有不同逻辑的不同 AI 对象。

​ 基本实现如下:

using UnityEngine;/// <summary>
/// AI 对象接口,用于规范 AI 对象的行为
/// </summary>
public interface IAIObject
{public Transform Transform { get; } // AI 对象的 Transformpublic Transform TargetTransform { get; } // 目标监测对象的 Transformpublic float AttackRange { get; } // 攻击范围public Vector3 BornPos { get; } // 出生位置public void Move(Vector3 targetPos); // 移动public void StopMove(); // 停止移动public void Attack(); // 攻击public void ChangeAction(EAction action); // 切换指定动作// 等等...
}

3 框架类图

StateMachine_AI 框架介绍

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/46632.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Diffusion学习】【生成式AI】Diffusion Model 原理剖析 (2/4) (optional)【公式推导】

文章目录 影像生成模型本质上的共同目标【拟合分布】Maximum Likelihood Estimation VAE 影像生成模型本质上的共同目标【拟合分布】 Maximum Likelihood Estimation VAE

# Redis 入门到精通(四)-- linux 环境安装 redis

Redis 入门到精通&#xff08;四&#xff09;-- linux 环境安装 redis 一、linux 环境安装 redis – 基于 Linux 安装 redis 1、基于 Center 0S7 或者 unbunt-18.04 安装 Redis 1&#xff09;下载安装包wget http://download.redis.io/releases/redis-?.?.?.tar.gz 如&…

夏令营入门组day4

一. 题目 二. 思路 &#xff08;1&#xff09;B要先去和A回合&#xff0c;因为B只能将红染成蓝&#xff0c;不能直接将白染成蓝&#xff0c;所以B必须走A走过的路才有效。 &#xff08;2&#xff09;答案分为两部分&#xff0c;去和A回合的最短距离 以回合点为根节点&#xf…

FPGA上板项目(二)——PLL测试

目录 实验内容实验原理实验步骤实验结果 实验内容 将差分时钟信号转化为 192MHz 时钟信号作为输出。 实验原理 PLL&#xff0c;即锁相环&#xff0c;一种反馈控制电路&#xff0c;具有时钟倍频、分频、相位偏移和可编程占空比的功能。 实验步骤 添加 clocking wizard IP核&…

Gitlab CI/CD --- use a sample CI/CD template

0 Preface/Foreword Pipeline, job, stage的关系如下描述&#xff1a; A pipeline is composed of independent jobs that run scripts, grouped into stages. Stages run in sequential order, but jobs within stages run in parallel. 关键信息&#xff1a; pipeline由独…

Ubuntu 磁盘扩容

1.下载工具 sudo apt-get install gparted 2.调整大小

IP风险画像 金融行业的安全盾牌

在当今数字化时代&#xff0c;金融行业面临着前所未有的安全挑战。随着在线交易和数字银行业务的迅猛发展&#xff0c;欺诈和网络攻击的威胁也在不断增加。金融机构需要高效、可靠的安全解决方案来保护客户的资产和个人信息&#xff0c;防止各种形式的欺诈行为。 IP风险画像是…

postman点code选http出现乱码?

最近在调OA接口新建流程&#xff0c;用postman调成功了&#xff0c;但是要换到数据库来的时候就不知道咋弄了&#xff0c;一开始还以为是出现了乱码&#xff0c;都不敢用http的code&#xff0c;但其实是参数被urlencoding了&#xff0c;所以写到Oracle数据库的时候&#xff0c;…

构建企业多层社会传播网络:以AI智能名片S2B2C商城小程序为例

摘要&#xff1a;在数字化转型的浪潮中&#xff0c;企业如何有效构建并优化其社会传播网络&#xff0c;已成为提升市场竞争力、深化用户关系及实现价值转化的关键。本文以AI智能名片S2B2C商城小程序为例&#xff0c;深入探讨如何通过一系列精细化的策略与技术创新&#xff0c;构…

[论文笔记]构建基于RAG聊天机器人的要素

引言 今天带来一篇构建RAG的论文笔记&#xff1a;FACTS About Building Retrieval Augmented Generation-based Chatbots。 基于生成式人工智能构建企业聊天机器人迅速成为行业中最受关注的应用之一&#xff0c;旨在提高员工生产力。 然而&#xff0c;构建成功的企业聊天机器…

深入解析Spring Cloud:构建分布式微服务架构的最佳实践

导语&#xff1a;随着互联网业务的快速发展&#xff0c;传统的单体应用已无法满足高并发、高可用、可扩展的需求。微服务架构以其轻量级、独立性、灵活性的特点&#xff0c;逐渐成为大型分布式系统的首选架构。Spring Cloud作为构建微服务架构的重要框架&#xff0c;为开发者提…

【边缘计算网关教程】6.松下 Mewtocol TCP 协议

前景回顾&#xff1a;【边缘计算网关教程】5.三菱FX3U编程口通讯-CSDN博客 松下 Mewtocol TCP 协议 适配PLC&#xff1a;松下FP0H 松下XHC60ET 1. 硬件连接 Mewtocol TCP协议采用网口通信的方式&#xff0c;因此&#xff0c;只需要保证网关的LAN口和松下PLC的IP在一个网段即…

MYSQL--第九次作业

MYSQL–第九次作业 1、安装redis&#xff0c;启动客户端、验证。 安装网址&#xff1a;Redis Released&#xff0c;找到适合自己电脑的redis版本后&#xff0c;下载并安装。 安装完后&#xff0c;打开cmd命令框&#xff1a; -- 启动客户端 C:\Windows\System32>redis-cl…

【linux】服务器ubuntu安装cuda11.0、cuDNN教程,简单易懂,包教包会

【linux】服务器ubuntu安装cuda11.0、cuDNN教程&#xff0c;简单易懂&#xff0c;包教包会 【创作不易&#xff0c;求点赞关注收藏】 文章目录 【linux】服务器ubuntu安装cuda11.0、cuDNN教程&#xff0c;简单易懂&#xff0c;包教包会一、版本情况介绍二、安装cuda1、到官网…

破解快消行业营销费用管理难题,引领财务费控数字化转型

众所周知&#xff0c;快消品行业消费群体较为广泛&#xff0c;涉及渠道复杂&#xff0c;产品周转期短、可替代性强&#xff0c;特别是面对竞争激烈的市场环境&#xff0c;大力投入营销、渠道费用对快消行业的企业来说十分普遍&#xff0c;而这其中&#xff0c;由于渠道多、业态…

【LoadRunner】博客笔记项目 性能测试报告

文章目录 前言一、博客笔记项目性能测试介绍二、编写性能测试脚本&#xff08;VUG&#xff09; 2.1 测试脚本编写步骤 2.2 脚本总代码和结果分析三、创建测试场景&#xff08;Controller&#xff09; 3.1 测试场景创建实现步骤四、生成测试报告&#xff08;Anal…

Sql查询语句

SELECT * from student,class 在上一篇博客里我们已经介绍了Sql语句的增删改&#xff0c;以及创建了用来演示增删改的数据库和表&#xff0c;下面我们介绍SQL语句中最重要的查询语句。 增删改博客链接&#xff08;Sql语句之增删改查&#xff08;CRUD&#xff09;-CSDN博客&…

Nacos最新0day漏洞复现

目录 一、漏洞原理 二、版本信息 三、资产测绘 四、poc信息 五、总结 一、漏洞原理 漏洞的核心在于 Nacos 的某些接口没有严格的权限控制&#xff0c;攻击者可以通过特制的请求向 Nacos 服务器发送恶意数据&#xff0c;从而执行任意代码。下载nacos代码搭建环境https://gi…

数字孪生Digital Twin 结合建筑信息模型 BIM 在AIoT 智慧城市建设中Web 可视化大屏实践...

智慧城市建设通过将城市中的建筑、基础设施等构建 BIM 模型&#xff0c;并与实时采集的数据相结合&#xff0c;创建数字孪生体。可以实现对城市能源消耗、交通流量、环境质量等的实时监测和预测&#xff0c;优化城市规划和资源分配。 01 数字孪生 Digital Twin 数字孪生 Digita…

Jira学习

1.Dev OPS DevOps简介 DEV OPS 流程 DEV OPS流程对应工具 最重要的就是持续集成–Jenkins 2.Jira 新建项目