本文主要是介绍[玩转UE4/UE5动画系统>技能系统(GAS)篇] 三 影响 Gameplay Effect(GE),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
本教程采用图文教程+视频教程的多元化形式,我会为不同的知识点选择适当的表达方式。教程内容将同步免费发布于开发游戏的老王(知乎|CSDN)的专栏《玩转UE4/UE5动画系统》。教程中使用的资源及工程将以开源项目的形式更新到GitHub:玩转UE4上。
工程文件: 玩转UE4(GitHub)
0. 效果演示
演示视频: 技能系统 一 什么是技能系统
在本文中你将学到:
- 攻击和受击的基本原理。
- Gameplay Effect的基本使用。
- 一个GAS角色通过Gameplay Effect影响另一个GAS角色。
文章目录
- 0. 效果演示
- 1. 概要
- 2. 案例:用通过GE实现攻击及受击响应
- 2.1 攻击及受击响应原理
- 2.2 攻击:完善玩家角色的Attack技能
- 2.2.1 Trace For Target的实现
- 2.2.2 GE_Hit的实现
- 2.3 受击:为NPC添加一个挨打的被动技能
- 2.3.1 GA_OnHit技能
- 2.3.2 为NPC角色预加载GA_OnHit技能
- 3. 小结
1. 概要
Gameplay Effect(下文简称GE)这个词给人的第一反应酷似游戏特效,实际上翻译成影响更合适。这种影响可以是一个GAS角色施加到另一个GAS角色,也可以施加到自身。
其实GE就是GAS角色之间传递的消息。
GE是一个纯数据蓝图,有很多配置项目但不需要手写代码。所以实现一个Effect,大多数工作都集中在它的Details面板。
GE蓝图派生自GameplayEffect类,一般以GE_为前缀命名。
下面我们通过一个角色攻击和另一个角色受击并响应的效果,了解一下GE在GA之间的工作原理。
下文会用较多的篇幅顺便解释一下攻击和受击响应的原理,如果已经熟悉这部分内容可以选择性跳过。
2. 案例:用通过GE实现攻击及受击响应
2.1 攻击及受击响应原理
在《[玩转UE4/UE5动画系统>技能系统(GAS)篇] 二 技能 Gameplay Ability(GA)》中我们把GA_Attack实现了一半,GA_Attack被激活后播放一个挥拳的蒙太奇动画。在这个动画中并不是每一帧都能攻击对方,有效的攻击帧一般在手臂伸地最直的帧,我们会在这一帧让角色进行一个射线检测,碰撞到的对象就是攻击到的另一个角色。
我们在蒙太奇的这一帧上添加一个蒙太奇动画通知并命名为Hit。这个动画通知相当于一个标记,当检测到它,我们就让角色进行射线检测。
本实例项目中的动画素材取自虚幻官方<[中文直播]第31期|GAS插件介绍(入门篇) | 伍德 大钊>中提供的资源。
2.2 攻击:完善玩家角色的Attack技能
下图是Attack技能过程,其中1部分是上篇文章实现的,2和3是分别是射线检测和实施(传递)GE的过程。
攻击方的AbilitySystemComponent调用ApplyGameplayEffectToTaget将GE_Hit实施给受击方的AbilitySystemComponent。两个GAS角色都是通过AbilitySystemComponent对话的。
2.2.1 Trace For Target的实现
Trace For Target是我用C++实现的一个Blueprint Function Library,当然也可以像官方直播教程那样直接用蓝图实现。
#pragma once#include "CoreMinimal.h"
#include "RPGCharacterBase.h"
#include "Kismet/GameplayStatics.h"
#include "TraceFunctions.generated.h"/*** */
UCLASS()
class UTraceFunctions : public UBlueprintFunctionLibrary
{GENERATED_BODY()
public:UFUNCTION(BlueprintCallable, Category = "Trace Functions")static void TraceForTarget(const AActor* Actor,const float Distance,const EDrawDebugTrace::Type DrawDebugTrace,bool& Detected,ARPGCharacterBase*& Target);
};
#include "Library/TraceFunctions.h"
#include "Kismet/KismetMathLibrary.h"
#include "Kismet/KismetSystemLibrary.h"void UTraceFunctions::TraceForTarget(const AActor* Actor,const float Distance,const EDrawDebugTrace::Type DrawDebugTraceType,bool& Detected,ARPGCharacterBase*& Target)
{Detected = false;if(Actor != nullptr){const FVector Location = Actor->GetActorLocation();const FVector Forward = Actor->GetActorForwardVector();const FVector Start = Location;const FVector End = Start + Forward*Distance;const FRotator Orientation = UKismetMathLibrary::MakeRotFromX(Forward);TArray<TEnumAsByte<EObjectTypeQuery> > ObjectTypes;ObjectTypes.Add(static_cast<EObjectTypeQuery>(ECollisionChannel::ECC_Pawn));FHitResult Result;const TArray<AActor*> ActorsToIgnore;UKismetSystemLibrary::BoxTraceSingleForObjects(Actor,Start,End,FVector(0.0,50.0,90.0),Orientation,ObjectTypes,false,ActorsToIgnore,DrawDebugTraceType,Result,true);Target = Cast<ARPGCharacterBase>(Result.GetActor());Detected = Result.bBlockingHit&&Target!=nullptr;}
}
2.2.2 GE_Hit的实现
其实这里才是本文的重点,然而并不复杂。
GE有很多参数,每个项目具体含义大家可以参考这里《GASDocumentation》中的Gameplay Effects
本例中只需要在GE_Hit中做如下设置:
- 在GrantedTags的Added中添加Ability.Hit标签:当GE_Hit作用在GAS角色上时,自动为目标角色添加一个Ability.Hit标签(这个标签会当GE作用结束后自动去掉)。
- 将Duration Policy设为Has Duration:GE_Hit会作用在目标角色上一段时长。
- Scalable Float Magnitude设为0.1:GE_Hit作用时长为0.1秒。
2.3 受击:为NPC添加一个挨打的被动技能
2.3.1 GA_OnHit技能
受击效果也是用一个(受攻击)的蒙太奇实现的。
在本例中GA_OnHit是一个被动技能,所以我们需要为它设置一个触发方式(标签),如下图所示。这意味着,当所属GAS角色被添加了Ability.Hit标签时就会自动触发GA_OnHit技能。
2.3.2 为NPC角色预加载GA_OnHit技能
NPC方的继承关系依然如下图所示:
3. 小结
本文通过攻击和受击的小案例,帮助大家了解一下GA和GE之间的协作关系。同时我们也看到了,GA不仅可以主动召唤,也可以通过GE来被动触发。是不是感觉无穷的可能性正在向我们招手。GAS的威力还不止于此,在后续文章中,我们将继续深入了解GAS。
这篇关于[玩转UE4/UE5动画系统>技能系统(GAS)篇] 三 影响 Gameplay Effect(GE)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!