UnrealEngine4で2Dゲームを作ろう! その5 C++ と Blueprint連携
今回は、ただの備忘録です。
UnrealVSをインストールする
UEのVS拡張です。ドキュメントにもありますが、あった方が便利そうなので、インストールします。
C++/BP連携は、C++主導で
C++とBlueprintを連携させる場合、やりとりする列挙型や構造体などはC++で定義するのが基本になります。
BPのアセットからデータを抜き出して、ゴニョゴニョ出来るようにも見えますがめんどくさいのでC++側で定義したものをBPでも使うというスタンスが楽だと思います。
Blueprintで定義した関数をC++から呼ぶ
C++側で空の仮想関数を定義し、BlueprintImplementableEventを指定しておきます。
BP側で、その空の仮想関数が呼ばれたというイベントがキャッチできますので、そのイベントに続いて実装をします。
概要は、UEWikiのこのページで。
他にもデリゲートを利用する方法もあるみたいですが、そちらはまだちゃんと見ていないので詳細は不明です。どちらにしてもC++側に定義を用意する必要があるみたいです。
BPノードへの定義追加などはホットリロードが効かない?
BPノードへはホットリロードが効かないようです。
BuleprintFunctionLibraryに関数を増やしたり、BluperintTypeにした列挙型に要素追加しても、エディタを再起動するまで、その内容がBPノードに反映されません。
VS上でリビルドをすると、一応エディタ側に「ホットリロード完了!」とダイアログが出ますが、反映されません。
仕様なのかバグなのかはわかりません。AnserHubをのぞいた所(hot reload not working とかで検索)、ちゃんとホットリロードされるのが仕様のようにも見えますが、なんとも言えない感じ。
追記: UE4.8だとちゃんとホットリロードされる様子。引数などを増やした場合は、「ノードの更新」をすることで反映されます。
ゲームでの静的なデータは、GameInstanceクラスを使う
武器のパラメータなど、実行中に変更の無いデータはGameInstanceクラスにいれるとゲームが起動中はずっと持っていてくれます。シングルトンみたいなので、どのBP・C++からもアクセスできるようです。