在做AI的时候不要只顾着编写程序,一定要将前提条件确保没问题。第一点:重中之重:(做了很多,就是不会Move,浪费了1个小时才想起来没有做这么关键的一步):设置导航区域!!!!!!!!!!!
导航区域的设定:Navigation导航,在Modes面板中搜索Nav关键字就会出现很多的导航区域的选项,一般使用的是NavMeshBoundsVolume,这是最常用的,作用是设置需要的导航区域,NavModifierVolume Modifier修改,顾名思义作用是对已有的导航区域进行修改,
NavLinkProxy,一个案例说明这个的作用就是,从一个台阶上跳下,如果不是用这个导航得话,怪是不跟着你跳的,但是可以使用这个来使怪物跳下台阶。其他还有两个,学过之后再做介绍。
A*算法 BSP 都是导航算法
为什么要创建一个AIController去控制行为树呢,主要是因为AIController中有一个隐藏的组件(C++中写有)BrainComponent,这个组件就是用来执行行为树的。如果说先要在别的蓝图中执行行为树的话也可以,但是要在C++中添加一个BrainComponent才可以使用,但是这里又有一个问题了,即使这么做了也是要注意在Task中事件驱动分别有两个版本,一个带有AI,一个不带。在别的蓝图中执行行为树只能执行不带有AI的事件驱动,因为带有AI的事件驱动只能在AIController中执行,而且在AIController中执行时带有AI的事件驱动的优先级要比不带的要高,从下面可以看出,若是Graugh中存在带有AI的但是后面没有写东西,也会执行带AI的不去执行不带的。
但是行为树有并不是跟AIController绑定的,而是在其中通过RunBehaviorTree来实现的,所以是可以控制切换的,在AICintroller中可以实现多个行为树。
这里插入一个有用的节点SetFocus(可以朝向目标)跟MoveComponent中的Orient(朝向)Rotation to Movement有关。
上次介绍了Decorator(装饰)中的BlackBoard,现在说下Decorator在行为树中扮演的角色,其实是一种条件判定,其实也可以讲条件写在Task中,但是出现了Decorator将条件写在其中并付给Composites。Service其实并不是必要的元素,但是他的存在会带来方便。主要说下行为树的运行机制:Root就像一个Main函数一样,提供一个入口,接下来应该就是Composites了,下面的运行机制是这样的:Selector1中的子节点中通过FinishExecute来返回是否成功,如果返回不成功,那么将信息反馈给Selector1,如果Selector1还有其他子节点,那么就进入其他子节点,在其他子节点中如果返回成功,将信息反馈到Selector1中,那么此时Seklector是成功的,此时他就要向上一级(假如上一级是Selector2)反馈自己是成功的,那么上一级(Selector2)也就成功,并不会执行其他子节点,就会再向上返回自己成功的信息。以上是一种情况,假如Selector1所有的子节点执行完毕,但都是失败的,那么此时Selector1也要向上一级返回,因为他已经执行完毕了,但向上返回的信息是不成功的,那么此时上一级在进行判断。Sequence则相反,遇到自己子节点不成功的就直接返回上一级,并反馈信息不成功。
在这里关键是注意Composite节点的返回跟成功与否是独立的,成功与否只是一种信息传递,而每一个节点执行完毕都要返回上一级的,不一样的就是Selector只要检测到有一个节点返回成功,那么他就是成功的并且视为执行完毕返回上一级,Sequence则是一旦检测到失败就是失败的并是为执行完毕返回上一级。
这里还有一个东西可以记一下,说是有这么一种情况,当AIPawn移动时,如何能控制其移动到目标后干什么呢,如何获得移动到目标的信息呢,可以用BindEventToReceiveMoveCompleted,引出事件通过枚举来写要执行的事件,这个事件分发器是引擎帮助调用的,在Move到目标点后调用这个事件分发器,执行事件。在Controller中还有一些引擎帮助调用的这样的事件分发器,以后接触到接着说。