接下来我们就要创建AIbot 了,在这之前,这个选项还不能找到,我们需要设置一下。点击编辑--编辑器偏好设置--实验性功能--勾选BehaviorTreeEditor(译者注:我用的4.7版本的UE4已经没有这一项了)。好了,接下来就创建一个BehaviorTree(其他--行为树),取名为botAITree,打开它。你要注意的第一项内容是blackboard,这里我们要选择botData,这将会告诉bot在运行的access thing and reference thing整个过程里要做什么(?)。接下来要创建的是AI way point(航路点),新建一个蓝图类,父类为TargetPoint,取名为botWayPoint,打开它,添加一个变量,取名为Position,int类型,让他变成可以被编辑的(共有的),保存编译。接下来就要定义一些导航点了,如果你还记得之前的演示的话,这里有一个,那里有一个....1,2,3,4,5,6。观察我的工程你将会发现有6个标记,从1-6 Position的值由0变到5。
现在是教程的第2/5部分,我们将会给敌人创建行为树任务,和导航bot 完成 do the rounts(路),我们将可以导航bot走向敌人,好了,,创建蓝图类,父类为BTTask_BlueprintBase,取名为BTT_botNextRoute,打开它,在这个任务里我们需要添加两个BlackboardKeySelector变量,首先创建TargetPoint,类型为BlackboardKeySelector,创建另一个,Route。接下来我们要创建另外一个变量,maxRoutes,它定义了AI要寻找有多少条路,即使我们在这里创建了导航点,我们也有可能需要我们的AI角色控制你的任务,所有把这三个变量全部变成共有可编辑的,保存。然后,和之前一样,我们要添加两个事件:事件ReceiveExecute(4.7中文版本),和FinishExecute并给他们添加注释:开始执行、结束执行。接下来首先获得Route->GetBlackboardValueAsInt(以int型获得黑板值),并且和maxRoute做比较,如果大于等于maxRoute,则把黑板值设置为0,然后获得所有botWayPoint类的对象,然后或得到数组里面的每一个元素,使用ForEachWIthBreak节点,把complete端口,连接到finish的入口处,把finish执行事件节点稍微往后拖放一下,接下来我们把数组中的元素转换为botWayPoint,获得每一个的位置,复制一下左边的节点,比较他们是否相等,接下来我们要做的是把黑板值blackboardvalue值设置成vector,所以,我们先或得到TargetPoint的变量,把它设置为vector,我们先把finish节点拖放下来,位置信息是来源于这里,所以,获得数组中物体的位置,把他们赋值给TargetPoint,保存编译一下。
好了,接下来我们回到内容浏览器。我要添加另外一个任务叫做MoveToEnemy(向敌人移动),同样创建一个父类为BTTask_BlueprintBase的蓝图类,取名为BTT_botMoveToEnemy,我们首先创建两个黑板类的变量,一个是路(route),一个是状态(state),第一个取名为敌人物体(enemyActor),另外一个是State,接下来我们创建一个半径(Radius),用来判断到敌人的距离(?And This is simply allow you to minite delate,the subtance radios from the move to the actor),把这些变量都改成公有的。接下来创建事件ReceiveExecute节点,把actor 转换为botAI,我们想要获得他的状态,以枚举的方式获得黑板值,然后我们想要通过boteState的状态来做出选择,如图连接,把这两个往上移动一下,把state节点往下移动一下,腾出更多的空间,我们想要或得到敌人物体(enemyActor),以object的类型获得他的黑板值,把这个object转换成角色Character,从search的端口连接过来,接下来我们设置ai的焦点(?),我想做另外一件事,设置物体的旋转信息,所有我们或得到botAI被控制的pawn,设置它的旋转信息,或得到角色的位置,然后获得AIbot到玩家的LookAt对应角度,把角度的三个值分离,制作一个旋转值,仅仅只改变yaw,接下来继续获得物体的旋转信息,使用RInterTo节点,制作好的Rot作为目标值,得到的信息作为当前值,使用GetWorldDeltaSeconds节点,把插入速度改为6,来更新旋转信息。
接下来控制botAI 使用MoveToActor节点,把Radios值作为AcceptanceRadios,关闭CanStrafe,把你的目的actor转换为节点当中的目标端口值,往下走两行,我们来设置物体的旋转信息,从attack的输出端口连过来,把新得到的旋转值放到这里,这意味着当角色正在被攻击的时候,他是可以被吸引的(engaged)。