Let's Enjoy Unreal Engine

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

UEFN Verse事始め

先日のGDC2023でUnreal Engine 5.2の新機能とUnreal Editor for Fortnite(UEFN)が発表されました。
もちろんUE5.2にも注目するべきところなのですが、今回は特に目玉として発表されたUEFNについてを記事にしたいと思います。

UEFNはEpic Gamesが開発している大人気シューターゲーム『フォートナイト』のアドオンとして提供されるツールであり、中身はUnreal Editorをカスタマイズされたものとなっています。元々フォートナイトには『フォートナイト クリエイティブ』というゲーム内で独自のマップを制作するための仕組みが用意されていました。

フォートナイト クリエイティブ資料

このフォートナイト クリエイティブが一気に進化し、Unreal Editorで直接マップを制作、もしくは完全に独自のゲームも制作することが可能となりました。それがUEFNです。

Unreal Editor for Fortnite のドキュメント

更にUEFNには現状世界で唯一動作する環境のスクリプト言語『Verse』が搭載されています。VerseはBPと違ってテキストで記述する必要があるスクリプトですが、最初からゲームやリアルタイム性の高いコンテンツでの利用を想定されており、非常に高速に動作します。

dev.epicgames.com

このVerseという全く新しいスクリプト言語は非常に良く出来ており、今回はUEFNとVerseを触ってみた流れを少しまとめてみました。フォートナイト勢としては非常に素人な自分ですが、UE勢の視点からUEFNの内容を解説してみたいと思います。

UE5とUEFNの違い

UEFNは中身こそUE5.1のバージョンですが、細かい点で様々な部分が違います。

  • スクリプト言語 Verseが利用可能
  • ブループリントはイベントグラフなどのロジックが作成不可
  • 組み込みアセットは読み取り専用となり、編集も開くことも不可能
  • フォートナイト用アセットには最初から機能が組込まれている
  • ゲームプレイ時のPIEに相当するものがない
  • セッションを開始でフォートナイトが起動し、自動的に通信される
  • ライブ編集により、UEFNとフォートナイトが自動的に同期する
  • 作成可能なアセットタイプがかなり限定されている
  • プラグインを入れたり、オンオフしたりもできない
  • プロジェクト設定、エディタ環境設定も項目が非常に限定的
  • Time of Day(時間変化)機能が標準で組み込み
  • Unreal Revision Controlという機能で簡易バージョン管理が可能
  • チームを作成するとプロジェクトが共有可能
  • インポート可能なアセットにかなり厳密な制限あり
  • プロジェクトサイズが自動的に管理される
  • 作ったプロジェクトをアップすることで誰でも遊べるようになる

と、まぁかなりの部分で別物になっていると言えるでしょう。何よりBPによるロジックが一切作れないというのは物凄い思い切りだと思いました。代わりに現状唯一Verseが動作する環境としてUEFNがオンリーワンの立ち位置となっています。

Verse言語について

Verseという新たなプログミング言語はEpic GamesのTim SweenyがHaskellという関数型プログラミング言語のコンパイラーであるGHCの作者であるSimon Peyton JonesをEpic Gamesに招き入れてまでこだわりぬいて設計されたマルチパラダイムプログラミング言語です。公式ドキュメントには以下のような設計目標の説明があります。

dev.epicgames.com

  • シンプル:プログラミング初心者でも習得できる。
  • 汎用的:どのような種類のコードやデータも記述できる。
  • 高い生産性:チーム作業におけるプロジェクトのビルド、イテレート、シッピング、およびコードとコンテンツの統合。
  • 静的に検証:コンパイル時にできるだけ多くの種類のランタイムの問題を見つけられるようにする。
  • 高いパフォーマンス:リアルタイム、オープン ワールド、およびマルチプレイヤー ゲームの作成。
  • 完全:言語のすべての機能でプログラマーによるその機能の抽象化をサポート。
  • 長期的に使用可能:他の言語の過去のアーティファクトに根差すことなく、現在のニーズと近い将来のニーズに対応する設計。

更にVerseの特性として下記のような特徴もあります。

  • 強い型付け。開発または展開時にエラーが特定されない事態を最小限に抑えるとともに、静的チェック をサポートします。
  • マルチパラダイム。可能な限り 決定論的 になるようにするなど、関数型プログラミングオブジェクト指向プログラミング、および 命令型プログラミング の長所を活かします。その例としては、データがデフォルトで 不変 となっており、コードとデータが同じであれば、結果は常にまったく同じになるといったことが挙げられます。
  • 文 と 式 の区別がない。Verse では すべてが式 であるため、すべてで 結果 が得られます。
  • 失敗は制御フロー。Verse では、(判定ポイントなどで) プログラムの フローを変更する ために true/false 値を使用するのではなく、成功した場合に値を生成し、失敗した場合には値を生成しない 失敗する可能性がある式 を使用します。失敗する可能性がある式は、if 式 などの 失敗コンテキスト でのみ実行できます。
  • 失敗コンテキスト 内での 投機的実行 が可能。アクションを コミット することなく試行できます。式が成功すると、その式のエフェクトは コミット されますが、式が失敗した場合、その式のエフェクトは式が評価されなかったかのように ロールバック されます。このようにして、次々と変更が加えられる一連のアクションを 実行 できますが、失敗コンテキストで失敗が起きると、そうしたアクションは元に戻されます。
  • 言語レベル での 並列処理。アクションを同時に実行するために複数のプロセッサのシステムレベルの スレッド に頼る必要がありません。言語で組み込みの並列処理式を使用することにより、制御フロー と同じようにタイムフローを作成できます。

関数型プログラミングの特徴を持ちつつ、オブジェクト指向も出来るので、初心者でも入りやすいという特徴がありますね。また言語レベルでの並列処理は非常にこだわって設計されており、様々なケースの並列処理を言語組み込みの機能で実装ができるようになっています。他にも失敗コンテキストでの投機的実行など式が失敗した時にロールバックするなど他の言語は到底みられないような機能もあります。

さて、長くなってしまいましたが、早速Verseを実際に実行できるようになるまでをやってみましょう。

UEFNのインストールと起動

UEFNはフォートナイトのアドオンとなっていますので、Epic Games Storeから入手する必要があります。フォートナイトと一緒にインストールしてください。もちろん全て無料で使うことが可能です。

インストールが終わったらライブラリからUEFNを起動しましょう。

最初は普段のUE5エディターと同じように起動シーケンスが走ります。起動すると開始メニューが表示されます。Doneを選択して先へ進みましょう。途中規約が何度か表示されると思いますので、全て承諾してから次へと進んでください。

UE5と同じようにプロジェクトブラウザが起動しますので、テンプレートから開始しましょう。Verseの簡単なサンプルもいくつかありますが、とりあえず『Verse Devices Starer』を選択して次へといきましょう。

これでUEFNで最初のプロジェクトの起動ができるようになりました。エディターの画面だけみるといつものUE5の画面にしか見えないですね。


Verseを起動する

Verseを起動するために、まずはコンテンツドロワーを開いて、プロジェクト名の直下にある『CreativeDevices』フォルダー内にある、『hello_world_device』ファイルをダブルクリックで開いてみましょう。

Visula Studio Code(VSC)が入っていれば自動的にVSCが起動します。Verse用の拡張機能も自動的にインストールされるようです。もしVSCが入っていない場合はインストールを促されるようなので、絶対他のエディターがいいということでなければVSCを使いましょう。これでVerseのコードが読めるようになりました。

Verseのコードを管理する場合は、Verse Exploererと呼ばれる機能を使います。エディター上部メニューから起動可能です。ファイルの追加、移動、削除などもこちらの機能で行いますので、覚えておくとよいでしょう。

それでは早速実行といきたいところですが、実行の前にまずはフォートナイトの中では仕掛け(Device)という仕組みが用意されており、Verseも仕組みの一部として実装されているようです。仕掛けについてはフォートナイト クリエイティブのドキュメントに詳しく解説されているので、一度読んでみるとよいです。

dev.epicgames.com

仕掛けはわかりやすく言えば、BPアクターのようなもので、ロジックが最初から用意されており様々な挙動を行うことが出来ます。なので配置するだけで様々な便利機能が使えるわけですね。それではVerseの仕掛けをレベル上に配置しましょう。

これでVerseの仕掛けが配置されましたので、あとはゲームを実行するだけです。実行はツールバー上にある『セッションを開始』ボタンを押します。押す前に右側の3点ボタンを押して、『ゲームを自動スタート』を選択しておくことで、起動と同時にゲームが始まるのでワンアクション少なくなって楽になると思います。


あとはUEFNが通信を行い、現在の情報をアップロードし、フォートナイトが自動的に起動しますので、しばらく待ちます。最初の起動は結構時間がかかりますので、気長に待ちましょう。起動するとフォートナイト上でカウントダウンが始まり、ゲームが始まります。ゲームが始まると落下が始まってそのまま地上に到着するまで待っても良いですし、一旦Escを押してゲーム終了させても大丈夫です。

さて、肝心のVerseはどこで実行されたのかを確認してみましょう。ゲーム開始後にAltキーを押すと現在の島の情報をみることができます。ここでタブメニューの一番右にログという項目がありますので選択します。そうするとUE5のアウトプットログみたく、Printなどのログ情報を確認することができます。

今回のスクリプトは非常に簡単で、仕掛けが動作したと同時に『OnBegin』という関数が処理されています。その際に2行Print関数が実行されていますので、その結果がログに表示されているというわけですね。サンプルそのままですが、実行されているコードを貼り付けておきます。

using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }

# A Verse-authored creative device that can be placed in a level
hello_world_device := 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}")

現状シンタックスハイライトは適当になっていますので、ご了承ください。

これだけを読むと非常にシンプルでわかりやすいコードですね。Print関数で"Hello, world!"という文字列の表示と"2+2={2+2}"の部分は中括弧内で演算された結果が文字列として処理されていることも直感的です。ひとまずVerseが実行できていることがわかりました。ここからどんどんコードを書いていけますね。

コード変更後は当然コンパイル

Verseは静的型付け言語なので、コード修正後はコンパイルが必要です。コードを修正したらUEFN内で『Ctrl + Shift + B』を押すとコンパイルが行なわれます。あとは『Push Verse Changes』というボタンを押すことで自動的にフォートナイト上で修正コードが実行されます。

適当に文字列を変更してログを確認してみましょう!問題がなければ修正後の内容で表示されているはずです!さて、これでVerseを使ってUEFN内でロジックを作ることが可能となりました。次回以降に少しずつやれることを増やしていこうと思いますので、また次回以降の更新をお楽しみに。