April 3, 2018

「フォートナイト バトルロイヤル」 モバイル版で採用した技術

作成 Sam Deiter

エピック ゲームズの「フォートナイト バトルロイヤル」の最新情報をチェックしている方は、モバイル版「フォートナイト バトルロイヤル」発表 についてご存じのことと思います。フォートナイトがモバイル デバイスでプレイできるようになったのです。

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

クロスプレイの問題を理解する


Battle_Royale_Supported_Platfroms_No_Logo.png

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

1 対 1 の対応関係とは

What_Is_One_To_One.png

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

ひとつのメッシュですべてを制御する 

Static_Mesh_Editor_LOD_01.png

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

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

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

Per_Platform_LOD_Tree_Mobile.png

最後に、モバイル デバイスでこのスタティックメッシュを使用する場合、PC やコンソールに比べて使用できるメモリはさらに少なくなるため、最初の 2 つのスタティックメッシュを除いて、最後の 1 つだけを使用するようにします。

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

幸い、すべてのプラットフォームで同じマップとアセットを使用しているため、これは簡単に対処できる問題でした。スタティックメッシュにコリジョン オブジェクトを加えるようにするだけです。これで、このスタティックメッシュが、その使用を求めるすべてのプラットフォームを制御します。

ドローコール数を制限する

UE4 プロジェクトでレンダリングのパフォーマンスを高める最良の方法は、1 フレームで要求されるドローコール数を減らすことです。ドローコールとは、ゲーム ワールドを作るためにスタティックメッシュとそれに適用されているマテリアルが 1 フレーム中に画面上に描画されなければならない回数のことです。しかし、ドローコールを制限すると、マテリアルとトライアングルが最適化されることになります。これは、ワールドを作るために膨大な数のアセットを使用したフォートナイトのような規模のゲームでは問題になることがあります。不可能に近いこのタスクを何とかするために、Hierarchical Level of Detail すなわち HLODProxy Geometry ツールを活用しました。

こうしたツールを使ってどのようにドローコール数を減らしたのでしょうか?まず、HLOD ツールを使って以下の画像のように互いに近い位置にスタティックメッシュを配置 (クラスタという) してグループにします。
HLOD_SM_Group.png

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

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

Org_VS_Proxy_At_Game_Distance_01.png

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

Org_VS_Proxy_At_Game_Distance_02.png

上の画像 (‘Original’ とラベルが付いているもの) は、HLOD と Proxy Geometry を使用しない場合を示しています。小さな (ハイライトされている) エリアは、424 個のスタティックメッシュで構成されており、556,445 個のトライアングルをレンダリングする必要があります。これは小さく非常に遠くにある物なのに、膨大なリソースを消費しています。 

下の画像 (‘Proxy’ とラベルが付いているもの) は、HLOD と プロキシ ジオメトリ ツールを使用した場合を示しています。この小さなエリアでは、1,2