UE4 C++ GameplayAbilitiesを勉強していくPart.3-2 GameplayEffect コストとクールダウン
やあ
今回は、GameplayEffect
のコストとクールダウンについて勉強するよ。
間違いなどあれば教えてくださると助かります!
前回
GameplayEffect
CostGameplayEffectについて
・GameplayAbilities
で、能力のコストとして利用するために特別に設計されたGameplayEffect
のこと。
・コストとは、GameplayAbility
を使うためにAbilitySystemComponent
がどれだけのAttribute
を持っている必要があるかを表しているよ。
・GameplayAbility
がコストGameplayEffect
を払えないなら、そのGameplayAbility
を実行できないよ。
・これを使えるGameplayEffect
はDuration Policy
がInstant
のものだけだよ。
実際にCostGameplayEffectを使ってみる
今回は、Part.2で作ったGA_Jump
にコストを持たせて、
コストが10以下ならジャンプできないようにするよ。
CostGameplayEffect用のGameplayEffectを作成
GE_Jump
を複製してGE_Jump_Cost
に名前を変えてね。
CostGameplayEffectを設定
テスト
あれー?
Part.2で作ったGA_Jump
はスタミナが半分以上の時、スタミナを10*2の20消費して、それ以外のときは10消費するだけのはずなのに、消費スタミナが増えてる?!
そう、GameplayAbility
のCostGameplayEffect
に設定したGameplayEffect
の分も追加で減らされているのです!
な、なんだってー
ということで修正
GA_Jump
からGE_Jump
を消して、
これで安心。
え?ModifierMagnitudeCalculation(MMC)
はどこにいったのって?
CostGamplayEffect
でMMC
をつかうには、GameplayAbility
を継承したクラスでGetCostGameplayEffect()
をオーバーライドしてなにかするみたいなんだけど、よくわからなかったよ。
CooldownGameplayEffectについて
・GameplayAbilities
で、能力のクールダウンとしてとして利用するために特別に設計されたGameplayEffect
のこと。
・クールダウンは、GamapleyAbility
を使ってからどれくらいの間で再び使えるかを決められるよ。
。
・これを使えるGameplayEffect
はDuration Policy
がHas Duration
のものだけだよ。
実際にCooldownGameplayEffectを使ってみる(簡単版)
ただGameplayEffect
を作ってそれを設定するだけ。
メリット
・簡単。
デメリット
・BPが増えすぎる
CooldownGameplayEffectの作成
GrantedTags
に設定されているタグのCooldown
は必須です。
これがないとクールダウンと判定してくれません。
CooldownGameplayEffectの設定
テスト
ちょっとわかりにくいけどアビリティを使って5秒以内は、アビリティを使えなくなってるね。
実際にCooldownGameplayEffectを使ってみる(ちょっとめんどくさいけど結果的に楽になる版)
MMC
を使って、再利用性を高める
メリット
・簡単
デメリット
・C++の読み書きができる必要がある。(?)
GameplayAbilityのサブクラスの作成
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: UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Cooldowns") FScalableFloat CooldownDuration; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Cooldowns") FGameplayTagContainer CooldownTags; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Cooldowns") FGameplayTagContainer Temp_CooldownTags; virtual const FGamepalyTagContainer* GetCooldownTags() const override; virtual void ApplyCooldown( const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo ) const override; };
MyGameplayAbility.cpp
に追加
// Copyright(C)write by pto8913. 2020. All Rights Reserved. #include "Abilities/Ability/ptoGameplayAbility.h" const FGameplayTagContainer* UptoGameplayAbility::GetCooldownTags() const { FGameplayTagContainer* MutableTags = const_cast<FGameplayTagContainer*>(&Temp_CooldownTags); const FGameplayTagContainer* ParentTags = Super::GetCooldownTags(); if (ParentTags) { MutableTags->AppendTags(*ParentTags); } MutableTags->AppendTags(CooldownTags); return MutableTags; } void UptoGameplayAbility::ApplyCooldown( const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo ) const {GetCooldownGameplayEffect(); if (CooldownGE) { FGameplayEffectSpecHandle SpecHandle = MakeOutgoingGameplayEffectSpec(CooldownGE->GetClass(), GetAbilityLevel()); SpecHandle.Data.Get()->DynamicGrantedTags.AppendTags(CooldownTags); ApplyGameplayEffectSpecToOwner(Handle, ActorInfo, ActivationInfo, SpecHandle); } }
Modifier Magnitude Calculationのサブクラスの作成
MMC_Cooldown.h
に追加
// Copyright(C)write by pto8913. 2020. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "GameplayModMagnitudeCalculation.h" #include "MMC_Cooldown.generated.h" UCLASS() class ABILITYTEST_API UMMC_Cooldown : public UGameplayModMagnitudeCalculation { GENERATED_BODY() public: virtual float CalculateBaseMagnitude_Implementation(const FGameplayEffectSpec& Spec) const override; };
MMC_Cooldown.cpp
に追加
// Copyright(C)write by pto8913. 2020. All Rights Reserved. #include "Abilities/Calculations/MMC_Cooldown.h" #include "Abilities/Ability/ptoGameplayAbility.h" float UMMC_Cooldown::CalculateBaseMagnitude_Implementation(const FGameplayEffectSpec& Spec) const { const UptoGameplayAbility* Ability = Cast<UptoGameplayAbility>( Spec.GetContext().GetAbilityInstance_NotReplicated() ); if (!Ability) { return 0.0f; } return Ability->CooldownDuration.GetValueAtLevel(Ability->GetAbilityLevel()); }
GameplayAbilityの設定
CooldownGameplayEffectの設定
テスト
うまくいってるね。
これでクールダウンをつけたいアビリティに、GE_Jump_Cooldown
を設定してあげればクールダウンが簡単にできるよ。
GE_Jump_Cooldown
の名前は変えとこうね。
今回はここまで、ありがとうございました。
次回
GameplayEffect
のStacking
とOverflow
について勉強するよ。