[Omniverse] [Unity] PrefabとPayload

前回はOmniverse Unity ConnectorからのUSDエクスポートにおけるマテリアルについて説明しました。
今回は、Unityのアセット構造をUSDではどのように処理しているかについて書いていきます。
また、USDの参照構造の特徴、USDでのReferenceとPayloadの違い、もまとめることにしました。

以下の環境で確認しました。

Unity : 2022.3.6f1
Omniverse Unity Connector : 201.0.0 beta
Omniverse USD Composer : 2023.2.0 beta

Prefab : Unityでのアセットの構造

Unityはfbxやobjなどの形状データを読み込み、それをアセットとして扱います。

Omniverse Unity Connectorを使用すると、ここにアセットとしてusdも加えることもできます。

シーンを作る場合は複数のアセットを並べて構成することになります。

Hierarchyウィンドウでは、青色で表現されています。
Unityではこのカプセル化されたアセットをPrefabと呼んでいます。
上記画像では8枚の畳を使っていますが、これは同じPrefabを複製して配置しています。
Prefabの中に他のPrefabを入れて階層化することも可能です。

USDファイルをエクスポート (Prefab to Payload = Off)

これをOmniverse Unity Connectorのデフォルト設定でエクスポートしてみましょう。
メインメニューの[Omniverse]-[Settings]では以下のように指定しました。

"Prefab to Payload"チェックボックスがOffの場合は、1つのusdファイルが出力されることになります。
[Omniverse]-[Export]よりusdファイルをエクスポートしました。

USD Composerで確認

USD Composerにusdファイルをインポートしました。
まだOmniverse Unity ConnectorではUnityのSkyBoxのエクスポートは対応されていないため、背景(DomeLight)はUSD Composer上で入れ替えています。

このときのファイル構造は以下のようになっています。

usdファイルのあるフォルダにMaterialsフォルダが作成され、その中にマテリアル名ごとのフォルダとテクスチャファイルが出力されています。

USDファイルをエクスポート (Prefab to Payload = On)

Unity Editorに戻ります。
次に、[Omniverse]-[Settings]で"Prefab to Payload"チェックボックスをOnにしてエクスポートしました。

USD Composerで確認

このときのファイル構造は以下のようになっています。

"payloads"フォルダにUnityのシーンで使われていたPrefabがusdファイルとして出力されているのを確認できます。

USD Composerにusdファイルをインポートしました。
なお、背景のDomeLightをUSD Composer側で追加しました。

1つのusdファイルにて、外部のusdファイルをPayloadとして参照しているのを確認できました。
usdでシーンを構築する場合は1つのusdファイルだけではなく、複数のusdの参照構造で構築する、というのがよくある使い方になります。
基本的にはベースとなるシーンはEnvironment(DomeLight)や太陽光などのグローバルな指定だけを行い、後は別途用意したusdファイルを使ってPayloadで組み上げていくことになると思います。

UnityのPrefabとUSDのPayloadは同じ考え方で、移行もしやすそうなのが分かりますね。

参考までにOmniverse Unity Connectorでエクスポートされたusdで、個々のprefabごとのusdをそれぞれ表示してみました。

USDの参照構造について

ここで、USDの参照構造について改めて見ていくことにします。
これはOmniverse Unity Connectorとは別で、USDの話題になります。
Omniverse Unity ConnectorはOmniverse Nucleusに対してもエクスポートできますが、エクスポート先の環境(URLで指定されたパス)に対してUnity上のPrefabを個々にUSDとして出力し、Payloadとして参照しています。

USDの参照(Reference/Payload)は、ローカルだけでなくネットワークからも参照することができます。
この図ではルートのUSDはローカルに配置しています。
ですが、ルートのUSDはNucleus上でもネットワーク上でもどこにあっても問題ありません。

  • ローカル上のUSD
  • LAN内の別PC/サーバ上のUSD
  • LAN内のNucleus上のUSD
  • ネットワーク(Cloud)の先のサーバ上のUSD
  • ネットワーク(Cloud)の先のNucleus上のUSD

ちなみに、テクスチャファイルもUSDと同様に外部からの参照が可能です。
ここでhttp,httpsで参照されているusdは読み込み専用になります。
Omniverse(USD Composerなど)ではNucleus上にusdを配置することで、そのusdは読み書きの両方ができるようになります。
また、それぞれのUSDから別のサーバ上のUSDを参照することも可能です。

USD自身がネットワーク構造になっているのが分かりますでしょうか?
これはUSDの大きな特徴の1つになります。

USDのReferenceとPayloadの違い

USDでの参照はReferenceとPayloadがあります。
USDComposerで確認してみます。

Payloadの場合、Propertyウィンドウの右上にチェックボックスがついています。

これをOffにするとこのUSDはステージから削除され、使用されたリソースも解放されます。
なお、このチェックボックスのOn/OffはUSDファイル内のパラメータとしては保持されません。

Referenceの場合、Propertyウィンドウではチェックボックスはついていません。
単純な参照になります。

USD ComposerではStageウィンドウで対象のReferenceまたはPayloadを選択して右クリック、
"Convert Payloads to References"、"Convert References to Payloads"でReferenceとPayloadを相互変換できます。

ReferenceとPayloadについてはまだ便利な仕組みがあるのですが、
Omniverse Unity Connectorから離れてしまうため今回はここまでにしておきます。

"USDはUSD同士で参照によりネットワーク構造を持つことができる"という、USDの大きな特徴を把握しました。