UE GAS基础

使用GAS

启用插件Gameplay Ability。

在*.Build.cs中的PublicDependencyModuleNames.AddRange(new string[]后面的大括号里添加”GameplayAbilities” , “GameplayTags” , “GameplayTasks”。

AbilitySystem组件

要使用gas需要在该角色里面添加组件AbilitySystem组件。

在c++类中添加能力系统组件

#include "AbilitySystemComponent.h"
#include "AbilitySystemInterface.h"

class MYCPPLEARN_API AMyCharacterBase : public ACharacter , public IAbilitySystemInterface
{
public:

	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Abilities")
	class UAbilitySystemComponent* AbilitySystemComponent;
	UAbilitySystemComponent* GetAbilitySystemComponent()const override;
}

再到构造函数里添加

AbilitySystemComponent = CreateDefaultSubobject<UAbilitySystemComponent>(TEXT("AbilitySystem"));

再实现函数

UAbilitySystemComponent* AMyCharacterBase::GetAbilitySystemComponent()const
{ 
	return AbilitySystemComponent; 
}

Gameplay Ability(GA)

Gameplay Ability(GA)标识了游戏中一个对象(Actor)可以做的行为或技能。 能力(Ability)可以是普通攻击或者吟唱技能,可以是角色被击飞倒地,还可以是使用 某种道具,交互某个物件,甚至跳跃、飞行等角色行为也可以是Ability。

快速创建GA:右键内容管理器,蓝图-Gameplay技能蓝图。

如果能够释放技能,首先需要拥有技能。调用 Give Ability 函数,赋予Character一个技能。可使用蓝图节点:give ability。

释放技能主动调用

  • Try Activate Ability
  • Try Activate Ability by Class
  • Try Activate Ability by Tag

如果使用Try Active Ability,需要在调用 Give Ability 时,记录它的返回值 Gameplay Ability Spec Handle,然后应用于 Try Active Ability 的参数中;如果使用Try Active Ability By Class,可以新建一个继承于 Gameplay Ability 类的蓝图类,然后在 In Ability to Activate 中就可以添加刚刚新创建的蓝图类,然后就能释放技能了,这是最为简单的使用方式。

一般GA要做的事有:

  • 设置GA的Tag、CD、Cost等属性。
  • 获取必要信息,主要通过Get Actor Info。如果是通过Event调用的GA(使用Activate Ability From Event节点作为输入),还可以通过Gameplay Event Data获取。
  • 编写逻辑,如播放动画、应用GE、应用冲量等。
  • 一定不要忘了EndAbility。

被动调用

可在GA的类默认设置的触发器设置。

Trigger的触发方式有三种,分别是:

  • Gameplay Event: 当Owner收到一个带有Tag的Gameplay Event时调用一次GA,此时Owner不会拥有对应的Tag。
  • Owner Tag Added: 当Owner获取对应Tag的时候调用一次GA。
  • Owner Tag Present: 当Owner拥有Tag时调用GA,失去Tag时移除。

一般使用第一种方法,并配合SendGameplayEventToActor节点使用。

类默认设置标签

Ability Tags:该GA的标签。

Cancel Abilities with Tag:激活该GA时,打断其他拥有所选标签的GA。

Block Abilities with Tag:激活该GA时,阻止激活拥有所选标签的GA(已经激活的不会被中断)。

Activation Owned Tags:激活该GA时,赋予ASC所选GA。

Activation Required Tags:激活GA时,ASC需要的标签。

Activation Blocked Tags:激活GA时,ASC不能有的标签。

Source Required Tags:激活GA时,Source需要的标签。

Source Blocked Tags:激活GA时,Source不能有的标签。

Target Required Tags:激活GA时,Target 需要的标签。

Target Blocked Tags:激活GA时,Target 不能有的标签。

冷却

可在GA类默认设置选择指定的GE。GE需要为Has Duration类型。然后在组件里选择标签赋予目标actor。然后在添加到继承里添加一个标签。最后需要在对应GA蓝图里调用节点CommitAbility(会同时触发冷却与开销)或者CommitAbilityCooldown(只会触发冷却效果)

开销

可在GA类默认设置选择指定的GE。该GE需要为实时Instant类型,有一个或多个修饰符Modifier去修改对应的属性。

Task

GA是在一帧内完成的,如果想要实现类似Wait的异步逻辑需要使用Task。

SendGameplayEventToActor

搭配Wait Gameplay Event使用,可以使用Payload传入数据。

Attribute Set(AS)

AttributeSet负责定义和持有属性,并且管理属性的变化。在没有插件的辅助下,AttributeSet只能由C++创建。

创建

创建一个C++类继承自AttributeSet。

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "AttributeSet.h"
#include "AbilitySystemComponent.h"
#include "MyAttributeSet.generated.h"

#define ATTRIBUTE_ACCESSORS(ClassName, PropertyName) \
    GAMEPLAYATTRIBUTE_PROPERTY_GETTER(ClassName, PropertyName) \
    GAMEPLAYATTRIBUTE_VALUE_GETTER(PropertyName) \
    GAMEPLAYATTRIBUTE_VALUE_SETTER(PropertyName) \
    GAMEPLAYATTRIBUTE_VALUE_INITTER(PropertyName)

/**
 * 
 */
UCLASS()
class MYCPPLEARN_API UMyAttributeSet : public UAttributeSet
{
	GENERATED_BODY()

public:

    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Attibute")
    FGameplayAttributeData HealthValue;
    ATTRIBUTE_ACCESSORS(UMyAttributeSet, HealthValue);

    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Attibute")
    FGameplayAttributeData MaxHealthValue;
    ATTRIBUTE_ACCESSORS(UMyAttributeSet, MaxHealthValue);

};

然后在AbilitySystem组件指定该AS。

通过数据表格初始化AS

新建数据表格,选取行结构选择AttributeMetaData。每一行的行命名为类名.变量名。填写基础值即可初始化变量。最小值、最大值功能无作用。最后在AbilitySystem组件里选择该数据表格即可。

通过GE初始化

在修饰符里属性选择对应变量,修改器操作改为重载,填写一个值。然后在角色事件图标的事件开始运行时调用节点ApplyGameplayEffectToSelf即可。

蓝图中获取数据

节点:从能力系统组件获取浮点属性。

限制最小值最大值

需要重写函数

virtual void PreAttributeChange(const FGameplayAttribute& Attribute, float& NewValue) override;

然后在源文件中实现该函数

void UMyAttributeSet::PreAttributeChange(const FGameplayAttribute& Attribute, float& NewValue)
{
	Super::PreAttributeChange(Attribute, NewValue);

	if (Attribute == GetHealthValueAttribute())
	{
		NewValue = FMath::Clamp(NewValue, 0.0f, GetMaxHealthValue());
	}
}

广播数值变化

在c++角色类的头文件中添加

DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnHealthChangeEvent, float, NewHealth);

public:

	UPROPERTY(BlueprintAssignable, Category = "Ability")
	FOnHealthChangeEvent HealthChangeEvent;
	void OnHealthChanged(const FOnAttributeChangeData& Data);

源文件实现该函数,并将它在eventbeginplay里注册到能力系统组件

void AMyCharacterBase::OnHealthChanged(const FOnAttributeChangeData& Data)
{
HealthChangeEvent.Broadcast(Data.NewValue);
}
//需要添加头文件#include"MyAttributeSet.h"
AbilitySystemComponent->GetGameplayAttributeValueChangeDelegate(UMyAttributeSet::GetHealthValueAttribute()).AddUObject(this, &AMyCharacterBase::OnHealthChanged);

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇