2020.04.04
清明假几天可以一直码蓝图真好,再加把劲就把这项目做完了,虽然以后面试还得好好把这些功能再整理一遍,不过总算有个成果能拿出手了~
此节生成Al钥匙,每段时间进行无目的移动;钥匙打中后定格在原地,玩家在附近破解完毕后钥匙带玩家进入下一关;
创建Character蓝图BP_ShootSpider_EnterKey;在组件Mesh中添加三个静态网格体组件,取名Core、FrameOut、FrameIn;分别设置静态网格体为key3、key1、key2;材质设置为Block及Glow;全选缩放(1.25,1.25,1.25)
添加SphereCollision命名为Trigger,球体半径设为150;
添加时间轴AnimTimeLine,勾选自动播放和循环;FrameRotate和CoreLocation轨道;FrameRotate轨道添加两点(0,0)(5,360),CoreLocation轨道添加三点(0,0)(2.5,1)(5,0)
编辑蓝图,创建SetRelativeRotation(设置相对旋转)节点,lerp(向量插值)节点;注意轨道与引脚顺序
编辑胶囊体预设
蓝图新建搜索class中AlCrontroller命名为BP_Shootspider_EnterKey_Al;
右键内容管理器,在人工智能处将三个蓝图均创建一次,黑板BP_Shootspider_EnterKey_Blackboard(存放Al的数据用来和其他工具沟通),环境查询BP_Shootspider_EnterKey_EOS(查找场景数据),行为树BP_Shootspider_EnterKey_Behavior(定义各种行为的判断);
拖拽根选择Grid网格查询;
新建蓝图EQSTestingPawn,拖拽至场景;编辑EQS为以上类,则场景中可见该网格;(查询完后删除该蓝图)
编辑大小及间隔使网格正好覆盖地图;添加距离测试(0,5000),(得分因数为1时Al更倾向于移动的绿色区域呈现于外围,为-1时Al倾向于内围),调节得分等式为平方根,数据绑定为相对于得分,标准化类型为相对于等分,使绿色覆盖范围尽可能大;
编辑行为树(节点运行自上而下自左而右),添加Selector节点(该节点下一个行为成功了该选择节点即为成功,都失败了则为失败),添加Sequence节点(该节点以上所有节点都成功才算成功,一个失败则为失败);
添加EQS查询节点,选择前25%的单一随机项(否则极小概率出现总为某一点);
添加移动和等待节点
测试:将钥匙蓝图置入场景运行,Shift+F1并点击弹出,可在场景中移动查找到此点;
新建SpawnEnterKey函数;编辑SpawnWave函数,调用钥匙生成函数;
新建GetRandomRock函数获取岩石位置,编辑,勾选纯函数和常量;
编辑SpawnEnterKey函数,获取岩石位置并在合适位置生成
编辑钥匙蓝图,新建变量Health、MaxHealth、IsDead,创建函数Reduce,
编辑事件蓝图,DetachFromControllerPendingDestroy(从控制器分离待销毁)函数节点使钥匙脱离Al控制;
设置生命值
新建变量CrackTime、MaxCrackTime(值为7)、IsPlayerOveraying(布尔)、IsInteracted(布尔)、IsPlayerDead(布尔);
创建函数AddCrackTime、ResetCrackTime、CanCrackKey;
编辑CanCrackKey函数判断是否能破解,勾选纯函数和常量;
编辑AddCrackTime函数
在项目设置中添加交互设置Interact为键盘e值,手柄设置为FaceButtonBottom(正面按钮下);
蓝图接口实现各蓝图(比如玩家和道具)间某种操作对应的功能实现
创建Interfaces文件夹放置蓝图接口,新建蓝图接口BPI_Interactable,函数起名OnInteract;具体实现方式在交互蓝图中实现;
编辑玩家蓝图,创建InteractTrace函数,SphereTraceByChannel(由通道检测球体)节点,勾选debug选项持续时长;DoesImplementInterface(进行实现接口)节点实现通道的检测;
此时测试运行,击中钥匙并交互7秒破解后显示打印字符;
但出现第一关就出现钥匙的bug,检测钥匙生成处又确实有指定波数的判断,也许得咨询下大佬;
在组件中添加静态网格体并应用网格体素材,可实现一个物体中多个网格体,在时间轴设置相应轨道旋转后还可对不同网格体应用不同的旋转动作;
自定义AlController中使用EQS查询整个地图坐标并调节Al移动的取值(可使用EQSTestingPawn编辑可视化该地图各点的取值),将此数据记录在黑板中,在行为树中应用查询,将取值赋予到移动位置;最后在Al蓝图中应用该行为树;
获取全局岩石数组,选用随机岩石位置并在附近生成钥匙,每进入下一关时判断该波数是否生成钥匙;
赋予生命值和伤害系统,使用DetachFromControllerPendingDestroy(从控制器分离待销毁)函数节点让钥匙脱离Al控制;
将玩家按键映射于蓝图接口,使用通道检测蓝图接口,其中DoesImplementInterface(进行实现接口)节点实现通道的检测;此时即可引用自定义的蓝图接口节点发送交互消息;
在钥匙蓝图中该接口在事件图表中触发蓝图接口事件,此时可通过设置相关布尔变量值达到某些(破解)功能的实现;