[玩转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

相关文章

JWT + 拦截器实现无状态登录系统

《JWT+拦截器实现无状态登录系统》JWT(JSONWebToken)提供了一种无状态的解决方案:用户登录后,服务器返回一个Token,后续请求携带该Token即可完成身份验证,无需服务器存储会话... 目录✅ 引言 一、JWT 是什么? 二、技术选型 三、项目结构 四、核心代码实现4.1 添加依赖(pom

sysmain服务可以禁用吗? 电脑sysmain服务关闭后的影响与操作指南

《sysmain服务可以禁用吗?电脑sysmain服务关闭后的影响与操作指南》在Windows系统中,SysMain服务(原名Superfetch)作为一个旨在提升系统性能的关键组件,一直备受用户关... 在使用 Windows 系统时,有时候真有点像在「开盲盒」。全新安装系统后的「默认设置」,往往并不尽编

基于Python实现自动化邮件发送系统的完整指南

《基于Python实现自动化邮件发送系统的完整指南》在现代软件开发和自动化流程中,邮件通知是一个常见且实用的功能,无论是用于发送报告、告警信息还是用户提醒,通过Python实现自动化的邮件发送功能都能... 目录一、前言:二、项目概述三、配置文件 `.env` 解析四、代码结构解析1. 导入模块2. 加载环

linux系统上安装JDK8全过程

《linux系统上安装JDK8全过程》文章介绍安装JDK的必要性及Linux下JDK8的安装步骤,包括卸载旧版本、下载解压、配置环境变量等,强调开发需JDK,运行可选JRE,现JDK已集成JRE... 目录为什么要安装jdk?1.查看linux系统是否有自带的jdk:2.下载jdk压缩包2.解压3.配置环境

Linux查询服务器系统版本号的多种方法

《Linux查询服务器系统版本号的多种方法》在Linux系统管理和维护工作中,了解当前操作系统的版本信息是最基础也是最重要的操作之一,系统版本不仅关系到软件兼容性、安全更新策略,还直接影响到故障排查和... 目录一、引言:系统版本查询的重要性二、基础命令解析:cat /etc/Centos-release详

更改linux系统的默认Python版本方式

《更改linux系统的默认Python版本方式》通过删除原Python软链接并创建指向python3.6的新链接,可切换系统默认Python版本,需注意版本冲突、环境混乱及维护问题,建议使用pyenv... 目录更改系统的默认python版本软链接软链接的特点创建软链接的命令使用场景注意事项总结更改系统的默

在Linux系统上连接GitHub的方法步骤(适用2025年)

《在Linux系统上连接GitHub的方法步骤(适用2025年)》在2025年,使用Linux系统连接GitHub的推荐方式是通过SSH(SecureShell)协议进行身份验证,这种方式不仅安全,还... 目录步骤一:检查并安装 Git步骤二:生成 SSH 密钥步骤三:将 SSH 公钥添加到 github

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方

Linux系统之lvcreate命令使用解读

《Linux系统之lvcreate命令使用解读》lvcreate是LVM中创建逻辑卷的核心命令,支持线性、条带化、RAID、镜像、快照、瘦池和缓存池等多种类型,实现灵活存储资源管理,需注意空间分配、R... 目录lvcreate命令详解一、命令概述二、语法格式三、核心功能四、选项详解五、使用示例1. 创建逻

使用Python构建一个高效的日志处理系统

《使用Python构建一个高效的日志处理系统》这篇文章主要为大家详细讲解了如何使用Python开发一个专业的日志分析工具,能够自动化处理、分析和可视化各类日志文件,大幅提升运维效率,需要的可以了解下... 目录环境准备工具功能概述完整代码实现代码深度解析1. 类设计与初始化2. 日志解析核心逻辑3. 文件处