⛹️
【UE5】C++でGameplayEffectで使用した際にエラーが出たときの備忘録
概要
この記事は一人アドベントカレンダー 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::ApplyGameplayEffectSpecToTarget
、AbilitySystemComponent::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?
終わりに
記事は以上となります。
ここまで読んでいただきありがとうございます。
Discussion