対象バージョン:Blender v2.82a、Unity v2019.4.1f1
BlenderでEXPORTしたFBXデータ
今回やりたい事は、Blenderで作成し、Unityでインポートして利用したいメッシュデータをFBXファイル(.fbx)でエクスポートする際の方法について記載します。
座標軸のおさらい
BlenderとUnityでは座標軸が異なります。
各軸の方向が異なるのは見ての通りです。
また、ここでは、前後左右を上記の様に定義します。(新しいシーンの作成時にデフォルトで配置されるカメラを向く方向を正面・前となる様にしまた。)
利用するデータ
今回は、前後左右を分かりやすくするために、以下の様なデータを作成しました。
※このデータにはArmatureは設定されていません。(Armatureが設定されているとまた、挙動が変わってきます…)
BlenderでEXPORT
とりあえず、デフォルトの設定でこのデータをEXPORTしてみます。
(カメラ・照明・エンプティ―オブジェクトは除いておきます)
Forward(前)は「-Z Forward」、Up(上)は「Y Up」なので、Unityの座標系と合っていそうです。
UnityにImport
Projectビュー(Assets)での表示
[Import New Assets]でインポートすると下記の様に表示されます。
何か、倒れていますね…
Hierarchyビューに追加した際のSceneビューでの表示
とりあえず、AssetsからHierarchyビューにDrag&Dropして、Sceneビューに表示させてみます。
むむむ、上下は正常になりましたが、前後が逆になってしまいましたね…。
InspectorビューのTransformのRotationを見ると、X軸周りに約-90度回転されていますね…。
また、Scaleも100倍になっています。(表示サイズは問題なさそうです)
また、ScriptからInstantiate()メソッドを使って実体を生成した場合は、以下の様になってしまいます。
今度は下面が前を向いてしまいました。Instantiate()で角度設定を(0,0,0)にしたためでしょうね…。
何か使いにくい…
デフォルト設定のままでは、なんだか使いにくいですね…
Scaleが1じゃない
例えば、Box Colliderなどを設定する場合に、Sizeを設定する場合、このScale値を考慮しないといけなくなります。
Rotationが(0, 0, 0)じゃない
先ほどの例にあるように、Instantiate()で実体化しようとする時に、傾きを考慮する必要が出てきてしまいます。
対策方法
Unity側での対策
BlenderでのEXPORTの設定は変更せずに、まずはUnity側で対応する方法を記載します。
(Armatureありのデータを読み込んだ際は、前後の向きを除いて自動で以下の様な状態になります)
GameObject(Empty)の作成
Hierarchyビューで[Create Empty]を実行し、GameObjectを作成し、名前を適切なものに変更します。
以下では、「directional_cube」に名前を変更しています。
Importしたデータを作成したGameObjectのChildに設定
ProjectビューからHierarchyビューにインポートしたデータをDrag&Dropし、GameObject(Empty)のChildに設定します。
また、前後の向きを合わせるために、Rotation(Y)に「180」を入力します。
作成したGameObjectをPrefab化
HierarchyビューからProjectビューへDrag&Dropし、Prefab化します。
Projectビューの中の表示が正常になりました。
Hierarchyビューのオブジェクトは一旦削除しておきます。
動作確認
Hierarchyビューに直接配置した場合も、Instantiate()メソッドで実体化した場合も正しく(思った方向に)向きが揃いました。
また、Rotationが(0, 0, 0)、Scaleが(1, 1, 1)となりました。
気になる点
ほぼ、思い通りの動作にはなりましたが、Box Colliderなどを設定する場合に、自動で大きさが設定されないので、手動で合わせる必要があります。
Blender側での対策
Unity側であまりごちゃごちゃと触りたくないという場合は、以下の方法を用います。
(各パラメータの組み合わせは多数ありますが、自分が最も良いと思ったものになります)
EXPORT時のパラメータ設定
EXPORTダイアログでのTransformパラメータを下記の様に設定します。
Apply Scalings
このパラメータを「FBX All」に変更します。これで、ScaleパラメータがFBX向けの物に変換され、UnityでIMPORTした時にScaleが(1,1,1)になります。
Forward
このパラメータを「Z Forward」にします。
自分では、納得いかないのですが、これを「Z Forward」にしても、前後逆になるのですが、Rotation(Y)に180が設定されるので、Instantiate()時は正常な向きになります。
!EXPERIMENTAL! Apply Transform
「Transformの変更を適用する」オプションにチェックを入れておきます。
前に「!EXPERIMENTAL!」(実験的)とあるように、正式にサポートされている機能ではなく、うまく行かないリスクは自分自身で負ってくださいとの事です。(私も責任は持てません…)
Unity側での表示
上記の設定でEXPORTしたデータを、Unity側でIMPORTすると下記の様になります。
上下方向は問題なさそうです。
Hierarchyビューに配置してみると、以下の様になります。
前後は逆になっていますが、Rotation(Y)が180度になっています。
Scaleは(1, 1, 1)ですね。
Rotation(Y)を「0」にすれば、思い通りの表示になります。
※「それなら、EXPORT時に「-Z Forward」にすれば…」と思いましたが、前後逆で、Rotation(Y)= 0になってしまい、うまく行きませんでした。
Prefab化
Rotation(Y)= 0にした状態で、HierarchyビューからProjectビューにDrag&DropしてPrefab化します。
Prefab化する場合、下記の様なダイアログが表示されます。
元のIMPORTしたデータとは独立したPrefabにしたい場合は、「Original Prefab」を、IMPORTしたデータから継承したPrefabにしたい場合は、「Prefab Variant」を選択してください。(違いについての説明は省略します)
今回は、「Original Prefab」を選択しました。
こうする事で、Rotationが(0, 0, 0)、Scaleが(1, 1, 1)にできました。
また、Hierarchyビューで作成したデータは不要なので削除しておきます。
(IMPORTしたデータは、必要となるので残しておきます)
動作確認
Prefab化したデータを使って、動作確認します。
これで、問題は無さそうです。
Armature付きデータの場合
以前作成した「Qちゃん」の場合を、少し見直してみます。
デフォルト設定でEXPORT
TransformパラメータはデフォルトのままでEXPORTします。
UnityでIMPORT
以前〔No.19(Unityで動かす①)〕でUnityにIMPORTした時と同様に、Armature付きのデータでは、上下はあっている様です。
データの確認
IMPORTしたデータを、HierarchyビューにDrag&Dropすると、以下の様になります。
GameObjectの子としてmetarig(Armature)とQ-chan(Mesh-Data)が配置されています。
Meshデータを見ると、RotationとScaleは以下の様になっています。
これは、前述の「対策方法-Unity側での対策」と同じ状態ですね。
さて、Qちゃんを前に向かせたいのですが、Meshデータ(Q-chan)側のRotationを変更しても、前を向いてくれません。
Armature付きのデータでは、MeshデータはArmatureに追従するように設定されているためです。
そのため、metarig(Armature)側のRottion(Y)を「180」にして、前を向かせてから、Prefab化します。
Armature付きのデータでは、この構造は変わらないので、前述の「Blender側での対策」をやってもあまり意味はありません。(Meshデータのパラメータが気持ち悪いという場合は、パラメータを変更しても問題はないとおもいますが…)