エピック ゲームズのアーティストとエンジニアから成るチームは、PC、コンソール、モバイルのプラットフォームにまたがるプレイで一体感を持たせるために、簡単に維持管理できるだけでなく、全てのプラットフォームで同じゲーム体験を実現可能にするソリューションを実装しました。この記事では、その過程で直面した課題とそれに応じて作成した UE4 のソリューションについて説明します。
クロスプレイの問題を理解する

フォートナイト バトルロイヤルにおけるクロスプレイとは、異なるプラットフォーム ( PC、コンソール、モバイルなど) を使用するプレイヤーが同じアセット一式を持つ同じマップで同じサーバーで一緒にプレイできることを意味します。これはすごいことですが、アートやエンジニアリングの面でいくつかの問題に直面しました。
1 対 1 の対応関係とは

フォートナイトでクロスプレイを可能にするうえで重要な課題のひとつにすべてのプラットフォームで機能する単一マップとアセット一式を用意するということがあります。これが非常に重要なのは、真のクロスプレイ体験を実現するにはマップとそこにあるすべてのアイテムが 一対一 の関係を維持する必要があるからです。「一対一の関係」とは、フォートナイトをどのプラットフォームでプレイしていても、マップとそこにあるすべてのアセットは同じでなければならないという考え方です。PC ゲームで表示されている実際のマップとアセットは、コンソールやモバイル デバイスで見るものと同じになります。こうすることで、コンテンツが欠けたり違うということで、有利または不利になるプラットフォームがなくなります。
ひとつのメッシュですべてを制御する

幅広いハードウェア間で同じマップとアセットを実行するために、LOD (Level of Detail) システムの機能に大幅な変更を加える必要がありました。とはいえ、あまり心配しないでください。LOD システムはこれまでと同じように機能しますが、[Minimum LOD] という新しい設定を加えたのです。これを使うと、プラットフォーム毎に LOD の使用方法を指定することができます。この機能を理解するには、Automatic LOD Generation tool (LOD 自動生成ツール) を使って作成された以下のスタティックメッシュのサンプル画像と 3 つの LOD をご覧ください。

PC でこのスタティックメッシュを使用する場合は、メモリが十分にあるため 3 種類すべてを使用することができます。

しかしコンソールで使用する場合は、メモリに制限があるため、ひとつめのスタティックメッシュを除いて、残りの 2 つだけを使用します。

最後に、モバイル デバイスでこのスタティックメッシュを使用する場合、PC やコンソールに比べて使用できるメモリはさらに少なくなるため、最初の 2 つのスタティックメッシュを除いて、最後の 1 つだけを使用するようにします。
プラットフォーム毎に使用する LOD を制限することで、コンテンツを大幅に変えずにレンダリングのパフォーマンスを高めます。[Minimum LOD] の設定は、スタティックメッシュ エディタの [LOD Settings] にあります。以下の画像は、上の例で使用した木のスタティックメッシュをセットアップして、各プラットフォームで特定の LOD 範囲を使用する様子を示しています。コンソール と モバイル の入力スロットの値に注意してください。
LOD システムではプラットフォーム毎に LOD を指定できる柔軟性がありますが、他に重要な点として、スタティックメッシュのコリジョンもプラットフォーム間で同じ状態を保つということがあります。異なるコリジョン オブジェクトが設定されているスタティックメッシュでは、意図に反してあるプラットフォームを他のプラットフォームよりも有利にしてしまいます。これは何としてでも避けなければなりません。

幸い、すべてのプラットフォームで同じマップとアセットを使用しているため、これは簡単に対処できる問題でした。スタティックメッシュにコリジョン オブジェクトを加えるようにするだけです。これで、このスタティックメッシュが、その使用を求めるすべてのプラットフォームを制御します。
ドローコール数を制限する
UE4 プロジェクトでレンダリングのパフォーマンスを高める最良の方法は、1 フレームで要求されるドローコール数を減らすことです。ドローコールとは、ゲーム ワールドを作るためにスタティックメッシュとそれに適用されているマテリアルが 1 フレーム中に画面上に描画されなければならない回数のことです。しかし、ドローコールを制限すると、マテリアルとトライアングルが最適化されることになります。これは、ワールドを作るために膨大な数のアセットを使用したフォートナイトのような規模のゲームでは問題になることがあります。不可能に近いこのタスクを何とかするために、Hierarchical Level of Detail すなわち HLOD や Proxy Geometry ツールを活用しました。こうしたツールを使ってどのようにドローコール数を減らしたのでしょうか?まず、HLOD ツールを使って以下の画像のように互いに近い位置にスタティックメッシュを配置 (クラスタという) してグループにします。

HLOD クラスタを作成したら、Proxy Geometry Tool (プロキシ ジオメトリ ツール) を使ってプログラムで高度に最適化した置換用のスタティックメッシュとテクスチャを HLOD クラスタのオブジェクトに対して作成します。Proxy Geometry Tool がタスクを終了したら、以下の画像のようになります。

上の画像を初めて見ると、プロキシ ジオメトリ ツールがうまく機能しなかったか、セットアップを誤ったとお考えになるかもしれませんが、そうではありません。プロキシ ジオメトリの見た目が少し変なのは、意図した見方で見ていないからです。以下の画像で見ると、ゲーム内でどのように見えるかがわかります。

上の画像で枠で囲われたエリアは、HLOD とプロキシ ジオメトリ ツールを使用して遠方のオブジェクトを置換した場合の視覚的違いを示しています。エリアは非常に小さく、わかりづらいため、ハイライトしたエリアを拡大して以下の画像にしました。

上の画像 (‘Original’ とラベルが付いているもの) は、HLOD と Proxy Geometry を使用しない場合を示しています。小さな (ハイライトされている) エリアは、424 個のスタティックメッシュで構成されており、556,445 個のトライアングルをレンダリングする必要があります。これは小さく非常に遠くにある物なのに、膨大なリソースを消費しています。
下の画像 (‘Proxy’ とラベルが付いているもの) は、HLOD と プロキシ ジオメトリ ツールを使用した場合を示しています。この小さなエリアでは、1,215 個のトライアングルをレンダリングする ひとつの スタティックメッシュが必要です。確かにこの 2 つの画像では若干の視覚的違いがあるかもしれませんが、実際にはプレイヤーが目にしないような状態でズームインして見ていることに注意してください。さらに、UE4 プロジェクトで得られるパフォーマンス上のメリットを考えると、遠方のオブジェクトがオリジナルと完全に一致しない可能性があったとしても価値ある方法といえます。
終わりに
この記事で取り上げたフォートナイトを幅広いデバイスでプレイ可能にした素晴らしい新機能はすべて UE4 の 4.19 リリースに入っています。UE4 プロジェクトで HLOD とプロキシ ジオメトリ ツールを使用する詳細情報については、以下のリンク先の UE4 公式ドキュメントをご覧ください。HLOD ツール

HLOD ツールを使ってスタティックメッシュのグループを作成し、ひとつの大きなスタティックメッシュとテクスチャにマージします。
プロキシ ジオメトリ ツール

このツールを使って、高度に最適化されたスタティックメッシュとテクスチャをプロシージャルに作成し、遠方のオブジェクトをレンダリングする負荷を減らします。
UE4 をまだ使用したことがなく、入手したい場合は、以下のリンクからダウンロードすることができます。