obsidian/笔记文件/2.笔记/游戏中的AI算法_第一章.md
2025-03-26 00:02:56 +08:00

4.2 KiB
Raw Permalink Blame History

介绍一下GOAP决策算法定义可以参考GOAP 目标导向型行为计划 AI 算法 先弄一个打log的抽象基类其中包含单例Instance还有三个抽象函数分别对应普通log打印警告log打印错误log打印

!Pasted image 20240409165501.png

打印类,几个静态接口,调用了抽象基类的

!Pasted image 20240409165611.png

这是继承自抽象基类的具体实现调用Debug内置的打印接口

!Pasted image 20240409165702.png

这是状态接口其中两个Set重载函数分别用于保存数据、和状态覆盖还有一个Get函数用来读取数据AddStateChangeListener函数接口是数据修改相关监听

!Pasted image 20240409164248.png

继续

!Pasted image 20240409164407.png

!Pasted image 20240409164709.png

对应状态接口的是状态基类声明了_dataTable字典容器用来存储状态变化相关通过布尔控制而_onChange就是修改状态对应的Action回调 通过ChangeValue函数接口完成状态的修改和触发回调 Set函数就是保存修改

!Pasted image 20240409164948.png

!Pasted image 20240409164758.png

添加事件监听接口

!Pasted image 20240409165139.png

foreach遍历状态字典容器如果传参过来的otherState状态包含相同的key就把字典容器对应key的value设置到一个新状态 InversionValue函数接口就是翻转字典容器中所有状态

!Pasted image 20240409165159.png

Get从字典容器获取状态而ContainState函数接口通过key判断传参otherState是否在字典容器中

!Pasted image 20240409165756.png

拿到不同的key和拿到非字典容器包含的key返回都是ICollection泛型集合

!Pasted image 20240409165859.png

其余函数接口实现

!Pasted image 20240409170103.png

key和value组合重写字符Tostring

!Pasted image 20240409170144.png

继承自状态基类,泛型传参,有保存设置状态、获取状态、判断是否包含状态 等逻辑

!Pasted image 20240409170243.png

回到IState脚本创建一个静态类用来创建一个新状态

!Pasted image 20240409164721.png

资源通过对象池ObjectPool管理弄一个对应的_instance单例还有两个字典容器分别代表活跃和非活跃Type类型

!Pasted image 20240409171148.png

创建Object实体的接口参考Activator.CreateInstance 方法

!Pasted image 20240409171324.png

从非活跃变成活跃是Spwan函数接口两个字典容器的进出操作也调用上述SpwanNew接口完成实例化

!Pasted image 20240409171408.png

与之对应的,从活跃变回非活跃

!Pasted image 20240409172028.png

动作基类接口其中包含标签label消耗cost执行优先级是否可打断执行动作的先决条件动作执行后的状态

!Pasted image 20240409170523.png

还有一个,先决条件验证

!Pasted image 20240409170658.png

有限状态机,管理动作状态相关,先弄一个枚举,代表不同的动作执行状态

!Pasted image 20240409173200.png

动作状态的FSM有限状态机接口标签、进入动作、动作期间的更新动作、退出动作几个接口

!Pasted image 20240409173306.png

这是IFSM接口主要是用于添加状态、执行状态和对应状态下执行的帧函数

!Pasted image 20240409173413.png

状态机ActionFSM主要是用于注册新状态和修改状态字典逻辑

!Pasted image 20240409173614.png

继续执行新状态之前先Exit之前的_previousState前状态再Enter进入_currentState现状态还有帧更新函数的Execute调用对应的是IFsmState接口的实现

!Pasted image 20240409173820.png

!Pasted image 20240409173955.png

另一个动作状态机FSM主要是用于添加新状态

!Pasted image 20240409174016.png

继续也有帧更新函数也是对应IFSMState接口实现的Execute调用

!Pasted image 20240409174111.png

动作事件接口,判断是否可执行动作,还有动作完成之后的回调

!Pasted image 20240409173036.png