Blender To UE5 塔防 002

一个半小时的时间,知识量太大了,对于我这个小白来,脑子已经完全饱和。
实例,学起来优点就是有意思。驱动力强,但是费脑子,发型也往强者这边更近一步。

本节课目标:基础的防御塔蓝图搭建,防御塔具有攻击能力。
----------给Actor塔添加一个spawn动画并尝试炮筒旋转和Fire------------------------------
-----------------一、给Actor塔添加一个spawn动画---------------------
整体思路:
- 首先创建一个Actor塔的父类
- 再创建一个动画蓝图类,可以播放动画序列
- 在塔的父类蓝图中设置条件,和蓝图动画之间通信,控制状态机,实现播放哪个动画序列;
- 几个状态分析
- start
- spawn
- idle
- Idle 就是一帧动画,也没有呼吸,所以这里完全可以不用状态机,直接序列动画播放spawn。但是,UP可能考虑的是让课程内容更丰富。
具体步骤:
创建一个Acor命名为BP_Defence_Patent,
- 添加一个骨骼体组件,命名为SpawnMesh
- 在组件细节面板中,添加骨骼;
- 并把Actor放到关卡中,没有spawn动画
- 下面给Actor添加spawn动画
在Animation文件夹种创建Anim(动画蓝图)
- 添加TowerBaseSK_Skeleton
- 命名为ABP_Tower
在AnimGraph中,添加一个动画序列,看一下效果。
没有反应,我们还需要给蓝图中指定播放哪个蓝图动画。
指定完成,就可以正常播放动画了。
但是,对于Actor(ABP_Tower)来说,有很多动画,例如:攻击时候的攻击动画、Idle动画等。
所以,先建一个变量来告诉动画蓝图Spawn动画是否播放完成,这样状态机就可以依据来判断播放哪个动画了。
创建布尔变量IsSpawned?
创建一个状态机,命名为Tower State Machine;
- 状态机可以根据条件来播放哪个动画序列。
- 三个状态,Start,Spawn,Idle
- 在三个状态中,添加动画序列
下面,就开始设置条件:
- 在动画蓝ABP_Tower图中,获取Actor;
- cast to 塔的父类(BP_Defence_Patent)
- 得到蓝图中的变量来判断spawn的动画是否播放完成
- 如果完成,则进入idle
- 没有,则继续播放Spawn动画
- spawn到idle规则
- 利用的一个剩余时间(比率)的节点

----------------------------------二、实现炮筒旋转动画--------------------
1、攻击时候的炮基,
- Spawn完成之后,切换可视性后隐藏;
- TowerBase设置为隐藏,切换可视性后显示;
2、攻击时候的炮筒,
- 添加TowerBaseCanno骨骼网格体
- 对于骨骼网格体来说很重要的一件事别忘了:
- 动画模式
- 动画类
- 也设置为隐藏,切换可视性后显示;
- 然后添加蒙太奇
3、实现炮筒单独旋转的蓝图设置
- 添加一个时间轴25:58
- 长度设置为1;
- 轨道命名为TurnRate;
----------------------------------三、实现开火的动画--------------------
开关动画的重复的动作,所以使用蒙太奇。
问题来了,如何创建蒙太奇,使用蒙太奇;
1、创建蒙太奇
- 视频中直接选择一个动画序列
- 右键——创建——创建蒙太奇
- 并改名为Tower BaseAnimAtk_Montage
2、播放蒙太奇的节点
- 骨骼——炮筒
- 资产选择——刚刚创建蒙太奇
3、蒙太奇的调用播放是动画蓝图中设置;
- slot搜索节点
- 相对于在动画蓝图中放置了一个插槽(slot)
- 然后,如果Actor蓝图中就利用节点来控制播放了(步骤2)
- 1、对于骨骼网格体来说很重要的一件事别忘了:
- 动画模式
- 动画类
- 2、在动画蓝图中slot节点
----------下面让Tower搜索敌人并鉴别出离着最近的敌人-----------------------------
先用蓝图做,后面会用行为树做!
创建一个Character作为敌人,命名为BP_TDEnemy_Parent
- 添加骨骼SK_Mannequin
- 添加动画蓝图
- 搜索敌人。在BP_Defence_Patent中蓝图中
- 添加对Object进行多球体追踪
- 创建一个浮点变量AtickDistance,1000;
- 对象类型
- 是之前,设置好的
- 39:30



进入敌人的蓝图,设置胶囊碰撞设置:
- 碰撞预设——Custom;
- 对象类型——Enemy;(设置好的)
- 碰撞相应设置:

在BP_Defence_Patent中继续编辑蓝图
-------------获取离着最近的敌人---------------------------
一、判断碰撞是否成功,成功的放置到数组中
- 首先利用节点多球体追踪判断是否成功
- 成功的话,就For Each Loop
- cast to BP_TDEnemy_Parent
- Add Larry
- 提升变量,命名为EnemyFindArray
二、判断哪个敌人离着目的地最近
准备工作:
- 创建一个函数,命名为:GetEnemyNearToBase;
- 创建一个Acor——Base,也就是敌人的目的地;
- 在BP_Defence_Patent蓝图中获取Base,得到Base的引用47:07

变量归类,这技巧太实用。可以捋捋变量


所有准备工作做好之后,现在就可以判断哪个敌人离着最近了
根据的敌人的位置,来让炮筒旋转,朝向敌人
让敌人AI移动
- 用到节点AI MoveTo
- 追踪对象,利用节点获取类的所有Actor,获取到BPBase(目的地的actor)
- ue5地图自带导航,按键P就可以看到绿色的导航区域
- 如果没有话,可以自己添加NavMeshBoundsVolume

修改移动速度
可能就是执行一次,所以设置一个条件,只要没有得到有效值就一直执行函数Search
为啥要delay时间呢?这样的话,再次执行search的时候,就会在0.2s之后又执行一次。
但是在这次又设置一个条件,这个条件设置错误了,up主在后面视频也进行了修改。
判断数组的长度应该>=0,而不是判断是否==0!
后面学习up如何debug,借鉴一下思路!!
让炮筒持续瞄准敌人!!
set time by event提升为变量,这个变量类型为定时器柄;
作用是啥呢?结合后面的内容,猜想,这个变量就是这个定时器的引用。
新建一个变量,属于游戏中的变量,
- 再Attack函数中,设置IsAttacking为真;
- 然后作为Aim(瞄准事件)的条件
但是,这变量的作用是什么呢?
- 在敌人的蓝图中,新建一个变量I是Dead?
- 来判断敌人是否死亡,
- 如果死亡,重新Search;
- 如果死亡,就清除定时器,也就是不再瞄准和继续攻击;
- AimHandle(定时器手柄)这个定时器的引用。