【UEFN】 VerseでDeviceを連携させる(Verseの学習①)
ついに登場!UnrealEditor for Fortnite (UEFN)
3月23日、発表から約2年半の歳月を経て、UnrealEditor for Fortnite (以下UEFN)がついにリリースされました。
Fortnite専用のUnrealEditorとして一体どこまでのことができるのか、23日のリリースから自分も毎日試用してきます。まだまだ分からない点が多いですが、把握できたことをブログとして残しておきたいと思います。
今回は、現状でもっとも基本的な作業だと思われる、新プログラミング言語「Verse」を使用して、デバイスを連携させる基本的な方法を紹介します。
外部の3Dデータ(BlenderのSuzannne)を読み込んで、これにダメージを与えた時に画面上にメッセージ(Hello Suzanne!!) を表示します。
現状のUEFNについて
「UnrealEngineとFortniteが連携する!」ということで、UnrealEngineで出来ることが全てできるようになるのか?という期待をしてました。マップの作成という面では、かなり多くのUnrealEngineのツールが使えるようになっており、大きく可能性が広がったのですが、ゲームロジックの作成という面では、まだできることが限られてる印象です。
現状では、UnrealEngineのようなBlueprintで制御を組むことができない、また、UnrealEngineのTickや、UnityのUpdate関数などのような、作画の毎フレームでの処理を行うことができないため、あくまでも従来のFortniteCreativeの仕組みの中でゲームを作成していく必要がありそうです。
将来的には、UnrealEngineのすべての機能をUEFNに入れていく予定だとEpicは話していたので、この状況は飛躍的に変わる可能性がありますが、まだ、少し時間がかかりそうです。
そこで現状のキーとなるのが、UEFNに導入されたVerseです。(こちらはまだUnrealEngineに実装されておらず、UEFNが先行する形)
Haskellの開発者をEpicに招き入れ、TimSweeneyが鳴り物入りで開発している言語ということでいったいどんな実装になるのかわかっていませんでしたが、思ったよりも従来のプログラミング言語に近い形でした。他のプログラミング言語に親しんで来た人はそれほど苦労することなく使える気がします。
現状のVerseを使った開発の基本構成
Verseを使用した開発の現状の肝は、Creative_Deviceの基本機能を継承した独自のCreative_Deviceを作成し、その独自Creative_Deviceの中でFortniteのDeviceの制御を行うことかと思われます。現状では、Creative_Deviceを基本形とするテンプレートしか用意されていないようです。(ここも将来的には拡張される部分ではないかと思われます)
そこで今回は下図の構成のサンプルを組みます。 Verseで独自のCreativeDeviceを作成し、TriggerDeviceからのEvent(ダメージを受けた時などに情報が送出される)を受け取り、その信号を受け取った際にHUDMessageDeviceで制御を行いメッセージを出力します。
この構成が現状のUEFNの基本形かと思われ、多くのものはこの形を複数組み合わせることにより出来上がるはずですので、この基本形を理解しておくことが一番最初のステップではないでしょうか?
シーン準備
では、ここから実際に制作していきます。まず、プロジェクトを作成し、コンテンツブラウザからシーン上HUDMessageDeviceとTriggerDeviceを追加します。
そのままの見た目ではあまりにも単純なので、外部からモデルを読み込んでみることにします。別途BlenderからSuzanneのモデルをFBXフォーマットで出力しており、これを①の部分にエクスプローラからドラッグしてやると、インポート画面が表示されます。今回は特に何も設定せずに「全てインポート」を押すとエディター上でモデルを使用できるようになります。
次に、モデルを適用します。
①アウトライナー上でTriggerDeviceを選択し、②詳細パネルでStaticMeshComponentを選択、③StaticMeshの項目から読み込んだSM_Suzanneを選択すると、TriggerDeviceがSuzanneで表示されます。
このモデルは質感が設定されていないので、マテリアルをEditor内に入っていたMI_Gravelのマテリアルを設定しました。
TriggerDeviceのプロパティをさらに編集し、 もとのTriggerDeviceのモデルは表示したくないので、「ゲーム中に表示」のチェックはOFF、ダメージに反応してほしいため以下のようにチェックを付けます。 このようにするだけで外部から読み込んだモデルに対してもきちんと当たり判定がつき、TriggerDeviceの一部として動作してくれるようです。
現状の見え方はこのようになってます。(位置は調整しています)
Verseコードの追加
では、いよいよこれらを制御するCreativeDeviceをVerseで作成していきます。 上部VerseメニューからVeseExplorerを開きます。
プロジェクト名を右クリックして、「Add new Verse file to project」 を押下します
Verseスクリプト作成画面が現れます。前述したようにCreativeDeviceを継承したテンプレートしか現状はないようです。
「作成」を押下するとVisualStudioCodeが起動します。(インストール済みの場合)
インストールしていない場合は、以下のリンクからダウンロードしてインストールしておくのがいいかと思われます。 VisualStudioCodeはプログラミング用のEditorとして非常に優秀で、多くのプログラマーが愛用しています。
Verseコード初期状態
作成した直後のコードは以下のようになっています。
using { /Fortnite.com/Devices } using { /Verse.org/Simulation } using { /UnrealEngine.com/Temporary/Diagnostics } # A Verse-authored creative device that can be placed in a level trigger_test := class(creative_device): # Runs when the device is started in a running game OnBegin<override>()<suspends>:void= # TODO: Replace this with your code Print("Hello, world!") Print("2 + 2 = {2 + 2}")
では、このコードを解説していきます。 先頭の3行の以下の部分は、必要なライブラリの宣言です。 自分が使用したい機能をもっているライブラリを追加しておく必要があります。
using { /Fortnite.com/Devices } using { /Verse.org/Simulation } using { /UnrealEngine.com/Temporary/Diagnostics }
どういったライブラリが存在し、どういった機能があるのかは、以下を参照していく必要があります。
次にこの部分です。
trigger_test := class(creative_device):
ここはクラス定義となっており、簡単に言うと「creative_deviceという基本機能からそれを拡張したtrigger_testという新機能を作ります」という宣言になります。
それに続く部分が、このtrigger_testという新デバイスがcreative_deviceから拡張された新しい機能を書いていく部分です。
最も大事な部分は以下の部分になります。
OnBegin<override>()<suspends>:void=
creative_deviceの基本機能の中では、OnBeginで書かれている部分がゲームスタート時に実行されるというルールになっています。そのため、ゲーム開始時に実行したい制御をこの下に書いていきます。
これを見るとゲーム実行時に以下のことをするようです。
Print("Hello, world!") Print("2 + 2 = {2 + 2}")
Printと書いてありますが、これは画面に出るわけではなくログ画面に出力されるものとなっています。ログを見ると以下のようになっていることが分かります。
このPrintはプログラムをDebugする際に重宝するかと思います。
Verseプログラム改修後
今回の処理を実現するためにコードを以下のように変更しました。
using { /Fortnite.com/Devices } using { /Verse.org/Simulation } using { /UnrealEngine.com/Temporary/Diagnostics } # A Verse-authored creative device that can be placed in a level trigger_test := class(creative_device): @editable Trigger:trigger_device = trigger_device{} @editable HudMessageDevice : hud_message_device = hud_message_device{} # Runs when the device is started in a running game OnBegin<override>()<suspends>:void= Trigger.TriggeredEvent.Subscribe(OnTriggeredEvent) hudMessage<localizes> : message = "Hello Suzanne !!" OnTriggeredEvent(Player:?agent):void= HudMessageDevice.SetText(hudMessage) HudMessageDevice.Show()
変更後のコードを見ていきます。
まず、以下の部分です。
@editable Trigger:trigger_device = trigger_device{} @editable HudMessageDevice : hud_message_device = hud_message_device{}
このプログラムの中では、TriggerDeviceから情報を受け取り、HUDMessageDeviceの制御をしなければなりません。そのため、これを扱えるようにしています。 @editableと付けることで、UnrealEditor上で、実際にどのデバイスをターゲットとするのか設定することができるようになります。
次がOnBeginの中の以下の部分です。
Trigger.TriggeredEvent.Subscribe(OnTriggeredEvent)
Subscribeは購読するという意味になりますが、これはTriggerでイベントが発生したらOnTriggerEventという部分を実行するように登録しておくといったニュアンスになります。 現状のUEFNのVerseのプログラミングでは、このイベントを登録するというSubscribeの関数が非常に重要になっていきます。
ここでは、ゲーム開始時にトリガーイベントが発生した際に実行する部分をまず登録しています。
そのOnTriggerEvent部分です。
hudMessage<localizes> : message = "Hello Suzanne !!"
OnTriggeredEvent(Player:?agent):void=
HudMessageDevice.SetText(hudMessage)
HudMessageDevice.Show()
OnBeginでゲーム開始時にSubscribeされたのち、この部分はTriggerDeviceがイベントを発行するたびに実行されます。 そのため、TriggerDeviceがダメージを受けるたびに、このOnTriggerEventは実行されます。 処理の内容は、
- HUDMessageDeviceが表示する文字を”Hello Suzanne !!"にする
- その文字を表示(Show)
という流れになります。
シーンにtrigger_test deviceを追加
これはまだtrigger_testデバイスという素材を作成しただけです。そのため、これを実際にシーン上に配置して、@editableで設定したパラメーターをセットしなくてはなりません。
「Verseコードをビルド」するとUnrealEditorがVerseコードからEditor上で使用可能なtrigger_test デバイスをコンテンツブラウザ上に作ってくれます。そこで、これをシーン上に配置してやります。
配置したtrigger_test deviceで@editableにしていたTrigger DeviceとHUDMessageDeviceをそれぞれシーン上のものに指定します。
これで設定としてはすべて完了したため、いよいよFortnite上で動作をさせていきます。 画面上部のメニューから 「Push Verse Changes」「Push Changes」を押下して、サーバー側にデータを送信します。
この後ゲームをスタートすると、Suzanneモデルを殴った際に、HelloSuzanne の文字が表示されるかと思います。
まとめ
今回、最も基本的なVerseを使用した制御を作成しました。Verseについて動作の流れに重点を置いて説明をしたため、細かな部分はあまり説明していません。Verseの言語仕様に関してはEpicのドキュメントを見ていただく必要があるかと思います。
今後もFortniteCreativeを盛り上げることを目標に、情報発信を続けていくつもりです。 Twitterフォローしていただけると嬉しいです。 twitter.com