目录
1.新建Character类型蓝图命名为AI_Character
4.新建AIController类型蓝图命名为AI_Controller_Mine(需要在所有类中搜索)
所谓的两种方式,准确的来说应该是使用和不使用行为树实现AI的移动
NavMeshBoundsVolume
不管用什么方法必须用导航体积包裹整个地图,选中该体积之后按P可以查看包裹的体积
AIMoveTo控制AI
实际上,让AI移动的最主要的节点就是AIMoveTo,直接通过这种方式控制AI比较简单,我们实现角色进入AI身边时AI开始移动
1.创建Character类型蓝图
随意改变一下外观
增加一个球形碰撞,半径设置成300或者400(添加这个球形碰撞是为了节省资源,我们不需要这个机器人一直走动,只要进入玩家视野范围的时候进行走动,当然还有其它方式实现,我们这里使用这种简单粗暴的方式实现)
‘’
取消勾选HiddeninGame以便我们在游戏中看到这个体积的边缘
2.记录AI的初始位置,提升为变量
3.AutoWalk自定义事件
让AI随机的在开始位置的两侧进行移动,移动完成后延迟1秒再次调用这个函数
创建一个IsCanRun Bool类型变量用来中断这个函数
4.停止移动
完成
回到场景中,我们拖放一个AI_Character到场景中
这个Actor千万不能放到导航体积里面,会导致无法移动
这里只是先测试一下ai的移动,后面再进行一定修改
行为树控制AI
我们需要4个资源
1.新建Character类型蓝图命名为AI_Character
随意增加几个Mesh修改一下外观
一定要设置Character的AIControllerClass。点击组件中的AI_Character然后在细节面板中设置AIControllerClass为刚才创建的AI_Controller_Mine
2.新建黑板命名为MyBlackboard
黑板用于保存一些关键数据,对于AI移动的关键数据便是初始坐标
新建两个键值
3.新建行为树命名为MyBT
点击上面的新建任务(可以看到可以新建3种类型的蓝图,可以简单的理解,任务Task,作为树的叶子,相对比较务实,主要负责执行一定实际的事件;装饰器Decorator和服务Services都要依附在Task上,装饰器就是条件语句,服务用于定期更新黑板上的数据,更加专业详细的行为树介绍见官方文档)
然后会在存放行为树的文件夹下生成一个Task,重命名为MyWalkTask
新建一个BlackboardKey类型的变量命名为HomeLocation,默认值为None
添加AIMoveTo节点,FinishExecute节点,CastToAI_Controller_Mine节点
按下图连接,作用是执行一次让AI移动到HomeLocation某一边。和上面基本上差不多这里我们没有角色检测。
回到行为树
首先添加一个Selector节点和Wait节点,Wait节点修改WaitTime等待时间为1秒
搜索刚才创建的Task,放到Wait左边(行为树中的节点是按照从左往右的顺序执行,可以看到每一个节点右上角有执行序号)
行为树补充:
Selector
Selector 节点从左至右执行其子项
其中一个子项达成后将停止执行其子项。(只要子项成功一个就不执行后面的)
如 Selector 的子项达成,则 Selector 也达成。
如 Selector 的所有子项未达成,则 Selector 未达成。
Sequence
Sequence 节点从左至右执行其子项
如其中一个子项未达成,将停止执行执行其子项。(只要失败一个就结束)
如子项未达成,则 Sequence 也未达成。
如 Sequence 的所有子项均达成,则 Sequence 也达成。
4.新建AIController类型蓝图命名为AI_Controller_Mine(需要在所有类中搜索)
新建两个Name名称类型变量,并设置默认值为对应名称
总结:
AIController有黑板和行为树,行为树有Task,我们把Character的AIController设置成这个AIController,那么这个Character就能实现行为树中的行为。理清楚行为树的使用流程,应该就可以很好的使用了。
移动主要是靠AIMoveTo这个节点。
移动只是一种行为,攻击,跳跃,放技能等等行为都如出一辙
行为树?决策树?