関連ブログ
- [UE4][UE5]開発環境の容量を少しでも減らす 2024.08.14UE
- [UE5] PushModel型のReplicationを使い、ネットワーク最適化を図る 2024.05.29UE
- [UE5]マテリアルでメッシュをスケールする方法 2024.01.17UE
CATEGORY
2016.07.23UE4UE/ C++
改訂バージョン: Unreal Engine 4.21 |
先日の出張ヒストリアにお越しいただいた方はお疲れ様でした。
ご好評頂いているようで何よりです。
さて、今回はBPノードのInput/Outputの型に関する細かいテクニックのお話です。
BPノードのInput/Outputは通常だと明示的に型が設定されており、使い方によってそれらの型情報等が変わることはありません。
それでどういった事が起こるかというと、例えば以下の様なケースです。
こちらはレベル上に存在するアクターの中からクラス指定で一つだけ取得するというBPノードになります。
一見問題無さそうに見えますが、これを使用する際には以下の様な処理を書かなくてはいけません。
明示的にクラスを指定してノードを実行したにも関わらず、Outputの型が汎用的なActorのリファレンスとなってしまっているため、これを使用するためにCastを挟む必要が出てきます。
わざわざこれを毎回挟む必要があるのは非常に面倒です。
しかし、実はC++定義のBPノードであればこの問題を回避できます。
C++でBPノードとして公開する関数を作成する場合はmeta情報を定義できます。
このmeta情報には様々なものがありますが、その中に DeterminesOutputType / DynamicOutputParam というものが存在します。
DeterminesOutputType | Outputの型を決定するために参照するInputの名前 |
DynamicOutputParam | 動的変更するOutputの名前 |
これらに従い、以下の様な形で記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#pragma once #include “CoreMinimal.h” #include “Kismet/BlueprintFunctionLibrary.h” #include “GetSingleActorOfClass.generated.h” /** * */ UCLASS() class MYPROJECT_API UGetSingleActorOfClass : public UBlueprintFunctionLibrary { GENERATED_BODY() UFUNCTION(BlueprintCallable, Category = “Utilities”, meta = (WorldContext = “WorldContextObject”, DeterminesOutputType = “ActorClass”, DynamicOutputParam = “OutActor”)) static void GetSingleActorOfClass(UObject* WorldContextObject, TSubclassOf ActorClass, AActor*& OutActor); }; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#include "GetSingleActorOfClass.h" #include "Runtime/Engine/Classes/Kismet/GameplayStatics.h" void UGetSingleActorOfClass::GetSingleActorOfClass(UObject* WorldContextObject, TSubclassOf ActorClass, AActor*& OutActor) { TArray<AActor*> OutActors; UGameplayStatics::GetAllActorsOfClass(WorldContextObject, ActorClass, OutActors); if (OutActors.Num() > 0) { OutActor = OutActors[0]; return; } OutActor = nullptr; } |
今回は DeterminesOutputType として ActorClass を、DynamicOutputParam として OutActor を指定しています。
BPで定義したものと処理の内容的には違いはありません。
こちらをBPで使用する際は以下の様に書けます。
OutActorの型がActorのリファレンスではなく、Inputに指定したクラスのリファレンスになっていることがわかります。
これによりCastは必要無くなりました。
ちょっとした小ネタでしたが以上です。