見出し画像

メタバース開発TIPS:Unityから Blenderファイルを直接扱う

こんにちは。REALITY株式会社GREE VR Studio Laboratory(ラボ)インターンの山岡です。「メタバース開発TIPS」として、VRStudioLabのR&Dで使っている技術を紹介していきたいと思います。今回の記事は、 Blender-Unity間のパイプライン効率化のために blend ファイルを直接 Unity で読み込む方法に関する実験と、発見した有用なテクニックについて紹介します。

そもそも

Unity をプロフェッショナルなゲーム開発業務から使い始めた方は Maya でのモデルデータを製作している方々が多いと思います。一方で最近は、オープンソースで無料で使える、歴史ある DCC ツール「Blender」で勉強している学生さんなども多いかと思います。実際のところ、 Blender はここ数年で、エヴァンゲリオンのような商用映画や VRChat や VRM などのアバターでも使われるようになってきています。Blender Foundationが製作した最新作のショートフィルム「Sprite Fright」は非常に高いクオリティで、しかもオープンに素材や学習に使える状態になっています。SIGGRAPH Computer Animation Festivalをはじめとする映画祭でも高い評価を得ています。

本記事で紹介した知見を使った140秒のTIPS動画が公開されているので、まずはこちらの動画をご覧ください。

大阪・関西万博公式キャラクター「ミャクミャク」の二次創作ライセンスについてはこちら

REALITY株式会社内で研究開発を担当しているラボでも WebXR「Mozilla Hubs」 などの環境において Blender を使ったモデルデータの開発が必要になるケースも増えてきました。ラボ内ではWebXRだけでなくUnity環境で使用するためのナレッジ構築や実用的なパイプライン構築、ツール開発などを行っています。一般的なUnityプロジェクトは FBX ファイル形式を経由して Unity へのモデルデータのエクスポート&インポートを実施しますが、今回はより研究開発向きのパイプラインを効率化するために Unity における FBX と blend ファイルの差異を調べてみることにしました。 最新の Blender と 現在の Unity 環境において Blender 上の変更がどの程度 Unity に反映されるか?デメリットはないか?などいくつかの試行と実験を行い、その有用性について調査した結果と発見を共有します。

仮説

まず初めに、Unity の公式のドキュメントには blend ファイルの読み込みに関する項目が存在しました。

Unity は Blender (.blend) ファイルを FBX 形式でインポートし、以下をサポートします。位置、回転、スケールのあるすべてのノード。ピボットポイントと名前もインポートします。頂点、ポリゴン、接線、UV、法線を持つメッシュボーンスキンメッシュアニメーションBlender ファイルの Unity へのインポートを最適化する方法は、FBX ファイルを他のアプリケーションで使う を参照してください。

Unity公式ドキュメントより

Blnder がインストールされた PC で blend ファイルを Unity で読み込むと 、FBX 形式としてインポートされるようです。意外と多くの設定が引き継がれるようですが、 Unity 公式によると「ネイティブのファイル形式を直接本番環境で使用することは推奨されません」とあります。ラボは最終製品を作るだけではなく「できるだけ高速にPoCを開発する」というミッションがあるため、(上記の非推奨は十分承知の上)ラピッドプロトタイピングとして実用的かどうか?(FBX経由ではなく) blend ファイル直接読み込みが有効に使えるワークフローがないか?という視点で検証を始めることにしました。
結論として、Unityでのblendファイルの直接読み込みは、Blender でモデルを変更するたびに FBX エクスポートをする手間と時間が省けるだけでなく(適切な連携が取れた上でならば)エクスポートオプションの Unity 上での一括管理やテクスチャの動的反映などが簡素化されるため、一部作業においては FBX インポートと比べ工数削減につながるという結果を得ることができました。詳しい実験結果は次の章で述べていきます。

実験

Unityでの blend ファイルインポートの有用性を確かめるため主に以下の3つを確かめる実験を行いました。

  1. FBXと blend ファイルをインポートしたときにそれぞれ生成されるオブジェクトは同一か

  2.  blend ファイルを変更した際の Unity Editor 上との差異

  3.  Blender 側のテクスチャの変更を動的にUnity Editorに反映させる

いずれの実験も以下の環境で行いました。

  • OS:Windows10

  • Unity:2020.3.26f1 Built-in Render Pipline(以下BRP)

  • Blender:3.3.1

FBXと blend ファイルの比較

blend ファイルは FBX としてインポートされますが、 FBX 形式でインポートしたときと同一のものが生成されるか確かめるためにファイルサイズの比較と Unity 上での Statistiscs(以下Stats)の比較を行いました。
結果として、ファイルサイズは異なりましたが、 Unity 上での Stats のパフォーマンスは完全に同一でした。
エクスポートした FBX ファイルと blend ファイルはそれぞれ次のようなサイズになりました。

  • blend ファイル:1,471,360 Byte

  • FBXファイル:2,389,452 Byte

FBX ファイルは blend ファイルの約1.6倍の大きさがあります。ちなみに blend ファイルは圧縮されてるのかと思い、FBX ファイルを単に zip 化してみたもののファイルサイズは2,081,927 Byteとなり、 blend ファイル程は小さくはなりませんでした。個人的には圧縮形式が違うのか、 FBX に付加されたメタデータのせいではないかと考えています。ファイルサイズの違いの理由についてはさらなる究明が必要ですが、ここでは完全な究明はしません。
次に FBX と blend ファイルを両方読み込んでそれぞれ Unity 上でリアルタイム描画での Stats の計測をしてみました。

FBXのStats
blendファイルのStats

パフォーマンス指標となる Batches、set pass calls と、モデルのポリゴン数と頂点数である Tris、Verts は全く同じ値でした。ここから blend ファイルを読み込む際に変な変換や圧縮はされずに本当に FBX として扱われていることが分かりました。

blend ファイルを変更した際のUnityEditor上の差異

blend  ファイルが FBX として問題無くインポートされることはわかりました。次に Unity Editor で読み込んだ blend ファイルが Blender 上と Unity Editor 上で何か違いあるのか?同一性を調べる実験と調査を繰り返しました。
試行から分かったことは、少なくとも以下の要素は blend ファイルを Unity に持ってきたときに変化があると分かりました。

  • Animation

  • ライティング

  • カメラ

  • Blender で非表示のオブジェクト

まずは Animation です。Blender でキーフレームを打ち、アニメーションを制作したところ、Unity でも animation clip が生成されました。しかしそのまま Unity プロジェクトを実行してもオブジェクトのアニメーションは再生しませんでした。Animator をオブジェクトにアタッチして animation clip を割り当てて Animation ウインドウで確認したところ、オブジェクト自体が Missing になっていました。ただしインスペクタの preview ではアニメーションが再生されています。

オブジェクトがMissingになる Animation ウインドウ

Unity ドキュメントによると一度 FBXとしてエクスポートしてからでないとアニメーションを使えないように見えます。
もし、blend ファイルから直接アニメーションを使用する方法を知っている方がいればご教授願いたいです。

次にライティングについてです。
Blender 側でライトの Intensity の値を変えずに Unity に blend ファイルを持ってくるとシーンが真っ白になります。なぜこんなことになったのかというとBlenderとUnity上でのライトの Intensity の単位が違うからです。 Blender でのライトのIntensity の単位は W (ワット)ですが、Unity BRP での Intensity の単位は公式には明記されていませんでした(HDRPは物理単位PLUですが、BRPについては輝度0~1という度数であり、明らかにワットではない)。つまり互換性がある概念がない。したがってもし、 「Blender 上でのライティングをそのまま Unity に持ち込みたい」というパイプラインを構築するなら、static なライティングであれば Blender 側でライトベイクをした方が制御ができてよさそうです。

次にカメラについてです。
カメラについてはカメラの座標は保存されますが、 Blender 側でのカメラの投影方式(Orthographic/Perspective : 平行投影や透視投影)に関わらず Unity 側では強制的に透視投影になります。投影方式は Unity のインスペクタから簡単に変えられるのであまり心配はいらないでしょう。

Blender上でのカメラ(Orthographic)
Unity上でのカメラ(Perspective)

次は表示/非表示に関してです。
Blender 上で「非表示」(Hide)にしていたオブジェクトは Unity にインポートした時に全て「表示」(Active)にされてしまいます。基本的なプロセスとして、不要なオブジェクトは Blender で消しておけばいいのですが、厄介なケースとして、ブーリアンモディファイアのために使っていた演算用のオブジェクトも表示されてしまうので注意しましょう。ただ、そういったオブジェクトもパイプライン構築上、わかっているならUnity のヒエラルキーから手動で非表示にするか削除すれば解決です。その際 Unpack prefab(completely) をしないとオブジェクトの子要素の消去や変更はできない点も注意です。

Blender 側のテクスチャの変更を動的にUnity Editor に反映させるテクニックを発見

Unity の公式ドキュメントにも記載があるように Blender で変更したテクスチャは、インポートして生成された blend ファイルには自動で再適用されません。手動でテクスチャを設定する必要があり、 blend ファイルが更新されるたび毎回設定し直す必要があり大変です。
UnityにFBXデータをインポートすると時々マテリアルが剥がれて真っ白なモデルになってしまうことがありますが、その場合はMaterials>Location>Use Embeded Materials>Extract Textureを選択するとたいてMaterialが適用されるのですが、Unity上でExtract Texture を押してもテクスチャが反映されないこともありました。しかし再現性のある方法を試行を繰り返して発見しました。

まず初手で、「先にUnity 側にテクスチャをインポートして Blender からも同じパスを指定してあげる」これだけで動的に Blender でのテクスチャ変更を Unity に反映させることができました。

具体的な手順を紹介します。

  1. 変更を同期させたい blend ファイルを Unity エディタ上の Assets 階層以下にドラッグ&ドロップ

  2. Unity Editor 上またはエクスプローラー上で先ほどの blend ファイルと同階層に Textures フォルダを作って適応予定のテクスチャを入れる

  3. (Blender上の操作) Material property > Base color > Image Texture > 先ほど入れたテクスチャを選択 ※Materialファイル自体を変更しないよう注意

  4. Bledner上でテクスチャが割り当てられたら保存

  5. Unity上でRefresh

※この時 unpack prefab したオブジェクトでも動的にテクスチャが変更されます。つまり Unity 上で unpack prefab して邪魔なライトなどを消してても再度 prefab 化せずそのまま使えます。
こうすることで安定的に Blender のテクスチャの変更を Unity に反映することができます。やったね!

結論

長々と Tips を書き連ねてしまいましたが、調べたかったのは本文冒頭の「FBXによるパイプラインと  blend ファイルの直接取り込みの差異を調べ、 Blender の変更がどの程度 Unity に反映されるか実験を行い、 Unity-Blender 間のパイプライン効率化がラピッドプロトタイピングのためにどの程度有用か検討する」でした。
筆者の結論としては「(部分的に)有用」といえるのではないでしょうか。
以下に実験で分かった、blend ファイルを直接 Unity にインポートするメリット/デメリット(Pros/Cons)を箇条書きでまとめてみます。

  • Pros

    • モデル更新の度にFBXエクスポート不要

    • FBXとほぼ同等の扱いができる

    • Blenderの構図やライティングをUnityで1から再現する必要がない

    • Unity担当者がBlenderを覚えることでできることが増える

    • ファイル差し替えの必要がないのでミスが減り、変更が即座に反映される

  • Cons

    • Blenderがインストールされている必要がある

    • Blender側のライトやカメラも反映されてしまうので、Unity Scene上のそれらとConflictされてしまう可能性がある

    • Blender側の変更を反映したくなくても、誰かがblendファイルを編集するとUnityにも反映されてしまう

    • アニメーションのようにサポートされているようで基本的な機能でうまく動いていない機能がある

多くの問題は、プロジェクト内でのUnity側スクリプトで自動化できそうな要素ではあります。今後のUnity側公式のアップデートにも期待したいところです。
また、今回の調査では Git 管理を行わず、筆者のローカル環境のみでの実験だったため、チーム内でと GitHub や ShotGrid などのアセット管理環境で共同開発するときは少し違う制作フローになるかと思います。

まとめると以下のようになります

  • Blender上で演算を使った場合、オブジェクトを非表示(Hide)にしてもUnityでは表示(Active)されてしまうことを意識する

  • ライトベイク以外のライティングを使わない

  • テクスチャ管理をUnity側Assetに置く

  • Animationは不完全

【結論】
研究開発やラピッドプロトタイピングには.blend直接取り込みは十分使える
ということでFBXパイプラインの常識を変えていきたいと思いました。

さいごに

今回の記事は、 Blender-Unity 間のパイプライン効率化のために blenderファイルを直接Unityで読み込む方法に関する実験と有用性についてお伝えしました。

改めまして入社約4カ月の山岡です。ご挨拶が遅くなりました。ラボメンの中野さん堀部さんと大学は同じですが、音声系の研究室ではなくVR系の研究室に所属しています。普段はVRChatに生息していて、VRChatで遊ぶためにUnityとBlenderを触り始めました。メインウェポンとしてUnityを2年強使っていますが、Blenderは1年も使っておらず、まだまだ初心者なので修行中です。
個人で技術系の記事をQiitaに投稿したことはあるものの、会社名義で技術系の記事を書くのは初めてだったのでドキドキしています。
この記事含め GREE VR Studio Laboratoryとして出している記事群を読んでいただけると幸いですが、ラボでは様々な開発環境を用いて近未来のメタバースを開拓する仕事をしているので、新技術に対する総合力が鍛えられると思います。ブログを書く勉強にもなりました。
Blender 使いにとっても Unity 使いにとっても少しでも役に立つ記事になったようであれば幸いです。
お読みいただきありがとうございました!

REALITY株式会社 GREE VR Studio Laboratoryではメタバース時代のREALITYを開拓すべく日々、新技術の研究開発を推進しています。ご興味がある方は [ラボのWeb](https://vr.gree.net/lab/) やYouTube(https://j.mp/VRSYT)を観ていただけると嬉しいです。
また、インターンに興味を持ってくれた学生さんはぜひ[インターン希望の方へ]やTwitter@VRStudioLabをフォローしてみてください!

この記事が参加している募集