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

Let's Enjoy Unreal Engine

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

UE4 Blutilityによるお手軽なエディター拡張

前回の記事にてUnreal Fest 2016 横浜にて登壇した内容のスライドを公開しました。

そこで最後に取り上げたBlutilityという機能に関して、正直なところセッション中でも今ひとつ解説しきれなかった感がありました。まだExperimental(実験的)な機能ではありますが、色々と将来性のある機能でもあるので、ここでしっかりと解説しておきたいと思います。

まず最初にBlutilityを使える状態にだけしておきましょう。デフォルトのままでは機能を利用することができません。

f:id:alwei:20161005171339p:plain

"エディタの環境設定"→"実験段階"→"Editor Utility Blueprints(Blutility)"にチェックをつけておきます。これでどこでも利用可能になります。当然ですが、実験段階の機能なので、不具合などもあるかもしれませんのでそれを承知の上で利用してください。また、ここでの情報はすべてUE4.13.1での情報となりますので、新しいバージョンでは変化している可能性もあることをご了承ください。

Blutilityを利用すると可能なことと不可能なこと

Blutilityを使うことで可能

・ゲームをプレイする前に実行できる
・アクターに依存しない処理を作成できる
・簡単なエディター拡張ができる
・アセットに対しての簡単な処理ができる

Blutilityでは不可能なこと

・エディターのUIを拡張する
・入力などのイベントをとる
・Latentアクション(Delayなど)を実行する

細かいところでは色々とありますが、こんなところです。

では早速Blutilityを作成したいところですが、その前にBlutilityは2種類存在していることを理解する必要があります。

グローバルに継承して使える、"GlobalEditorUtilityBase"を利用したものと、配置済みアクターからカスタムイベントを使って直接呼び出すというものです。それぞれは別々に特徴があるので、それを解説していきます。

GlobalEditorUtilityBaseを利用したBlutility

一般的にBlutilityはこちらを利用したものを指すことが多いです。こちらの最大の特徴アクターに依存せず、専用の開発用機能を利用できるということです。まずはクラスを作成してみましょう。

f:id:alwei:20161005201715p:plain

通常のブループリントを作成するのと同様に、ブループリントユーティリティ(またはBlutility)という項目が追加されているので、選択します。次に親クラス選択では"すべてのクラス"を選択し、"GlobalEditorUtilityBase"を選択してクラスを作成します。作成ができたら、コンテンツフォルダ上で自由な名前をつけておきます。

これでBlutilityが作成できましたが、開く時には注意が必要です。現状ではダブルクリックで開いた時と、右クリックから開く時で別メニューが開き、少々混乱しやすくなっています。

f:id:alwei:20161005202534p:plain

通常のダブルクリックで開くとこのようなウィンドウが開きます。このウィンドウはエディターからの関数の呼び出しや変数の値変更に利用します。

f:id:alwei:20161005202734p:plain

Blutilityアセットを右クリックすると、上記のようなメニューが表示されます。Blutilityアクションとしては"ブループリントの編集"、"デフォルトの編集"を利用します。別項目にある"編集"はダブルクリック時に開くウィンドウと同様のものとなっているので、注意してください。

Blutilityを編集する場合には"ブループリントの編集"を選択します。そうすると普段から開いているブループリントエディターのウィンドウが表示されます。見た目は通常のブループリントと変わりません。

Blutilityを使う場合、2種類の方法があります。関数から呼び出すか、アセットをダブルクリックしてイベントを発生させて呼び出すかの2種類です。まずは関数呼び出しからやってみます。

f:id:alwei:20161005203802p:plain

まずは単純な関数を作成します。一度コンパイルと念の為に保存しておきます。ここで一度ブループリントエディターを閉じておきます。閉じておかないと上手く実行されないことがあるためです。Blutilityアセットをダブルクリックします。新規ウィンドウが開くはずです。

f:id:alwei:20161005204209p:plain

関数名のついたボタンが追加されているはずです。このボタンを押してみてください。

f:id:alwei:20161005204358p:plain

エディターがプレイボタンを押していない状態でも関数を実行できていることが確認できます。これでBlutilityが実行できていることが確認できました。

次に変数を追加してみます。変数は"編集可能"にチェックがついていると、Blutility上から簡単に値を変更することができます。編集後はコンパイルと保存をしてからエディターを閉じ、再度ダブルクリックで開いてみます。

f:id:alwei:20161005205043p:plain

これで変数を利用して引数のように自由に値を変更し、Blutilityに渡すことができました。当然変更した値で関数を実行すると、それが反映されています。

さて、次はもう1つの利用方法を試してみます。Blutilityアセットをダブルクリック時にイベントを発生させて実行する方法です。これを実行するには、"GlobalEditorUtilityBase"のデフォルト値を編集します。アセットを右クリックして、"デフォルトの編集"を選択します。そこに存在する"Auto Run Default Action"プロパティにチェックをつけ、コンパイルし、保存してウィンドウを閉じます。これでアセットダブルクリック時にイベントが呼び出せるようになりました。もう一度右クリックから"ブループリントの編集"を行います。

関数オーバーライド一覧、もしくは"On Default Action Clicked"というイベントノードを検索して配置します。

f:id:alwei:20161005210243p:plain

非常に単純なイベントですが、準備ができたらコンパイルし、保存してから一旦エディターを閉じます。あとはBlutilityアセットのアイコンをダブルクリックすると…

f:id:alwei:20161005210416p:plain

ちゃんとイベントを呼び出せていることが確認できます。これで一通りの使い方はわかりました。あとはどのように利用していくかです。

f:id:alwei:20161005210710p:plain

GlobalEditorUtilityBaseを継承すると上記のようなノードを使用することができるようになります。ブループリントAPIとしては以下のようになっています。一部はUE4.13にまだ入っていないものもあるようです。

Editor | Unreal Engine Blueprint API Reference

例えば、"Get Selection Set"ノードを使うと、現在選択しているアクターを配列で取得できます。ループで回すと簡単に名前をとったり、それらのプロパティを編集したりできるようになります。

f:id:alwei:20161005211219p:plain

とはいえ、正直なところまだまだこれらのノードだけではできることは少ないです。この辺りはまだ実験的機能の粋をでていない感じです。ただしそれだけでも色々とできることはあります。アクターに対する処理はアニメーションを行うなどは不可能ですが、"Set Actor Location"で位置を変更したり、"Destroy Actor"でアクターそのものを削除することもできます。この辺りは色々と試してみる価値ありです。

配置済みアクターからカスタムイベントでBlutilityを呼び出す

もうひとつのBlutility呼び出しの方法としては配置済みアクターのカスタムイベントから呼び出す方法です。やり方は通常のブループリントのアクタークラスを作成し、カスタムイベントを作成し、カスタムイベントの詳細パネルから"エディタで呼び出す(Call in Editor)"にチェックをつけておくだけです。

f:id:alwei:20161005213224p:plain

あとはアクターをレベルに配置し、選択して詳細パネルを表示させます。

f:id:alwei:20161005223355p:plain

"ブループリントユーティリティ"または"Blutilities"カテゴリーの一覧からカスタムイベントを選択できるようになっています。選択後に"実行(Run)"ボタンを押すと、Blutilityとして実行されます。

f:id:alwei:20161005213623p:plain

エディター上からカスタムイベントを実行し、別のアクターをスポーンさせることができました。勿論プレイした後にアクターが消滅することもありません。アクターを利用した場合には、"GlobalEdtorUtilityBase"を使うよりも、更に汎用的なノードを利用できます。DelayなどのLatentアクションは実行できませんが、かなりのことをエディター上から実行することが可能です。

f:id:alwei:20161005214521p:plain

更に変数を作成し、"編集可能"にチェックしてから、変数カテゴリーを"ブループリントユーティリティ"もしくは"Blutilities"に変更すれば、変数の値を調整しながらイベントの呼び出しを行えます。何かを調整する時には非常に便利です。

まだまだ実験的な機能ながら十分に有用

以上がBlutilityの簡単な使い方でした。エディター拡張といってもUIを拡張するわけではありません。しかしながらエディター上から様々な処理が実行できることがわかったと思います。

使い方によっては配置の自動化やレベル内のアクター全てに特定の処理を走らせるといったことが可能です。C++による拡張ほど高度なことはできませんが、簡単な拡張であれば面白いことができるはずです。ぜひBlutilityを活用してみてください!