Let's Enjoy Unreal Engine

Unreal Engineを使って遊んでみましょう

UE4 ブループリント変数をconst(純粋)化する

ブループリントの変数はC++の変数のようにconst化してSetが出来ないようにしたいという考えはプログラマーであれば当然考えつくかもしれません。

元々ブループリントは幅広く公開範囲を設定が出来るようになっていますが、単純に作っただけではどのブループリントからでも変数を設定出来てしまいます。

少し手間が必要ですが、C++constのように振る舞わせる事も可能です。今回使用しているバージョンはUE4.8.3になりますので、他バージョンですと若干の差異は出るかもしれませんが、基本は同じはずです。

変数をPrivate化しておく

まずは普通に変数を作成してください。そして作成した変数の"詳細"から"プライベート"をチェックしておきます。

f:id:alwei:20150830134816j:plain

これにより、他のブループリントからはこの変数をSetとGetできなくなります。

しかし、このままではSetは出来なくてもいいけど、Getはしたいという要求に答える事が出来ません。

新規関数を作成して、純粋化(pure)して変数を取得する

ここで新規関数を追加しましょう。名前はわかりやすいように"Get [ValueName]"みたいなようなわかりやすい名前にしておきます。

f:id:alwei:20150830143111j:plain

関数の詳細の中にある、"純粋"または"pure"というチェックをつけておきます。更に関数の中にある"詳細設定を表示"のボタンを押して、"Const"という部分にチェックを入れます。これで関数が純粋化されて、更に値の変更が出来ないConst関数となって値を取得する専用のノードになります。

実際に呼び出す

あとはもう実際に関数を呼び出すだけです。

f:id:alwei:20150830143444j:plain

このアクターが持つ変数一覧を調べてみるとわかりますが、当然この"VectorValue"を直接呼び出す事は出来なくなっています。つまり純粋関数である"Get Vector Value"経由でしか、この変数を外部から参照する事は出来なくなっています。これは正しくC++constと同等の挙動です。

C++から作る場合

実はC++から変数を作る場合には最初から参照レベルを設定する事が出来るようになっています。

docs.unrealengine.com

UPROPERTY() マクロを使用し、"BlueprintReadOnly" というキーワードをつけることによって、ブループリントからはGetのみを呼び出す事になります。ただし、この方法を使用すると、ブループリントからは完全に読み込みのみで、一切の書き込みが出来なくなりますので、ご注意してください。

ちなみにC++上でconst関数を作った場合には自動でブループリント関数も純粋化されます。ブループリントAPIを作る場合にはぜひ覚えておきましょう。