ai感知组件:
让ai模拟人类的感官
一般放在单个pawn中
若是集群pawn,则放在控制器中
添加感官配置,相当于添加对应人体器官
注意!虚幻的单位是cm
视力配置:
次要视觉半径:余光范围角度
到上个已见位置的自:若被ai捕捉过,且在视觉范围内,则ai可视目标
视点向后偏移:可视范围偏移
最大年龄:可视目标有效期
若有多个感官,则需要设置主导感官
运行了ai行为树的控制器,在其控制的pawn中,可以获取黑板
ai感知组件:
让ai模拟人类的感官
一般放在单个pawn中
若是集群pawn,则放在控制器中
添加感官配置,相当于添加对应人体器官
注意!虚幻的单位是cm
视力配置:
次要视觉半径:余光范围角度
到上个已见位置的自:若被ai捕捉过,且在视觉范围内,则ai可视目标
视点向后偏移:可视范围偏移
最大年龄:可视目标有效期
若有多个感官,则需要设置主导感官
运行了ai行为树的控制器,在其控制的pawn中,可以获取黑板
要移动到实时的位置时,不能使用过程节点的引脚(例如移动完成时)
服务前缀:BTS
需要事件启动:
Event Receive Activation AI
不需要中止
将变量暴露,可以在服务中设置
黑板键值默认不赋值
黑板键可以被设置也可以被传递
传递时,需要将黑板键以目标类型传递
设置时,需要将黑板键以目标类型设置
以上需要指定黑板键,在任务内,黑板键需要设置为可编辑实例
ai行为树的第一个合成节点可以为Selector
可以使用FinishWithResult来返回结果配合Selector执行一系列操作(或者使用Sequence )
任务前缀:BTT
任务需要重载:
Event Receive Execute AI:事件接收执行AI
在执行末尾需要完成执行结束
若涉及键的更改,则需要新建黑板键选择器变量,设置对应的类型,该黑板键需要开启可编辑实例
行为树从根开始运行
根节点只能连接合成节点
合成节点:
Selector:
类似逻辑或(||),子节点任意一个成功,则返回成功,只有全部失败才返回失败
Sequence:
类似逻辑与(&&),子节点任意一个失败,则返回失败,只有全部成功才返回成功
SimpleParallel:
开始执行主任务时,次要任务会在后台执行,主任务执行完成之后,根据完成模式来决定次要任务的执行或终止
可添加装饰、服务节点
装饰器节点:
不会执行任何行为,根据特定条件影响其所在子节点的执行(类似子节点添加了执行条件)
观察者中止:
None:不进行中止
self:中止所在的节点
LowPriority:中止同级但执行顺序低于自己的节点
both:self和LowPriority
观察者通知:
OnResultChange:黑板装饰器条件改变时
OnValueChange:指定黑板键改变时
合成:
组合判断条件
黑板装饰器:
判断黑板条件或检测黑板键的改变
游戏标签检查器:
黑板条目比较装饰器
自定义装饰器
服务节点:
用于检查和更新黑板
SetDefaultFocus:
设置默认聚焦,AI角色的关注点(可以是任何键),在决策过程中起重要作用
RunEQS:
定期查询场景更新,也能更新黑板键,可设置执行间隔和EQS服务(黑板键或模板)
自定义服务
任务节点:
角色执行自定义的功能
自定义任务(重要)
根节点无法附加装饰器节点和服务节点,可以指定黑板
可以根据节点的数字明确执行顺序
行为树是人工智能更方便的工具,依赖于黑板资产
黑板的键类似于变量
行为树命名前缀:BT
黑板命名前缀:BB
获取随机移动点:
GetRandomReachablePointInRadius
要规范AI角色的移动范围,需要铺设AI导航网格体
AIMoveTo的目标优先级:
TargetActor-Destination
生成法球时注意传递的Scale的值
修复角色攻击时死亡会在躺下之后站起来的BUG。
来到ToAttack函数中,把setComboAttack节点放前面,把JumpToNode节点放后面。然后在jumpToNode节点前面增加一个branch判断角色是否死亡。
以上描述的方法可以保证comboIndex可以正常更新(虽然可能不需要了),但是在攻击动画结束时的Notify不会把动画引导回状态机判断逻辑中。
蓝图通信
1、直接蓝图通信:
1)使用获取类的actor(get class actor)节点,使用该节点时,当场景有多个实例,会返回第一个蓝图类(需要先在关卡中实例化相关的蓝图类)
2)获取类的所有的actor,获取到指定类的所有actor,返回的是actor的集合
3)重叠时事件
4)第三方通信,通过其他蓝图类,访问到目标蓝图类
5)使用生成actor(spawn actor)节点
6)获取玩家角色,直接获取到角色
7) 类型转换为(cast to),object获取到的是当前控制的角色
2、蓝图接口:
3、事件分发器:
可以在蓝图类中预留变量,在生成或事件时进行传入,以达到优化的目的
传入可搭配接口使用!!!以达到双重优化的目的
进行传入可降低耦合性,传入建议使用基类存储
多使用接口!降低耦合性!
接口处理通用的逻辑效果明显!也能达到优化的目的
初始化要注意什么时候调用,有生成对象的话需要放在beginplay
摄像机管理器用于切换摄像机
可以在控制器中使用事件获得pawn来将玩家传递给摄像机管理类
一定要注意在控制器中指定摄像机管理类
蓝图更新摄像机需要在返回节点设置fov和勾选bool值
原理:
玩家控制器将受控制的类传给指定的CameraManger,CameraManger通过这个类生成摄像机并设置摄像机的变换
CameraManger本质上是个更好管理的相机类
获取的控制器只能是CameraManger拥有的,而不是玩家的控制器
CameraManger默认在原点旋转,想要定义旋转请到下一节课
蹲伏需要设置可蹲伏,蹲伏设置半高
跳跃和蹲伏使用内置方法即可
角色运动状态发生改变时,有对应的事件调用,去找找!
需要先调用父类的事件:
拥有事件开始/结束蹲伏
事件移动模式变化时
可用上述事件来动态更新状态,节省性能
状态切换条件建议直接使用bool值,设置bool值的逻辑放在tick中更新
时间轴使用的值需要以变量的形式输入
使用TimeLine改变摄像机的局部位置来控制摄像机的晃动
使用节点和CameraShake蓝图来配置摄像机晃动
缓存姿势可用于将动画资源进行缓存,方便调用和复用
缓存的姿势需要使用节点进行使用
姿势快照缓存单帧,一般在蓝图类中(非动画蓝图类)使用
需要获得动画实例来保存