介绍一下,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]]