UE4 C++ GameplayAbilitiesを勉強していくPart.3-5 GameplayEffect GrantedAbilities

やあ

今回はGameplayEffectGameplayAbilitiesについて勉強するよ。

間違いなどあれば教えてくださると助かります!

前回

pto8913.hatenablog.com

GrantedAbilitiesについて

f:id:pto8913:20200531205722p:plain
Duration PolicyHas DurationInfiniteの時だけ使えるよ。
GameplayEffectが適用されたとき対象(自分自身でも可)にGameplayAbilityを付与するよ。

実はこれ、デフォルトで書かれているくせに、デフォルトでは使えないよ。
(使い方が悪いのかもしれないけど、僕にはデフォルトでの使い方がわからなかったよ。)

使い方は後で書くとして、とりあえず説明。

Ability

付与されるGameplayAbility

Level

どのレベルでこのGameplayAbilityを付与するか。
イミフ

InputID

このGameplayAbilityをバインドするためのID
(よくわかってません)

Removal Policy

どうなった時に、付与したGameplayAbilityを削除するか。

Removal Policy 説明
Cancel Ability Immediately エフェクトが終了すると、バインドされたGameplayAbilityもバインドも削除される。バインドされたGameplayAbilityが終了すると、自動的にGameplayAbility->EndAbilityが呼び出されます。
Remove Ability On End エフェクトが終了すると、バインドされたGameplayAbilityもバインド解除される。自動的にEndAbilityは呼び出されないので注意
Do Nothing エフェクトが終了しても、バインドは解除されず、自動的にEndAbilityも呼び出されないので、手動で終了させる必要がある。

実際にGrantedAbilitiesを使ってみる

今回は適用すると3秒間スタミナが1秒毎に10ずつ減るGameplayEffectに、
適用するとスタミナが0.1秒毎に0.5ずつ回復する、GameplayEffectを適用するGameplayAbilityGrantedAbilitiesに設定するよ。

GameplayAbilityのサブクラスを作成(超大事、どのくらい大事かというと☆100000000000個分)

f:id:pto8913:20200531214714p:plain

MyGameplayAbility.hに追加

// Copyright(C)write by pto8913. 2020. All Rights Reserved.

#pragma once

#include "CoreMinimal.h"
#include "Abilities/GameplayAbility.h"
#include "ptoGameplayAbility.generated.h"

UCLASS()
class ABILITYTEST_API UptoGameplayAbility : public UGameplayAbility
{
    GENERATED_BODY()
public:
    virtual void OnAvatarSet(const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilitySpec& Spec) override;
};

MyGameplayAbility.cppに追加

// Copyright(C)write by pto8913. 2020. All Rights Reserved.

#include "Abilities/Ability/ptoGameplayAbility.h"
#include "AbilitySystemComponent.h"
#include "GameplayTagContainer.h"

void UptoGameplayAbility::OnAvatarSet(const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilitySpec& Spec)
{
    Super::OnAvatarSet(ActorInfo, Spec);

    if (ActivateAbilityOnGranted)
    {
        bool ActivatedAbility = ActorInfo->AbilitySystemComponent->TryActivateAbility(Spec.Handle, false);
    }
}

3秒間スタミナが1秒毎に10ずつ減るGameplayEffectを作成(GE_GrantedAbility)

f:id:pto8913:20200531222530p:plain

0.1秒毎にスタミナが0.5ずつ回復するGameplayEffectを作成(GE_RefreshStamina)

f:id:pto8913:20200531222530p:plain

GrantedAbilitiesに設定するためのGameplayAbilityを作成(GA_Granted)

親クラスはさっき作ったMyGameplayAbility
f:id:pto8913:20200531222910p:plain

Ability Activate On Grantedを有効にする
f:id:pto8913:20200531222943p:plain

f:id:pto8913:20200531223057p:plain

GE_GrantedAbilityにGranted Abilitiesを設定

f:id:pto8913:20200531222428p:plain

テスト

f:id:pto8913:20200531223348g:plain
うまくいってるね。

Removal PolicyがRemove Ability on Endの時の処理

今回の処理だと、スタミナが最大になったらGE_RefreshStaminaを削除するという処理。
f:id:pto8913:20200531224034p:plain
f:id:pto8913:20200531224048p:plain

f:id:pto8913:20200531224729g:plain

今回はここまで、ありがとうございました。

次回

pto8913.hatenablog.com