| 改訂バージョン: Unreal Engine 4.21 | 
先日の出張ヒストリアにお越しいただいた方はお疲れ様でした。
ご好評頂いているようで何よりです。
さて、今回はBPノードのInput/Outputの型に関する細かいテクニックのお話です。
 
 
BPノードのInput/Outputの型に関して
BPノードのInput/Outputは通常だと明示的に型が設定されており、使い方によってそれらの型情報等が変わることはありません。
それでどういった事が起こるかというと、例えば以下の様なケースです。
 

 
こちらはレベル上に存在するアクターの中からクラス指定で一つだけ取得するというBPノードになります。
一見問題無さそうに見えますが、これを使用する際には以下の様な処理を書かなくてはいけません。
 

 
明示的にクラスを指定してノードを実行したにも関わらず、Outputの型が汎用的なActorのリファレンスとなってしまっているため、これを使用するためにCastを挟む必要が出てきます。
わざわざこれを毎回挟む必要があるのは非常に面倒です。
しかし、実はC++定義のBPノードであればこの問題を回避できます。
 
 
Outputの型を動的変更するためのmeta情報
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);   }; | 
				
			 
		 
		
		
			
			
			
			
				
					
				|  | #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は必要無くなりました。
ちょっとした小ネタでしたが以上です。