【UEFN】フォートナイトでクリエイティブをする時に、たくさんのプレイ環境に対応するために気を付けること

UEFNで作成したコンテンツを様々なプレイ環境に対応させるために

フォートナイトは様々なプレイ環境に対応しているため、UEFNで作成する際も、たくさんの人にプレイしてもらうためには、様々な環境での動作確認をする必要があります。

様々なプレイ環境に対応させる必要がある

しかし、プレイステーションXBox、Switchなどのプラットフォームのほか、PCには様々な描画モードが存在します。 個人レベルの開発で、様々なプレイ環境で検証するというのはなかなかに大変な作業です。これがUEFNで制作する上での一番難しい点ではないでしょうか。

環境による差異が発生しやすいのはライティング関連やテクスチャ関連などかと思います。

少し雑多なまとめですが、最近開発を行った中で、自分としてはまったポイントを4つ紹介します。

1. ライトはMovableにしておく?(現状では)

一番最初はライトのMobilityに関してです。 DirectionalLightやSkyLightなど、ライトにはその可動性(Mobility)を指定することができ、Mobilityの初期値はStationalyとなっています。

ライトのMobility(初期値はStationaly)

そもそもMobilityがどういった役割なのかは、Epicの篠山さんがかかれている以下のドキュメントが非常に参考になります。

(いつもなんらかの篠山さんのページをリンクさせていただいております)

qiita.com

UEFNのライトは、StationalyとMovableの2つのMobilityがあります。

Stationalyの設定は事前のライト計算をして使用するモードとなりますが、自分の把握している範囲では、Stationalyに設定しても、UEFN上でライトの事前計算を実施する機能が現状はないように思われます。 (もしあったら教えてください)

ここで最初の重要ポイントです。

現状のUEFNでは、Lumenに対応していない環境でStationalyのライトを使用すると正しくライティングが行えないようです。

なんのこっちゃ?かもしれませんが、SkyLightを例にとって説明していきます。

まずは、Lumenオンの環境でスカイライトをStationalyに設定している場合です。

LumenONでStationalyのSkyLightのみでライティングした画面

このシーンではSkyLightのみでライティングを行っています。 SkyLightでプレイヤーはただしくライティングされています。

次にLumenをオフにしてやります。

LumenOFFでStationalyのSkyLightのみでライティングした画面
プレイヤーがまったくライティングされなくなりました。(いつものリムライトはいる状態)

UEFNエディターでのライトの事前計算はしてないので(できないので)、空間に環境光のためのボリュームデータが存在せず、プレイヤーなどの動くオブジェクトに対してまったくライティングできていないのだと思われます。

この状態でライトの設定をStationalyからMovableに変えてみます。

MobilityをMovableに変更

すると無事、SkyLightでプレイヤーがライティングされるようになりました。

LumenOFFでMovableのSkyLightのみでライティングした画面

ライトをMovableにするというのは最も処理としては重い処理となるため、本来的には避けたいところですが、現状で、様々な環境に対応するためにはライトはMovableにしておくのが必要なのではないかと思います。

※Lumenがオンの環境ではStationalyのモードとなっていても問題ありません。ライトがMovableとStationalyと違うことで、Lumenの処理がどう変わるのかは追えていません。すべてMovableにするというのはかなり横着な手段です。Lumenだけを考えればStationalyの方がいい可能性があります。

※これはあくまでも現状(2023年5月時点)の挙動だと思われ、今後仕様が変わる可能性が大きくあります。

2. テクスチャサイズは一枚2048まで

次に使用できるテクスチャのサイズに関してです。

以下の8Kのテクスチャを例にします。

8192x4096解像度のHDRI画像

このテクスチャを球体に張り、背景とすることを考えます。(そもそもゲーム開発の人には、8Kを使おうとしている時点で怒られそう・・・)

8KのHDRIを球体に適用し背景とする

UEFN上では、それっぽく表示されているため、Fortnite上での動作確認のためセッションを起動します。

すると、

テクスチャのサイズに関する警告

UEFNに怒られます。

おまえの使ってるテクスチャ、デカすぎじゃボケぇ!2048以下にしとけや!」とおっしゃられているようです。

でも、優しいUEFNさん、文句をいいつつも、実行してくれます。

「なんだ、優しいじゃん」と思って画面を見ると、

とても8Kには見えない画質

あれ、なんか汚い・・・

はい、そうです。

2Kを超えるテクスチャは、小さいサイズにダウンされてフォートナイト上では、使用されるようです。

この話は次に続きます。

3. 仮想テクスチャはすべての環境では使えない

「2Kより大きいテクスチャ使えないのか~。なら仮想テクスチャ使っちゃおう!」 そう考えました。

UEFNは非常に大きなテクスチャを分割して使用する仮想テクスチャ(VirtualTexture)に対応しています。

仮想テクスチャに関する説明は、やっぱりEpic篠山さんの以下の記事が参考になります。

qiita.com

テクスチャを8分割し、2Kの8枚のテクスチャ変更しました。

2048x2048 解像度の8枚のテクスチャに分割

UDIMのファイル名

これを仮想テクスチャとしてUEFNに読み込みます。

VTとついていれば仮想テクスチャになっている

天球を仮想テクスチャに対応できるようにした簡単なマテリアルを組み、フォートナイト上で動作確認します

今度のものは8Kのテクスチャとして相応の解像感です。

2Kx8枚を張り付けたもの

「はい、できた~」

と思ったのもつかの間、

「Switchでも正しく表示されるのかなぁ?」と思い、Switchで実行してみました。

すると、

Switchで同じシーンを実行した画面

ぐっふぇ!(涙)

Switch版のフォートナイト、仮想テクスチャに対応していないようです。(分割した一番最初の画像が張られている)

同様に、PCのパフォーマンスモードも仮想テクスチャに対応していません。(まぁ、パフォーマンスモードだからね・・・)

ちなみにPS4では正しく表示されました。(PS4頑張ってる!テクスチャの読み込みが遅いので、徐々に高解像度になっていきますが)

PS4で同じシーンを実行した画面

未検証ですが、PS4がOKであれば、PS5、XBoxでも問題ないのではないかと思われます。

仮想テクスチャを使うのであれば、現状はSwitchなどで正常表示されないことを覚悟しないといけないようです。

4. ハードウェアレイトレーシングのLumenでは、メッシュ側にレイトレースを避ける手段がない

空をテクスチャで表現する場合、別のことにも気づきました。

「あれ?ハードウェアレイトレースのLumenの場合、画面が暗いぞ・・・」

画面全体に影が落ちてしまっている

ハードウェアレイトレースONのLumen設定

ハードウェアレイトレースオフのLumenの場合は問題ないのですが、ハードウェアレイトレースオンの場合、全天球を配置してしまうと、全体が影に覆われてしまうようです。

これは、おそらく、レイトレースの計算の中で、「空間が球でおおわれているから影!」と計算しているように思われます。

UEFNではなく、本家のUnrealEngineでは、レイトレースの計算にそのメッシュを含めるか含めないかのチェックがオブジェクト単位に存在します。

UEFNには存在しないRaytraceに対するVisible設定

しかし、この機能がUEFNでは未実装のようです。

これをどう回避するか、もろもろ試した結果、回避方法が分かりました。

それは、

球を超でっかくする!

これです。

天球を大きくすることでRaytraceに反映されなくする

球の大きさが大きくなりすぎると、レイトレースのレイが到達しなくなり、影が落ちることがなくなるようです。

一応の回避策はありますが、あまりスマートではないですね・・・。

まとめ

フォートナイトは様々な環境でプレイできることが大きなメリットですが、UEFNを使って開発をする際には、様々な環境でテストしなくてはならなくなり、これはかなり大変な作業に思われます。 この環境であればこの設定、この環境であればこの設定、といったことができればいいのですが、現状のUEFNではそうした機能がなく、今後の機能追加に期待です。

今回は自分がはまったポイントを4点紹介しました。この記事がなんらか皆さんのお役に立てば幸いです。

今後もRingoGamesではUEFNに関するさまざまな情報を発信していきます。Twitterでお知らせしていきますので、よろしければ、Twitterのフォローをしていただけると幸いです。

Twitterはこちら

twitter.com

UEFN 超楽しい :) 

基本的な検証が大枠できたので、自分もついにリリースするためのゲームを作り始めました:)

頑張って6月までにはリリースしたいです。