在上一篇文章中,我们实现了新的功能,现在可以创建多个普通攻击动画,并且可以根据你所使用的普通攻击动画,设置不同的攻击位置。比如,你使用武器,那么攻击位置需要从武器上获取,如果你没有持有武器,使用双手攻击,那么,需要从双手中的某一只去获取攻击位置。
在这一篇文章中,我们增加一个新的敌人,它没有武器,靠双手攻击,我们给它两个攻击动画,一个是左手攻击,另一个是右手攻击,来测试我们之前实现的功能是否隐藏了某些bug。而且还能回忆一下之前是如何创建一个敌人的所有数据的。
创建角色蓝图和动画蓝图
首先,创建一个新的文件夹,新的怪物是食尸鬼所以我们新的文件夹取名Ghoul
所有的敌人都是继承于敌人蓝图基类,我们基于它创建子蓝图类
相应的,我们也需要一个动画蓝图子蓝图
使用的骨架选择食尸鬼的骨架
将创建的这两个蓝图拖入到Ghoul文件夹中
打开蓝图,设置食尸鬼的模型
然后修改它的朝向和位置,注意蓝色箭头,那是正前方的方向,我们再适当修改一下胶囊体
在动画蓝图这里,我们需要设置它的混合控件,就是角色根据速度改变移动的动画
我们右键新建一个混合控件
选择食尸鬼的骨架
改名为BS_Ghoul_IdleRun,用来设置混合待机和移动的混合空间
打开设置一个速度的水平坐标
把动画拖入进入,按Shift键,可以吸附到固定位置,按ctrl可以查看过渡效果,按ctrl+alt键可以查看混合的比例。
按照之前的做法把平滑设置为4,这样行为树切换的时候,也不会显得很生硬。
创建完成,设置到食尸鬼的动画蓝图内
然后将修改后的动画蓝图设置给角色蓝图
制作角色使用蒙太奇
我们将角色使用蓝图和动画蓝图制作完成以后,下一步就是制作角色使用的攻击蒙太奇和受击蒙太奇
创建蒙太奇在动画身上创建即可
我们先创建受击蒙太奇,将其命名为AM_HitReact_Ghoul
按照之前的做法,不需要额外制作其它内容,设置上去
对于攻击动画蒙太奇,我们需要添加骨骼插槽,来用于获取攻击时的伤害范围,我们要打开它的骨骼,然后在骨骼需要的位置添加插槽
在左右手上添加一个插槽
如果感觉位置有问题,还可以调整插槽的位置,这样我们就有了获取攻击范围的骨骼插槽位置了。
我们创建攻击左右手的两个蒙太奇
攻击动画必须要设置支持根运动
按照之前的做法,我们需要添加两个事件,一个是Motion Wraping攻击旋转朝向的事件,另一个是对攻击造成伤害的通知。(这里有个小技巧,你如果在拖拽范围的时候,需要实时查看动作,可以按住shift键,动画会跟随你的拖拽进行移动)
MotionWarping的设置还是老一套,只修改朝向,事件为FacingTarget
通知这里是我们之前写的标签通知,这里修改Tag即可
蒙太奇创建完成,我们就可以设置角色的攻击蒙太奇,它可以增加两个,分别是左右手的攻击
其它注意事项
有些我们直接从敌人基类继承过来的,实际上需要我们注意的,虽然我们修改成了默认值
角色类型我们设置为战士
添加AI行为树
添加转向MotionWarping组件,和设置事件,这些都是我们在敌人基类实现的
修改移动速度,我们在角色基类代码里面,将BaseWalkSpeed修改为可蓝图更改
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Combat")
float BaseWalkSpeed = 250.f; //当前角色的最大移动速度
然后在蓝图中修改移动速度
还有就是敌人的标签,用于区分敌我
角色的旋转,我们默认设置的是旋转朝向运动方向,这里还可以调整旋转速率
记得关闭使用控制器控制旋转
一些需要处理的问题
就是我们在触发攻击后就结束了技能,其实在某些情况下,它还没有把动画播放完成,所以,我们将触发事件后结束技能事件节点删除
因为我们在蒙太奇结束时,调用了触发结束技能
处理敌我不分的问题
我们现在还没有实现判断攻击的角色是否为友军,所以,我们接下来要实现这个功能。
要实现这个功能不难,我们之前在角色身上设置的定义标签,可以以此来实现此功能,我们可以在蓝图中,使用ActorHasTag来判断攻击到的敌人是否包含此标签来规避伤害到友军
如果在蓝图中实现这个功能会连成盘丝洞,所以,我们在代码中实现它,在蓝图函数库中创建一个函数,用于传入两个Actor判断它们是否为友军,我们增加一个函数,用于判断双方是否为敌对势力,这里我们修改成BlueprintPure,让其成为没有引脚的静态函数。
//获取双方是否为敌对势力
UFUNCTION(BlueprintPure, Category="RPGAbilitySystemLibrary|GameplayMechanics")
static bool IsNotFriend(AActor* FirstActor, AActor* SecondActor);
接下来在实现中,如果第一个Actor含有Player标签,那么需要判断第二个角色不包含Player标签,那么它们就是敌人。我们这种后续还可以扩展,比如增加更多的势力,可以在这里更新。
bool URPGAbilitySystemBlueprintLibrary::IsNotFriend(AActor* FirstActor, AActor* SecondActor)
{
if(FirstActor->ActorHasTag("Player"))
{
return !SecondActor->ActorHasTag("Player");
}
if(FirstActor->ActorHasTag("Enemy"))
{
return !SecondActor->ActorHasTag("Enemy");
}
return false;
}
在攻击技能蓝图中,增加判断是否为敌对势力
添加溶解材质
我们还需要添加死亡时,敌人尸体溶解掉的效果,按照之前的创建方式
材质这里修改成Masked模式
将溶解节点拷贝进来,连上自发光和Mask的线,注意,基础材质要保证它是正常渲染的。
然后基于材质创建一个材质实例
在材质实例里面修改溶解的开始和结束,这样,方便一个参数修改溶解
调整完成,Dissolve在0时,是正常显示
保证调整Dissolve数值为1时,完全溶解掉
将材质设置给食尸鬼蓝图,它没有武器,所以我们不需要设置武器
运行查看击杀后,是否溶解效果正确