⛹️

【UE5】C++でGameplayEffectで使用した際にエラーが出たときの備忘録

2024/12/21に公開

概要

この記事は一人アドベントカレンダー by ダリアの21日目の記事です。
今回はC++でGameplayEffectを使う時に遭遇したエラーについて、対処方法をまとめた記事となります。

遭遇したエラー達

Assetを読み込んでもNull

これはBlueprintで作ったGameplayEffectをC++で読み込もうとした際に発生しました。
対処方法はリファレンス名をコピーしたあとに、GameplayEffectはBlueprintクラスなので最後に_Cが必要でした。

//間違っているやり方
TSubclassOf<UGameplayEffect> GE = TSoftClassPtr<UGameplayEffect>(FSoftObjectPath("/Game/EscapeGame/Core/Bullets/GAE_Example.GAE_Example")).LoadSynchronous();

//正しいやり方
TSubclassOf<UGameplayEffect> GE = TSoftClassPtr<UGameplayEffect>(FSoftObjectPath("/Game/EscapeGame/Core/Bullets/GAE_Example.GAE_Example_C")).LoadSynchronous();

参考にした記事
[UE4]C++でアセットパスからWidget Blueprintを動的に生成(CreateWidget)する方法について

UE4: C++ コード から C++ クラスまたは Blueprint のアクターを FindObject して SpawnActor する方法

LogAbilitySystem: Error: FGameplayEffectSpec::GetMagnitude called for Data SetByCaller.Heal on Def Default__GE_Heal_SetByCaller_C when magnitude had not yet been set by caller.

AbilitySystemComponent::ApplyGameplayEffectSpecToTargetAbilitySystemComponent::ApplyGameplayEffectSpecToSelfには 引数の中身がFNameのものとFGameplayTagの2つのものがあります。

今回GameplayTagで渡さないと行けない所をFNameで渡してしまうと上記のエラーが出ました。
なので、FGameplayTag::RequestGameplayTag(確認したいGameplayTag名)GameplayTagに変換して引数に渡したら解決しました。

UAbilitySystemComponent* ASC; //説明のため型名だけで取得はしません
float ExampleMagnitude = 1.0f;
FGameplayEffectSpecHandle SpecHandle = ASC->MakeOutgoingSpec(GE,1,ASC->MakeEffectContext());
FGameplayEffectSpec* Spec = SpecHandle.Data.Get();

//間違ったやり方
Spec->SetSetByCallerMagnitude(FName("Data.Example"),ExampleMagnitude);

//正しいやり方
FGameplayTag ExampleGameplayTag = FGameplayTag::RequestGameplayTag("Data.Example");
Spec->SetSetByCallerMagnitude(ExampleGameplayTag,ExampleMagnitude);

ASC->ApplyGameplayEffectSpecToSelf(*Spec);

参考にした記事

How to apply lyra gameplay effect with magnitude in blueprint?

From string To Gameplay Tag?

終わりに

記事は以上となります。
ここまで読んでいただきありがとうございます。

Discussion