给僵尸npc添加动画和扣血效果
首先新建一个动画文件夹
新建一个动画蓝图
一般只要是不做汽车啊等模型,我们一般选Animinstance
因为僵尸是女英雄,所以我们选择女英雄的动画
重命名Zombie_animationBP
进入动画蓝图,创建一个状态机
重命名为default,并连线
我先选了三个站立的动作,当僵尸速度为0 的时候,我们希望这三个动画随机播放。
在动画蓝图的默认状态机里面添加一个状态节点,名字为Idel
进入这个状态节点
添加一个随机序列播放器节点
添加三个元素
将每个动画放进去
如果我们想让哪个动画播放的概率大一点,我们就将概率权重调大一点。
我们从1变成了3
连线之后,idel状态就做好了
现在我们再把走路和奔跑的动画复制过来
新加walk状态节点
进入节点,把walk动画拖进去。
然后剩下的动作过程比较复杂,僵尸先魅惑玩家,然后奔跑,最后攻击的混合动作。
添加了魅惑和攻击的动作。
添加魅惑,奔跑,攻击节点(注意状态的过度)
进入节点,添加一个状态机
然后进入状态机,新建三个状态节点 ,僵尸是先魅惑,然后奔跑,然后是进攻与奔跑的切换。
kiss和run里面只有一个动画,Attack里面依然采用随机播放多个动画
-----------------------------------------------------------------------------------------------------------
接下来就是设置各种状态节点的转化了。
kiss到run的状态切换条件是,kiss动画播放了80%就可以切换了,要给动画留一个过度的时间。
点击这个过度条件
其他的状态条件需要变量来驱动。
我们创建一个枚举数据。
在枚举里面添加四个变量,对应四个状态
这样的好处是,我们可以在僵尸蓝图里操控这个枚举变量。
进入僵尸蓝图,增加一个枚举类型的变量。
-------------------------------------------------------------------------------------------------------
下一步工作就是让动画蓝图得到对应的pwan中的变量。
首先,当动画蓝图初始化的时候,得到拥有这个动画实例的僵尸pwan的引用。
动画的每一帧,我们都去获得僵尸pwan中的状态枚举。
现在我们就可以设置状态之间的转化了
idel到walk,枚举等于walk就可以转化
进入攻击的时候要先魅惑和奔跑,所以将枚举等于run的时候,就开始魅惑了
同理,进入攻击节点是这样的。
--------------------------------------------------------------------------------------------------------------------
在行为树里驱动这些变量。
新建任务,该任务是用来修改僵尸状态的。
覆写方法和创建变量
通过自身变量设置僵尸的状态枚举变量
给这个任务重命名:BTT_SwitchState
补充一下,这个任务中的变量的眼睛要点亮。
添加状态转变任务,值设置为run
打开僵尸蓝图的mesh,选择僵尸蓝图。
测试:当僵尸发现我们之后,一边魅惑一边飘过来,这是因为转换状态的任务一瞬间就完成了,接着就开始move to的任务了。
解决思路:这两个任务中间加一个等待任务,等待时间就是魅惑动画的时间长度。
我们是等待了3.5s
当僵尸 移动到目标1米5的地方,他的移动任务就完成了,然后就开始进行攻击。
在进攻的过程中,僵尸与玩家角色的距离要不断检测。
所以我们要新建一个服务来检测距离,名字叫BTS_CheckDistance
覆写函数并新建变量
得到角色与僵尸的距离
在僵尸蓝图里增加一个变量攻击距离
默认值改为100
在黑板里面增加变量InAttackRange,布尔型的,表示目标是否在攻击范围内。
在新建服务中也添加相应变量
在新建的服务中,判断是否到达攻击范围
将结果赋值到黑板
在这个节点运行我们的服务
调整参数
把这个移动任务的参数调到20.
我们把这个左子树拆分成右子树和左子树
为两个顺序节点添加装饰器,用是否在攻击距离这个变量
左右分别这么设置
调整攻击距离检测服务频率
--------------------------------------------------------------------------------------------------
下面开始解决各种bug
第一僵尸巡逻等待的时候不能站立。
这里添加一个过度
在行为树加上这个任务节点,将状态改成idel
设置动画过度效果,如果行走的位移比较短,行走与站立的动作交替时间就会短,如果两个动画的过度时间太长,那么行走的动画就不明显,看起来像没有走路往前飘,所以我们缩短过度的持续时间,可以让行走的效果看起来更明显。
两个过度时间都缩到0.1s
现在僵尸没有办法随时面向主角,我们新建一个任务BTS_RotateTorwards,让他攻击主角的时候,自动转向
还是添加变量+覆写函数
首先得到target的location
得到僵尸的位置
得到僵尸面向玩家位置的朝向时的转向。
设置僵尸的转向
执行成功
添加任务
--------------------------------------------------------------------------------------------------------------------
现在对僵尸的攻击附加伤害。僵尸打下来的一瞬间进行扣血。
首先为两个攻击动画分别找到扣血的点
这一帧我们认为会造成打击
新建一个通知,并命名
动画2也是找到攻击的瞬间
选择我们刚刚创建的通知
回到动画蓝图,我们就可以创建makedamage的事件了
在僵尸蓝图中创建自定义事件makedamage
新增一个actor类型的变量,命名为AttackTarget
再创建一个伤害值变量,初始值设为10
连线
在行为树里面新建一个攻击任务,命名为BTS_attacktarget
还是先覆写,再添加参数
将黑板中的actor变量赋值给僵尸的攻击对象
在动画蓝图中,通知造成伤害
修改树的结构,并添加设置伤害任务 节点
最后将主角hp进行更新
测试成功。