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

相关文章

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地址步骤四:保存并关闭文件步骤五:重

Windows系统下如何查找JDK的安装路径

《Windows系统下如何查找JDK的安装路径》:本文主要介绍Windows系统下如何查找JDK的安装路径,文中介绍了三种方法,分别是通过命令行检查、使用verbose选项查找jre目录、以及查看... 目录一、确认是否安装了JDK二、查找路径三、另外一种方式如果很久之前安装了JDK,或者在别人的电脑上,想

Linux系统之authconfig命令的使用解读

《Linux系统之authconfig命令的使用解读》authconfig是一个用于配置Linux系统身份验证和账户管理设置的命令行工具,主要用于RedHat系列的Linux发行版,它提供了一系列选项... 目录linux authconfig命令的使用基本语法常用选项示例总结Linux authconfi

Nginx配置系统服务&设置环境变量方式

《Nginx配置系统服务&设置环境变量方式》本文介绍了如何将Nginx配置为系统服务并设置环境变量,以便更方便地对Nginx进行操作,通过配置系统服务,可以使用系统命令来启动、停止或重新加载Nginx... 目录1.Nginx操作问题2.配置系统服android务3.设置环境变量总结1.Nginx操作问题

CSS3 最强二维布局系统之Grid 网格布局

《CSS3最强二维布局系统之Grid网格布局》CS3的Grid网格布局是目前最强的二维布局系统,可以同时对列和行进行处理,将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局,本文介... 深入学习 css3 目前最强大的布局系统 Grid 网格布局Grid 网格布局的基本认识Grid 网

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创