読者です 読者をやめる 読者になる 読者になる

Let's Enjoy Unreal Engine

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

UE4 ブループリント インターフェースについて

UE解説

今回はブループリント インターフェースについての解説です。

ブループリント インターフェースは一般的なオブジェクト指向プログラミング言語のインターフェースとほぼ同等の機能を持っています。

が、今回はプログラミング経験がない方やオブジェクト指向がよくわからない方にも向けてなるべくわかりやすく解説したいと思います。

 まずインターフェースって?

そもそもプログラミングやオブジェクト指向の経験がない方にはインターフェースがわからないと思うので、その解説をしたいと思います。

インターフェースというのはみんなで使う共通の部分だけを決めてその仕組みを利用し、同じ使い方でそれぞれ別の用途に使い分けることができるというものです。

f:id:alwei:20140922213716j:plain

一般的に使われているUSBというインターフェースはまさしくその考え方です。このインターフェースで何が有り難いのかと言うと使う側は使い方を意識する必要がないわけで、事前に何かをやる必要もないので、単純にUSBに繋ぐものさえ用意すればいいのです。

ブループリントでのインターフェース

ブループリントでのインターフェースの使い方は簡単です。まずは通常のブループリントと同様で新規のブループリントで"ブループリント インターフェース"を選択。名前を決めたら、ブループリント インターフェースを開きます。開くとそのままだと何もないのですが、マイブループリントから関数を追加します。

f:id:alwei:20140923000537j:plain

関数を追加すると下の"詳細"に関数の入力値と出力値が設定できるようになります。この名前と入出力値がインターフェースとなるのです。名前と入出力値が一致さえしていればどこからでも使うことができます。

この関数自体はインターフェースなので内容の実装を行なうことができません。インターフェースの内容実装は個々のクラス上で行うこととなります。

※注意 出力値のないインターフェース関数を作成すると、クラス上で関数としては登録されずにイベントとして登録されます。いわゆる関数的な使い方とは別物になりますので、ご注意ください。

f:id:alwei:20140923001035j:plain

今回は例でも使用した3つのクラスを用意しました。それぞれUSBをインターフェースとして使用します。この3つのクラスは単純なActorを継承しただけの中身はないものです。

ブループリントのクラスを追加したらそれぞれのクラスブループリントを開いて、グラフモードの上部にある"ブループリントのプロップ"を選択します。これを選択すると詳細パネル上にインターフェースを選択できる部分が出現します。

f:id:alwei:20140923001324j:plain

これで作ったインターフェースをそれぞれのクラスブループリントに追加しておきます。

インターフェース関数を実装

インターフェースをクラスに追加すると自動でマイブループリントの一覧に関数として出現します。※出力値がない場合は出現せずイベントとして登録されています。

f:id:alwei:20140923112721j:plain

これをダブルクリックしてそれぞれのクラス上に内容を実装していきます。今回は単純にインターフェース関数を呼んだという目印のために出力値としてそれぞれの機能がわかるような文字列を返しています。

f:id:alwei:20140923112844j:plain

3つのクラスにインターフェース関数用にそれぞれ機能を実装しました。あとはインターフェースをコールするのみです。

実際にインターフェースをコールする

インターフェース関数を呼び出すには"Interface Messages"のカテゴリーから適切な関数を呼び出す必要があります。

f:id:alwei:20140923115904j:plain

先程作った"USB Function"という関数を使えば呼び出すことができます。今回はレベル上に配置されているアクターを直接配列に格納して、一度に別々の機能として呼び出してみます。

f:id:alwei:20140923120142j:plain

レベルブループリント上で"ActorArray"という単純なアクターを格納することができる配列を作って、それぞれレベル上に配置されている、HDD、Keyboard、Mouseクラスのアクターを追加しています。

レベル上のアクターをレベルブループリントに配置したい場合、レベルエディターのビューポート上でそのアクターをクリックして選択した状態で、レベルブループリント上で右クリックして"XXX_BPにリファレンスを追加"をするか、シーンアウトライナー上からレベルブループリントへ直接ドラッグ&ドロップでも追加することができます。

f:id:alwei:20140923120732j:plain

あとはActorArrayの配列をForEachLoopノードでループしてUSB Functionという共通インターフェース関数をコールすればそれぞれ別の機能として呼び出されます!

f:id:alwei:20140923120821j:plain

インターフェースを使うメリット

インターフェースのメリットはなかなか説明しづらいのですが、いわゆるオブジェクト指向で重要なポリモーフィズムの実現とカプセル化にあると言われます。

ポリモーフィズム

ポリモーフィズムとは日本語で多態性などと訳されますが、同じオブジェクトを別のものとして扱うことができるようになることです。今回全てのクラスをアクターとして同じ配列に入れた状態で同じ関数を呼び出しましたが、違うものとして呼び出されました。

これは同じUSBインターフェースを使用したおかげで、中身を意識しなくてもUSBに差した段階で自動的にそれぞれを別物として認識したという事と考えれば納得がいくと思います。

カプセル化

カプセル化というのは外部から相手の詳細を知らなくてもその機能を使用できるようにして、オブジェクトの独立性を高める事です。独立性の高いものは他のオブジェクトに依存しなくても使用できるようになるので、よりパーツとして汎用的で使いやすいものとなります。

ブループリントの場合は相手の情報を知るためにキャストなどを介して無理矢理情報を取得したりしますが、これは依存関係が強くなりカプセル化ができていないということになります。この状態だとブループリントは相手の情報をコンパイルするたびに知りにいかなくてはならないので、コンパイル時間がどんどん伸びる事になります。

インターフェースを使う事により、相手の情報を知らなくてもその機能を呼び出す事が可能となるので、ブループリントのコンパイルも必要なくなります。依存関係によるバグも減る事となるので、きっと大きなプロジェクトではその効果が目立ってくると思います。

 

まだまだブループリントのインターフェース機能は知られてないと思いますのが、この記事で少しでも興味を持っていただければと思います。