16_156~166Combat
156 Actor ComponentsActor组件
Creating Our Own Custom Components创建我们自己的自定义组件
创建自定义组件,可以专门包含一些功能,例如生命值,Gold,XP 等等
在UE中创建一个Actor Component的C++类

给这个类添加生命值属性

然后我们给Enemy类添加这个组件


编译之后就可以在UE中看到敌人有新添加的组件

157 Widget Components小工具组件
Creating a Health Bar for the Enemy为敌人创建一个健康条


创建一个UHealthBarComponent类,命名为HeathBarComponent //视频里面这里错了,应该是UHealthBarComponent 不是UWidgetComponent
然后先给Enemy类添加一个UHealthBarComponent组件,绑定在root根上(需要添加UMG模块,添加头文件)


//注:这里创建的也应该是UHealthBarComponent类,而不是UWidgetComponent
编译代码之后,就可以在UE中看到Enemy多了一个组件,将之前新建的HealthBar UI添加至组件


158 User Widget Class用户小工具类
C++ Class for our Health Bar Widget用于我们的健康栏小工具的C++类
创建一个UserWidget类,命名为HealthBar类

在HealthBar类中,新建UProgressBar对象,

编译之后,回到UE中,打开WBP_HealthBar,我们需要修改父类

修改3 ,为创建的HealthBar
这里C++类的名字应该与空间中原来默认的名字相同
否则C++将无法控制到这个进度条组件
159 Setting the health Percent设置健康百分比
Accessing the HealthBar UserWidget in C++在C++中访问健康条的用户小部件
在UHealthBarComponent中


在Enemy类中


编译之后,回到UE中执行,就可以看到在enemy类中,可以设置血条显示

160 Damage伤害
UE中内置了伤害方式


因为使用TakeDamage需要使用actor和一个controller,所以我们需要在装备武器的时候,将对应的信息传入Weapon类中
给Equip方法添加了两个传入参数

在方法中设置这两个参数

然后在Character类中,EPressKey方法中,传入

在UAttributeComponent类中,创建两个方法,用于更新血条进度 和 在受到伤害后更新血量


然后我们在武器命中方法中,使用UGameplayStatics::ApplyDamage()添加伤害

在Enemy中,使用TakeDamage,接受收到伤害的方法
编译代码
然后来到UE中,我们需要设置场景中Enemy的Health和MaxHealth

运行游戏,攻击敌人,可以看到血量减少
161 Custom Health Bars自定义健康条
Spicing up the HUD 为HUD增色
用自己的图片替换掉系统默认的进度条样式
162 Enemy Death Animations死亡动画
Animations for Enemy Death
从mixamo导入死亡动画,从blander转换一下 使其有root根动画
将转换好的动画导入UE,并创建一个Paladin_Death的动画蒙太奇,将动画加入AM中
一定要记得在编辑器里,编辑好蒙太奇动画后,需要去点一下那个清除!

163 EnemyDeath敌人的死亡
Deading Some Fools欺骗一些愚蠢的人
在Enemy中,新建蒙太奇变量,新建一个方法处理角色死亡

在UAttributeComponent中,添加一个方法判断角色生命值是否大于0

实现Die方法

然后在GetHit_Implementation方法中,将之前判断角色受击动画用if包含起来,先判断角色是否死亡
如果没有则处理受击事件(播放受击动画,扣除血量),否则处理死亡事件(播放死亡动画,处理Enemy的Actor消失)

164 Death Poses死亡姿势
Making the Enemy Stay Down!让敌人躺在地
将之前准备的死亡动画,最后一帧提取为新的动画

准备好之后,来到ABP_Paladin的动画蓝图


我们可以在动画蓝图事件中这么操作,让动画每一帧都去设置DeatPose的值,但是这样效率很低

所以我们删掉这些
我们创建一个Blueprint Thread safe Update Animation


获取对象变量信息


将Deathpose提升为变量


进入规则界面


设置Death里面的动画 使用Blend pose 加上 EDeathPose的枚举名称


前面的事件图表也是必要的

165 Polishing Enemy Death完善敌人的死亡
Finishing Touches on Enemy Death敌人之死的收尾工作
1 去掉Enemy的胶囊体碰撞
在Die方法中添加
2 在击中敌人后才显示血条,死亡后不显示
首先设置默认不显示血条

然后再GetHit方法中,设置true
死亡后把血条设置false
敌人死亡后,关闭SkeletaMesh的碰撞,避免死亡后尸体还是会被武器打中,继续播放死亡动画

3 设置敌人在一段时间没有被攻击后,血条隐藏
他的思路是,声明一个AActor变量,如果被攻击,则将攻击对象(玩家)复制给这个Actor
然后不停检测敌人与Actor的距离,如果超过XXX则隐藏血条

