Unreal Engine 5 C++ Advanced Action RPG 九章笔记
第九章 Hero Special Abilities
2-Challenges Ahead(前方的挑战)
- 本次章节主要解决三件问题
- 怒气能力
- 特殊武器能力
- 治疗石
- 怒气能力
- 对于这个能力我们需要处理它的激活和持械状态,当没有怒气时应该取消该能力
- 当这个能力激活时,我希望角色是进入无敌状态的,不会受到伤害
- 怒气状态
- 获得怒气,游戏默认开始时,角色应该有一个空的怒气条,随着角色杀死敌人数量增多,怒气条慢慢填充
- 特殊武器能力
- 与翻滚相同,我们必须按多个输入键
- 处理伤害
- 处理冷却时间
- UI显示冷却时间
- 治疗石
- 敌人死后有几率生成
- 角色有拾取能力,可以使用它来恢复生命和怒气
3-Rage Ability Tags(怒气能力)
- 在开始创建标签之前,微重构一下之前
UWarriorAbilitySystemComponent
类中的OnAbilityInputPressed
函数中的逻辑
- 新建怒气能力的标签
4-Rage Ability Blueprint
- 新建怒气这个能力蓝图
- 只有装备了武器后才能激活此能力
- 运行结果
5-Rage Anim Montage
- 先制作蒙太奇
- 然后在能力蓝图中进行播放
- 注意在播放蒙太奇时,应当阻止其他的一些能力,例如:近战攻击、翻滚、卸下武器,播放蒙太奇时,是不能使用其他能力的
6-Rage Gameplay Cue
- 先解决一个问题,在近战敌人生成武器时,该能力就在之前激活了,这就导致了为什么我们可以在第一帧的时候看见启动武器
- 因此可以在生成武器的时候就隐藏一下
- 继续定义两个标签
- 在蒙太奇中监听这个事件,用来使用GC的
- 添加一个GC用来展现视觉效果
- 在能力中执行这个GC
7-Activation Condition(怒气能力状态下的激活条件)
- 在
UWarriorAttributeSet
中检查当前的怒气值给予相应的标签
- 在能力中添加激活这个能力所需要的的标签,并且当检查怒气值不是满的标签时取消此能力,添加激活无敌的标签
- 在我们应用伤害的GE中添加效果,当拥有无敌这个标签的时候,说明GE应用失败,那么是不会扣血的,也不会受击
- 因为之前逻辑就是这样写的
8-Consume Rage(消耗怒气)
- 在角色的曲线表格中新建两个数据,一个用来处理消耗速度,一个处理消耗周期
- 然后新建一个GE用来消耗怒气
- 在GA中进行应用这个GE
9-Set Up Rage Slash(设置狂暴砍杀)
- 在怒气状态下,攻击能产生剑气,并这种攻击会产生更高的伤害
- 继承之前的
BP_Projectile Base
蓝图,进行修改就行
10-Spawn Rage Slash
- 在角色的轻击基类中创建一个事件,用来当在怒气状态时就生成剑气,这个事件不用写逻辑,在继承的轻击中去写
- 在武器的骨骼中添加插槽,注意这个插槽X轴朝前
- 在角色的轻击GA中去生成剑气
- 在轻击的蒙太奇中通知这个标签
11-On Rage Slash Begin Overlap
- 让剑气可以命中多个敌人,穿透伤害
- 补齐之前
AWarriorProjectileBase
类中的OnProjectileBeginOverlap
函数逻辑即可
12-Rage Slash For All Attacks
- 将这个剑气攻击添加到所有的轻攻击与重攻击上,看看就行
13-Gain Rage(给予怒气)
- 新建恢复怒气的数据
- 新建GE,用来恢复怒气
- 然后在轻击与重击命中敌人后应用到了伤害,执行这个GE进行恢复怒气
14-Special Weapon Ability Tags(武器的特殊能力,技能)
- 定义特殊武器能力的标签
- 创建能力蓝图,此能力激活时,我们无法使用任何能力,并且是无敌状态
- 新建这个特殊能力的操作,这是个组合按键操作,必须要同时触发两个按键才能释放
- 给予能力
15-Grant Special Weapon Ability
- 在标签中添加新的标签作为技能的冷却标识
- 新建一个新的结构体,用来存放特殊能力的CD与图标
- 修改了FWarriorHeroWeaponData,那么就要去UWarriorAbilitySystemComponent中修改我们之前写的给予角色武器能力函数了
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "AbilitySystemComponent.h"
#include "WarriorTypes/WarriorStructTypes.h"
#include "WarriorAbilitySystemComponent.generated.h"
/**
*
*/
UCLASS()
class WARRIOR_API UWarriorAbilitySystemComponent : public UAbilitySystemComponent
{
GENERATED_BODY()
public:
void OnAbilityInputPressed(const FGameplayTag& InInputTag);
void OnAbilityInputReleased(const FGameplayTag& InInputTag);
// meta = (ApplyLevel = "1")可以给ApplyLevel赋默认值
UFUNCTION(BlueprintCallable, Category = "Warrior|Ability", meta = (ApplyLevel = "1"))
void GrantHeroWeaponAbilities(const TArray<FWarriorHeroAbilitySet>& InDefaultWeaponAbilities, const TArray<FWarriorHeroSpecialAbilitySet>& In