[玩转UE4/UE5动画系统>技能系统(GAS)篇] 二 技能 Gameplay Ability(GA)
本教程采用图文教程+视频教程的多元化形式,我会为不同的知识点选择适当的表达方式。教程内容将同步免费发布于开发游戏的老王(知乎|CSDN)的专栏《玩转UE4/UE5动画系统》。教程中使用的资源及工程将以开源项目的形式更新到GitHub:玩转UE4上。
工程文件: 玩转UE4(GitHub)
0. 效果演示
演示视频: 技能系统 一 什么是技能系统
在本文中你将学到:
- GAS系统开发环境的配置
- 在一个Actor(Character)上配置GAS组件
- 用Effect实现两个简单的主动技能Jump和Attack
本教程提供的示例项目参照了官方提供的ActionRPG项目,你可以从虚幻启动器中下载到该项目。当然也可以直接通过我提供的精简版项目学习,我的项目中借用了虚幻官方<[中文直播]第31期|GAS插件介绍(入门篇) | 伍德 大钊>中的动画素材。
文章目录
- 0. 效果演示
- 1. 概要
- 2. 准备工作
- 2.1 启动插件
- 2.2 添加编译模块
- 3. 实现RPGChracterBase
- 4. 案例:实现Jump技能和Attack技能
- 4.1 Jump技能
- 4.2 Attack技能
- 4.3 加载技能
- 5. 调用技能
- 5.1 声明GameplayTag
- 5.2 为每个技能指派相应的标签
- 5.2.1 Jump技能的标签
- 5.2.2 Attack技能的标签
- 5.3 在BP_PlayerCharacter中调用技能
- 6. 小结
1. 概要
下面是项目中的角色类图,这种实现方式也参考了官方的ActionRPG项目,使用C++继承ACharacter基类并实现IAbilitySystemInterface
接口的得到ARPGCharacter,然后再派生出一个蓝图类BP_Character,接下来的玩家角色和NPC都由蓝图类派生。个人也比较推荐这种继承模式和C++/蓝图的工作分配模式,因为除了ARPGCharacter必须由C++实现以外,其它很多工作都可以用蓝图完成,并且GAS系统中有大量的GameplayTag以及参数的配置工作,如下架构可以作为GAS开发的最佳实践方案。
2. 准备工作
目前在UE4/5中GAS还是以插件的形式存在,所以开发之前要先进行一些必要的配置。
2.1 启动插件
在编辑器的Plugins中开启Gameplay Abilities插件
2.2 添加编译模块
在*.Build.cs文件中添加必要的编译模块,否则无法通过编译
添加如下模块
PrivateDependencyModuleNames.AddRange(new string[] {"GameplayAbilities","GameplayTasks" ,"GameplayTags"});
3. 实现RPGChracterBase
#pragma once#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "AbilitySystemInterface.h"
#include "RPGCharacterBase.generated.h"UCLASS()
class ARPGCharacterBase : public ACharacter,public IAbilitySystemInterface
{GENERATED_BODY()public:ARPGCharacterBase();virtual void BeginPlay() override;
protected:UPROPERTY(VisibleAnywhere,BlueprintReadOnly,Category = "Character Abilities")class UAbilitySystemComponent* AbilitySystemComponent;UPROPERTY(EditAnywhere,BlueprintReadWrite, Category = "Character Abilities")TArray<TSubclassOf<class UGameplayAbility>> PreloadedAbilities;
public:virtual UAbilitySystemComponent* GetAbilitySystemComponent() const override;};
如我们所见,实现最基础的GAS系统非常简单,只要实现IAbilitySystemInterface
接口就可以了。IAbilitySystemInterface
接口,而这个接口最重要的作用就是实现一个GetAbilitySystemComponent
方法。如我在本系列第一篇文章《什么是技能系统》所说,AbilitySystemComponent是技能的容器、管理器以及各个GAS角色之间对话的桥梁。
上面代码中还添加了一个PreloadedAbilities
字段,它是一个数组,我们可以预先为角色添加一些预加载技能。使得角色诞生时就会拥有一些技能,但是它并不是必须的。因为GAS允许我们在游戏运行时随时随地为角色动态地加载或卸载技能。
#include "RPG/Public/RPGCharacterBase.h"
#include "AbilitySystemComponent.h"ARPGCharacterBase::ARPGCharacterBase()
{PrimaryActorTick.bCanEverTick = true;AbilitySystemComponent = CreateDefaultSubobject<UAbilitySystemComponent>(TEXT("AbilitySystem"));
}UAbilitySystemComponent* ARPGCharacterBase::GetAbilitySystemComponent() const
{return AbilitySystemComponent;
}// Called when the game starts or when spawned
void ARPGCharacterBase::BeginPlay()
{Super::BeginPlay();if(AbilitySystemComponent != nullptr){if(PreloadedAbilities.Num() > 0){for(auto i =0;i < PreloadedAbilities.Num(); i++){if(PreloadedAbilities[i] != nullptr){AbilitySystemComponent->GiveAbility(FGameplayAbilitySpec(PreloadedAbilities[i].GetDefaultObject(),1,0));}}}AbilitySystemComponent->InitAbilityActorInfo(this,this);}
}
请注意上面代码中的AbilitySystemComponent->GiveAbility(FGameplayAbilitySpec(PreloadedAbilities[i].GetDefaultObject(),1,0));
部分,把技能放在PreloadedAbilities
中并不代表角色拥有技能,GiveAbility
(授予技能)才是让角色的AbilitySystemComponent
获得(或学习到)技能。
有朋友可能会问,这样一股脑地把技能加载到
AbilitySystemComponent
中,我们以后该如何调用它们呢?方法其实超级简单,不过先卖个关子,一会儿介绍。
上述代码编译过后,角色就拥有了GAS组件以及预加载技能的数组。
4. 案例:实现Jump技能和Attack技能
在UGameplayAbility
中可以获取到Actor以及其各个组件的引用,因此小到跳跃达到必杀技等等都可以用技能实现。所以除了基本移动这种通用逻辑不推荐使用技能实现,其它所有技能都可以放到技能中,这样既能够让逻辑解耦合又可以方便我们自由装卸。本文中的Jump和Attack技能仅为示例,帮助初学者了解GAS的工作原理。
4.1 Jump技能
技能(Ability)的实现可以使用C++也可以使用蓝图,本例中的两个技能都是使用蓝图实现的。
新建一个派生自GameplayAbility的蓝图类,并命名为GA_Jump(技能蓝图一般以GA_开头)
Jump的逻辑非常简单
实际上在技能系统的插件中开发者已经帮我们用C++实现了一个Jump技能。
- ActivateAbility即当技能被激活时触发的事件,OnEndAbility是结束技能时触发的事件。
- 在
UGameplayAbility
中通过GetActorInfo
可以获取到所属角色的信息 - 一个技能一旦被激活,如果不在技能内部调用EndAbility或者在外部终止技能,技能是不会自动终止并一直保持在激活状态,这点一定要注意。
4.2 Attack技能
新建一个派生自GameplayAbility的蓝图类,并命名为GA_Attack。
Attack技能的逻辑也非常简单,仅仅是播放一个角色挥拳动画的蒙太奇,结束以后终止技能。
别忘了在动画蓝图中添加蒙太奇的Slot
4.3 加载技能
实现完技能以后别忘了把它们放到BP_PlayerCharacter的PreloadedAbilities
,这样当程序启动,他们就会自动加载到AbilitySystemComponent
里面。
5. 调用技能
如何调用技能?是时候揭晓谜底了,可以使用GameplayTag!
当然,调用技能还有很多其它方法,老王觉得用GameplayTag召唤技能是最灵活的一种方式,那么其它方法就留给大家自己解锁吧。
5.1 声明GameplayTag
在Project Settings中添加或编辑GameplayTag,需要注意的是当未来技能很多很复杂的时候标签系统也会变得复杂,因此如何为自己的游戏定义标签系统是一个值得好好规划的问题。
本例中我在Ability父级标签下定义了两个子标签分别对应着Jump和Attack技能。
5.2 为每个技能指派相应的标签
在GAS中GameplayTag定义着技能之间相生相克的关系,每个标签的具体含义大家可以参考这里《GASDocumentation》中的Ability Tags
5.2.1 Jump技能的标签
- Ability Tags: 召唤或取消这个技能所需的标签,可以理解为这个技能的名字或种类名。
- Block Abilities with Tag:是指当这个技能被激活时,拥有该标签的其它标签将不能被激活,我把它设为Ability.Jump是为了防止当一个跳跃技能未完成前再次触发一个跳跃技能。
5.2.2 Attack技能的标签
Attack技能的标签和Jump逻辑基本相同。
主要是这个例子很简单,当技能多了,相生相克关系也会随之复杂。
5.3 在BP_PlayerCharacter中调用技能
在BP_PlayerCharacter中直接用GameplayTag就可以召唤出相应的技能,是不是超级简单?
为什么Activate Ability 前面要加个Try呢?因为我们召唤技能以后技能到底能不能被激活还要受到和它相生相克的其它因素(标签)所制约,所以我们只能Try一下。
6. 小结
经过上述几个简单的步骤,我们就用GAS实现两个小技能。是不是很简单?但是这个示例还远远没有体现出GAS的威力,而且Jump和Attack都是我们主动召唤的,下一篇文章我们将了解如何轻松实现一个被动技能,并且学会使用Effect进行GAS角色之间的对话。
[玩转UE4/UE5动画系统>技能系统(GAS)篇] 二 技能 Gameplay Ability(GA)相关推荐
- [玩转UE4/UE5动画系统>应用篇>功能模块] 之 ALS V4地面站立动作状态机详解
本教程采用图文教程+视频教程的多元化形式,我会为不同的知识点选择适当的表达方式.教程内容将同步免费发布于 开发游戏的老王(知乎|CSDN)的专栏<玩转UE4/UE5动画系统>.教程中使用的 ...
- [玩转UE4/UE5动画系统>Control Rig篇] 之 Control Rig + Fullbody IK版的足部IK实现(附项目代码)
本教程采用图文教程+视频教程的多元化形式,我会为不同的知识点选择适当的表达方式.教程内容将同步免费发布于开发游戏的老王(知乎|CSDN)的专栏<玩转UE4/UE5动画系统>.教程中使用的资 ...
- [玩转UE4/UE5动画系统>Control Rig篇] 之 使用Control Rig实现目标偏移(Aim Offset)(附项目代码)
本教程采用图文教程+视频教程的多元化形式,我会为不同的知识点选择适当的表达方式.教程内容将同步免费发布于开发游戏的老王(知乎|CSDN)的专栏<玩转UE4/UE5动画系统>.教程中使用的资 ...
- [玩转UE4/UE5动画系统>应用篇>功能模块] 之 ALS V4 主状态机详解
本教程采用图文教程+视频教程的多元化形式,我会为不同的知识点选择适当的表达方式.教程内容将同步免费发布于 开发游戏的老王(知乎|CSDN)的专栏<玩转UE4/UE5动画系统>.教程中使用的 ...
- [玩转UE4/UE5动画系统>应用篇>功能模块] 之 Foot IK系统(ALS V4实现方案详解)
本教程采用图文教程+视频教程的多元化形式,我会为不同的知识点选择适当的表达方式. 教程内容将同步免费发布于 开发游戏的老王(知乎|CSDN)的专栏<玩转UE4/UE5动画系统>. 教程中使 ...
- [玩转UE4/UE5动画系统>应用篇>功能模块] 之 布娃娃系统(ALS V4实现方案详解)
本教程采用图文教程+视频教程的多元化形式,我会为不同的知识点选择适当的表达方式. 教程内容将同步免费发布于 开发游戏的老王(知乎|CSDN)的专栏<玩转UE4/UE5动画系统>. 教程中使 ...
- [玩转UE4动画系统]教程的大纲及设计思路
本教程采用图文教程+视频教程的多元化形式,我会为不同的知识点选择适当的表达方式. 教程内容将同步免费发布于 开发游戏的老王(知乎|CSDN)的玩转UE4动画系统 专栏. 教程中使用的资源及工程将以开源 ...
- 《守望先锋》中网络脚本化的武器和技能系统
在GDC2017[Networking Scripted Weapons and Abilities in Overwatch]的分享会上,来自暴雪的Dan Reed介绍了<守望先锋>中网 ...
- Unity 如何实现一个强大的MMO技能系统!
1. 如何实现一个强大的MMO技能系统-序章 前言 技能系统可以说是游戏中广泛存在而又最重要的系统了,它是整个游戏战斗体验的核心.一套强大的技能系统可以让游戏的策略性,可玩性得到极大的提升.然而技能系 ...
- buff系统 游戏中_如何实现一个强大的MMO技能系统——BUFF
前言 Buff模块可以说是技能中最核心又最复杂的系统了.一个优秀的Buff系统能够让策划的创意得到最大限度的发挥,大幅增强游戏的战斗深度和可玩性,并且同时也能让开发者轻易的扩展维护,支持更多的效果和功 ...
最新文章
- linux sshd cpu 过高 问题解决
- 收藏 | 这100+个免费API,免了自己去爬的烦恼!
- vue 判断是否位 float_VUE中条件注释法css,判断ie浏览器
- 关于Async与Await的FAQ
- Exception in thread “main“ org.apache.hadoop.hbase.client.RetriesExhaustedException: Can‘t get the l
- 一次代码审计实战案例【思路流程】
- android 单位转换工具,Android单位转换----常用单位转换工具类
- __attribute__((always_inline))
- 微信小程序|开发实战篇之request请求(单个、多个参数,json对象,header)
- Spring缓存注解@CachePut , @CacheEvict,@CacheConfig使用
- 350.两个数组的交集II
- kafka 并发数配置过程中踩到的坑 InstanceAlreadyExistsException Error registering AppInfo mbean
- SSM框架原理以及流程简略
- 三维微分方程组四阶龙格库塔求解
- excel宏编程 c语言,宏(巨集)
- 项目时间和本地时间差8小时的问题
- 万恶的ie8 hack问题
- 在word或wps中使用宏代码自动生成手写体
- Python怎么进行时区的转换
- 【oracle】oracle创建表、创建索引、创建自增id
热门文章
- Visual Studio 2013 旗舰版正式版密钥
- Rhino6.25软件安装教程|兼容WIN10
- 计算机 澳洲 博士后 要考雅思么,博士后移民澳大利亚(澳洲做科研博士后)
- 《隐私保护周三见》86问 | 交流群互动合集
- springMVC文件的上传和页面静态化技术
- 兼容win7桌面待办软件 美化桌面的待办小工具
- 安装完固态硬盘后计算机里没显示,安装了双硬盘电脑却不显示新硬盘怎么办
- 神舟笔记本风扇声音很大怎么办
- Points、inches和EMUs:Office Open XML中的度量单位
- win10 + chrome 死机问题处理