ブループリントは普段あまり意識していないかもしれませんが、実は結構色々な種類があります。それぞれの違いが微妙にわかりにくいかもしれないので、改めて解説してみます。
作成する際には以下のようにコンテンツブラウザーからブループリントの項目を選択して個々のブループリントを作成してください。
ブループリントの種類
大きく分けると以下のようになります。
- クラスブループリント
- レベルブループリント
- ブループリントインターフェース
- ブループリントマクロライブラリー
- ブループリント関数ライブラリー
- 列挙型
- 構造体
特にクラスブループリントとレベルブループリント以外は何それ?っていう方も多いのではないかと思います。というわけでそれぞれ簡単に解説です。
クラスブループリント
たぶんブループリントと言えばこれを一般的に示していることが多いです。
クラスブループリントは必ず親となるクラスがあり、それを継承して使います。継承することによって親が持つ機能全てを使うことができます。またクラスブループリントにはUnityでいうプレハブのような機能もあり、コンポーネントの追加やコンポーネントの階層情報の設定、変数値の初期値設定などを行なうことができます。
これに合わせてグラフモードでは実際にゲームロジックをノードベースに作成することができます。イメージとしてはこの部分をブループリントと勘違いされている方がいますが、上記のような機能も含めてブループリントということになります。
レベルブループリント
レベルブループリントはその名の通りレベルに紐づくブループリントでレベル単位でひとつずつしか持てません。しかしクラスブループリントとは違い、依存するものが少ないのでグローバルなロジックを制作しやすいです。また本来はロジックを持てないレベル上に配置されたスタティックメッシュなどをコントロールすることができます。
レベルブループリントのみ、アセットとして作成することができません。マップデータとして".umap"データに紐づいているので、レベルの情報を保存することにより同時にレベルブループリントの情報も保存されています。
ブループリントインターフェース
ブループリントインターフェースはオブジェクト指向などのプログラミング言語を知っている方だとわかりやすいかもしれません。その名の通りインターフェースを提供してくれるもので、通常のブループリント同様、関数を定義することができます。定義をするのみで中身の実装はできません。
実装ができないものに何の意味があるのか?という疑問を持たれるかもしれませんが、共通のインターフェースを定義することにより、呼び出しの方法が共通でも実装は違うといった使い方ができます。
これは小さいプロジェクトでは意識する必要がないかもしれませんが、大きいプロジェクトでブループリント間での依存が強くなると、とても重要になってきます。詳しい話はぜひ以下のブログ記事をご覧ください。
もんしょの巣穴blog [UE4] Blueprint Interfaceを使って依存度を下げる
ブループリントマクロライブラリー
マクロライブラリーは既存のクラスブループリントに対して、新しい機能を追加することができます。作成時には親となるクラスを選択し、マクロと呼ばれる関数とほぼ同じような機能を追加します。
マクロには入力や出力パラメーターをいくらでも追加できるノードがあります。もちろんクラスを継承しているのとほぼ同等なので親クラスが持つ機能も全て使うことができます。
実際に追加するとクラスブループリントで、その継承したクラスと同じ親を持つブループリントで、実装したマクロの内容をどのブループリントからでも呼びだせるようになるので、実質的に既存クラスに対して追加機能を作っているのと変わらないというわけです。
ブループリント関数ライブラリー
関数ライブラリーはマクロライブラリーと同様に機能を追加できるのですが、最大の違いは親クラスが必要ありません。なので依存の低いロジックの作成に向いています。関数は簡単に扱える分、使える機能が少なくなってしまいます。が、関数ライブラリーは全てのクラスブループリント、レベルブループリントなどで使えるので、依存の低いロジック制作には必須です。
依存が低いと言ってもマクロと同様に入力にはいくらでもパラメーターを持たせられるので、ノードの引数パラメーターに必要なものを渡すことができるのであれば十分に汎用的なものを作ることができます。うまく作れば依存の低いライブラリーとして使いまわしがきくようなものを作れますので、頻繁に使うような処理はぜひ関数ライブラリーにしましょう。
列挙型
列挙型は人によってはEnumと読んだ方がわかりやすいかもしれません。列挙型というのは非常に単純です。たとえばゲームのモードを定義すると"Title"、"Game"、"Ending"など複数のシーンを分けたいという場合に、それぞれを固定の名前として列挙定義することができます。
列挙型の役割はそれだけです。特別意味があるわけではありませんが、実際にゲーム中にタイトルに移動したいという時に"Title"という風に値を渡す感じになるので、わかりやすくなるというメリットがあります。
列挙型にはロジックなどもないので非常にシンプルであり、ブループリント内で使える便利なものという認識で問題ないでしょう。
構造体
構造体もStructと書けばわかる人にはすぐわかるはずです。構造体は単純に複数の値をひとつの箱に収めることができるというものです。例えば"Apple"、"Lemon"、"Orange"といったオブジェクトがあった場合、それをひとつの箱としてまとめることができるのが構造体です。
UE4には既にVectorのような単純なものが構造体として定義されています。なので、気にしないうちに使っている人も多いと思いますが、独自の構造体も定義できるので、必要に応じて構造体を作ると管理もしやすくなると思います。
ブループリントの使い分け
といった具合にざっと解説してみましたが、実際に使ってみないと便利さはわからないかもしれません。特にブループリントインターフェースはわかりにくいと思います。プログラミング経験がない人には最初は何のことかわからないでしょう。
ただ概念自体は実際のプログラミングよりも単純なものですので、まずは使ってみてどういう使い分けが必要なのか勉強してみるのがいいと思います。