[玩转UE4/UE5动画系统>技能系统(GAS)篇] 三 影响 Gameplay Effect(GE)

2023-11-09 09:31

本文主要是介绍[玩转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)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/375313

相关文章

Windows系统宽带限制如何解除?

《Windows系统宽带限制如何解除?》有不少用户反映电脑网速慢得情况,可能是宽带速度被限制的原因,只需解除限制即可,具体该如何操作呢?本文就跟大家一起来看看Windows系统解除网络限制的操作方法吧... 有不少用户反映电脑网速慢得情况,可能是宽带速度被限制的原因,只需解除限制即可,具体该如何操作呢?本文

CentOS和Ubuntu系统使用shell脚本创建用户和设置密码

《CentOS和Ubuntu系统使用shell脚本创建用户和设置密码》在Linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设置密码,本文写了一个shell... 在linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设

电脑找不到mfc90u.dll文件怎么办? 系统报错mfc90u.dll丢失修复的5种方案

《电脑找不到mfc90u.dll文件怎么办?系统报错mfc90u.dll丢失修复的5种方案》在我们日常使用电脑的过程中,可能会遇到一些软件或系统错误,其中之一就是mfc90u.dll丢失,那么,mf... 在大部分情况下出现我们运行或安装软件,游戏出现提示丢失某些DLL文件或OCX文件的原因可能是原始安装包

电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案

《电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案》最近有不少兄弟反映,电脑突然弹出“mfc100u.dll已加载,但找不到入口点”的错误提示,导致一些程序无法正... 在计算机使用过程中,我们经常会遇到一些错误提示,其中最常见的就是“找不到指定的模块”或“缺少某个DL

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

Linux系统之主机网络配置方式

《Linux系统之主机网络配置方式》:本文主要介绍Linux系统之主机网络配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、查看主机的网络参数1、查看主机名2、查看IP地址3、查看网关4、查看DNS二、配置网卡1、修改网卡配置文件2、nmcli工具【通用

Linux系统之dns域名解析全过程

《Linux系统之dns域名解析全过程》:本文主要介绍Linux系统之dns域名解析全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、dns域名解析介绍1、DNS核心概念1.1 区域 zone1.2 记录 record二、DNS服务的配置1、正向解析的配置

Linux系统中配置静态IP地址的详细步骤

《Linux系统中配置静态IP地址的详细步骤》本文详细介绍了在Linux系统中配置静态IP地址的五个步骤,包括打开终端、编辑网络配置文件、配置IP地址、保存并重启网络服务,这对于系统管理员和新手都极具... 目录步骤一:打开终端步骤二:编辑网络配置文件步骤三:配置静态IP地址步骤四:保存并关闭文件步骤五:重