【UE4】BlueprintFunctionLibraryの記述と出来上がるノード一覧

#本記事について
[BlueprintFunctionLibrary](https://docs.unrealengine.com/4.27/ja/ProgrammingAndScripting/ProgrammingWithCPP/BlueprintFunctionLibraries/) について、引数と返り値をどう記述すればどういう入出力の Blueprint ノードが出来上がるのかをまとめたものです。
主に筆者個人用です。

記述できる型は直型か参照型のみで、ポインタ型を記述するとビルドエラーになります。
Blueprint 上でポインタを扱えないためだと思われます。

また、関数の引数名を「ReturnValue」(大文字小文字問わず) とした場合もビルドエラーになります。
ノード化される際、内部で定義している名称と衝突してしまうようです。
（retval などなら OK）

#実例
##基本

BlueprintCallable 設定の関数のみとしています。
それ以外の設定は探せば出てくるので……

関数は宣言のみ記載しています（実装自体は空っぽです）。

| 記述 | 結果 |
|:-----------|:------------|
|void ( void )|![screenshot.2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70392/f3ce324d-27db-d811-4e26-446df19537af.png)|

~~~cpp:実装コード
	UFUNCTION( BlueprintCallable, Category = "MyPlugin Sample Func" )
	static void VoidReturnVoidArgFunc();
~~~

何も入出力しないやつです。
作り方系のドキュメントに多い。

##プリミティヴ型、引数の場合

| 記述 | 結果 |
|:-----------|:------------|
|void ( int )|![screenshot.3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70392/cd9aa727-9e79-c6f6-8a81-5815c2472e1b.png)|
|void ( const int )|![screenshot.5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70392/ac514e27-68c2-0426-e06d-9847fcf8e83b.png)|
|void ( int & )|![screenshot.4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70392/48182731-dfd5-187b-b653-0b093a025599.png)|
|void ( const int & )|![screenshot.6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70392/fb87c79e-2111-518e-a0f5-c805d0c90309.png)|

~~~cpp:実装コード
	UFUNCTION( BlueprintCallable, Category = "MyPlugin Sample Func" )
	static void VoidReturnIntArgFunc( int32 Value );

	UFUNCTION( BlueprintCallable, Category = "MyPlugin Sample Func" )
	static void VoidReturnConstIntArgFunc( const int32 Value );

	UFUNCTION( BlueprintCallable, Category = "MyPlugin Sample Func" )
	static void VoidReturnRefIntArgFunc( int32 & Value );

	UFUNCTION( BlueprintCallable, Category = "MyPlugin Sample Func" )
	static void VoidReturnConstRefIntArgFunc( const int32 & Value );
~~~

const 無し参照のみ出力扱いになります。
BP は返り値が複数存在可能なのはこのため（？）

##プリミティヴ型、返り値の場合

| 記述 | 結果 |
|:-----------|:------------|
|int ( void )|![screenshot.7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70392/4bb8dd37-3bd9-5dda-1976-e7a08d64ee11.png)|
|const int ( void )|![screenshot.9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70392/25f74c06-8b5e-138e-f1f2-437628956782.png)|
|int & ( void )|![screenshot.8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70392/d70b1f61-886d-c27a-1500-bc719e95488c.png)|
|const int & ( void )|![screenshot.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70392/2660a063-ef85-78d1-c0a8-50842d6499d2.png)|

~~~cpp:実装コード
	UFUNCTION( BlueprintCallable, Category = "MyPlugin Sample Func" )
	static int32 IntReturnVoidArgFunc();

	UFUNCTION( BlueprintCallable, Category = "MyPlugin Sample Func" )
	static const int32 ConstIntReturnVoidArgFunc();

	UFUNCTION( BlueprintCallable, Category = "MyPlugin Sample Func" )
	static int32 & RefIntReturnVoidArgFunc();

	UFUNCTION( BlueprintCallable, Category = "MyPlugin Sample Func" )
	static const int32 & ConstRefIntReturnVoidArgFunc();
~~~

返り値はすべて出力扱いになるようです。

##複合型、引数の場合
FParameter は [別記事](https://qiita.com/arblic/items/581d251558a412f65fec) 内で作成していた USTRUCT になります。

| 記述 | 結果 |
|:-----------|:------------|
|void ( FParameter )|![screenshot.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70392/2fc8560a-8bc7-48ab-5441-9d66beb9ac6f.png)|
|void ( const FParameter ) |![screenshot.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70392/4a8cbcec-cb1a-2c09-8b07-8acff5c4e0ed.png)|
|void ( FParameter & )|![screenshot.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70392/2de06408-cefd-76ab-c5c0-c366489f0095.png)|
|void ( const FParameter & )|![screenshot.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70392/1015cb8d-85b6-9f0e-2579-817d4a5953f5.png)|

~~~cpp:実装コード
	UFUNCTION( BlueprintCallable, Category = "MyPlugin Sample Func" )
	static void VoidReturnParamArgFunc( FParameter Param );

	UFUNCTION( BlueprintCallable, Category = "MyPlugin Sample Func" )
	static void VoidReturnConstParamArgFunc( const FParameter Param );

	UFUNCTION( BlueprintCallable, Category = "MyPlugin Sample Func" )
	static void VoidReturnRefParamArgFunc( FParameter & Param );

	UFUNCTION( BlueprintCallable, Category = "MyPlugin Sample Func" )
	static void VoidReturnConstRefParamArgFunc( const FParameter & Param );
~~~

プリミティヴ型のそれと変わらないようです。

##複合型、返り値の場合

| 記述 | 結果 |
|:-----------|:------------|
|FParameter ( void )|![screenshot.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70392/52cb1317-a5b1-195a-564a-523ff18f5ddf.png)|
|const FParameter ( void )|![screenshot.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70392/4b513ab4-52cb-7f44-139e-013bdab98c61.png)|
|FParameter & ( void )|![screenshot.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70392/94d495bf-49ef-2e70-723d-13781dce95fa.png)|
|const FParameter & ( void )|![screenshot.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70392/714a2432-b63f-f87b-acfc-c1561b7d47b7.png)|

~~~cpp:実装コード
	UFUNCTION( BlueprintCallable, Category = "MyPlugin Sample Func" )
	static FParameter ParamReturnVoidArgFunc();

	UFUNCTION( BlueprintCallable, Category = "MyPlugin Sample Func" )
	static const FParameter ConstParamReturnVoidArgFunc();

	UFUNCTION( BlueprintCallable, Category = "MyPlugin Sample Func" )
	static FParameter & RefParamReturnVoidArgFunc();

	UFUNCTION( BlueprintCallable, Category = "MyPlugin Sample Func" )
	static const FParameter & ConstRefParamReturnVoidArgFunc();
~~~

こちらもプリミティヴ型と変わらずですが、複合型の値渡しはさすがにやめたほうがいいので上2つはナシ……

#まとめ

Blueprint ノードを C++ で組むにあたって、記述によって入出力が異なるためすべて列挙してみました。
引数では const 無し参照型のみ出力ピンとなります。
処理自体の成功失敗判定を bool や errno_t 的な返り値に統一し、処理結果を受け取るのを const 無し参照型とするのがよいかもしれません。