ゴマちゃんフロンティア

アザラシが大好きなエンジニアの開発日記です

【Unity】インポート済み.blendファイルのboneをいじって大変なことになったお話

time 2017/05/20

Blender2.80でUIが大幅に変更されました。
本記事は2.79以前のバージョンを想定して書いているため、設定方法が異なっている可能性があります。
あらかじめご了承ください。

というわけで、今回はUnityにモデルデータをインポートした際のお話です。大袈裟ながらもタイトル通りで、インポートした.blendファイルをいじったら面倒なことになってしまいました。

ゲームとして出す場合は.fbx形式でインポートするかと思いますが、開発中は納得のいくキャラクターが完成するまで修正したいですよね。その場合は.blendファイルをインポートすれば修正点がそのままUnityに反映されるので楽々です。
と思いきや、そのモデルを使用しているプレハブに正常に反映されなかったので、今回はそのお話になります。

あれこれ前置きがあるので、直し方だけ知りたい方はさらっと流してください。
せっかちな方のために結論を書いておくと、

・プレハブを作り直す
.prefabファイルを直接編集して直す

のどちらかになります。プレハブを作り直すのはどうにでもなるので、本記事で紹介しているのは後者のやり方です。

きっかけ

今回の犠牲者は下のキャラクター「シルリス」です。

開発当初からいるオリジナルキャラにして、画面上部ヘッダにもいる本ブログの顔ですが、何度も作り直しており、印象もかなり変わりました。リニューアル前から「ゴマちゃんフロンティア」を閲覧いただいている方は何となく分かるかもしれません。
こいつのインポート済み.blendファイルに新しいboneを追加しました。所謂「武器切り替え」的なシステムが欲しいと思い、その武器を持たせるためのものです。

この場合、Unityをアクティブにした時点で.blendファイルは再インポートされるので問題ありませんが、プレハブの方は正常に反映されません。

自分の場合、上のようにメッシュが表示されなくなってしまいます。プレビューウィンドウでもシーンビューでも表示されません。「エディタ上でレイヤーの表示設定が違っていた」なんて易しいものでもなさそうです。

元となった.blendファイルから、モデルをシーンビューに配置した場合は上手く表示されます。

原因(と思われること)

今回のモデルデータ「シルリス」のArmatureには、boneが追加した分を含めて22個あります。が、.prefabSkinnedMeshRendererを見ると、「m_Bones」のところに21個しかありません。
なので、追加した部分から後ろのboneがずれてしまっており、正常に表示できなくなったと考えられます。実際、モデルデータに追加したboneを削除すると、再インポート後に正しく表示されるようになりました。

対処法

一番確実なのは「モデルデータを配置し、プレハブを作り直すこと」です。とはいえ、「プレハブにあれこれ設定してあるのに消したくない!」な場合、Unityエディタ上からはどうしようもないので、.prefabファイルを直接いじるしかありません。

予め「ProjectSettings」→「Editor」→「AssetSerialization」を「ForceText」にしておきます。今までText以外を選択していた場合は設定後にUnityを再起動してみてください。

ファイルの修正を誤ると大変なことになります。一切の責任は負いかねますので、自己責任でお願いします。
また、実行前にバックアップを取得することを強く推奨します。

Blenderの「Outliner」を表示する

編集したモデルデータの.blendファイルを開き、適当なウィンドウのエディタタイプを「Outliner」にします。

今回追加したboneは「hand_003_L_001」という名前です。これをメモしておきます。別に開かなくてもエディットモードで確認できますが、Outlinerは後でまた見るので、そのまま表示しておきましょう。

プレハブにbone用GameObjectを追加する

Armature下にboneに対応する空のGameObjectを追加します。

オブジェクト名は先程のbone名に則った名前の方が分かりやすいと思うので、合わせて変えておきます。Blenderの.はUnity上では_に変換されるため注意します。
また、GameObjectの位置もBlender上のbone位置に合わせてずらす必要があります。ただこれは後々でも調整できるので、直った後にモーションを見ながら微調整した方がスムーズにいきます。

prefabファイルをテキスト形式で開く

エクスプローラから.prefabファイルをテキスト形式で開きます。

「ForceText」に設定されていれば、プレハブの情報がYAML形式で記述されているはずです。
エディタは何でも構いませんが、ある程度検索機能に優れたもので開くと楽です。自分はEclipseをGitクライアントとして使用しているので、Eclipse上で開いて編集しました。

「m_Bones」に追加する位置を割り出す

SkinnedMeshRendererの「m_Bones」に追加するわけですが、どの位置に追加するかが重要になります。追加する位置を誤ると見た目が崩壊するので注意してください。

m_Bonesの並び順ですが、どうやらBlenderのOutliner上から見た、Armature直下の並び順と対応しているようです。先程のOutlinerを確認し、追加したboneが上から何番目にあるか探してみます。boneに子がいる場合、すべて展開した状態で数えてください。

自分の場合、rootを1番目とした9番目にあります。ということは、8番目の後ろに追加すればよさそうです。

bone用TransformのFileIDを追加する

「hand_003_L_001」のTransformのFileIDを追加します。.prefabファイルの上の方にGameObjectの情報が書かれている部分があります。そこから「hand_003_L_001」を探します。

「m_Component」に1つだけコンポーネントがあると思います。bone用GameObjectにはTransformしかコンポーネントがないため、深く考えなくても大丈夫です。このFileIDをメモしておきます。

「m_Bones」の8行目の下にFilesを追加し、先程のFileIDを貼り付けます。この行を他のSkinnedMeshRenderer全てに追加してください。メッシュごとに頂点グループを変えたりしていない場合、「m_Bones」の値・並び順はすべて共通のはずです。
ここで「正規表現+改行コードでまとめて置換DA!」という方。良い方法だと思いますが、検索した際に他のFilesの行とマッチする可能性があるので、一括変換はおすすめしません。面倒ですが、1つ1つ確認して置換したほうが無難です。

プレハブをReimportする

壊れたプレハブを右クリック→「Reimport」してみます。

上手くいけば元通りになります。
「一見上手くいってそうだけどメッシュが変!」という場合、m_Bonesの追加位置が誤っている可能性があります。Outlinerを確認しつつ、前後のboneのFileIDでファイル内検索をしたりしてみてください。

ちなみに失敗するとこんな感じ!

低クオリティな動物キャラだからまだよいものの、ユニティちゃんあたりでやらかすとえげつない見た目になりそうなので、修正の際はご注意ください。

あとがき

そんなわけで、インポート済み.blendファイルのboneをいじった場合に関するお話でした。bone1つ付けるだけで面倒なことになってしまいましたが、プレハブのYAMLを読んでいい勉強になりました。
先程の.prefabファイルの編集を応用すると、後付けのメッシュのSkinnedMeshRendererも綺麗に設定できます。まあ正直にプレハブを作り直した方が早かったりしますが、「どうしても既存のプレハブを使いたい!」な場合はお試しください。

コメント

  • ついに武器切り替え機能が来るんですね。
    よくここのサイトをパk・・・参考にさせていただいております!
    今回のボーンの格納場所を探す方法参考になります。
    私は逆にキャラと武器をいっしょにBlenderで編集してしまっているので泣きそうになっていたので大変勉強になります!

    Jbuta  2017年5月21日 7:11 PM

    • Jbutaさん

      閲覧いただきありがとうございます!
      自分もキャラクターと武器は一緒のファイルに詰め込んでしまっていたりします。別々にインポートした場合、Unity側で対応付けるのは難しそうだったので・・・。
      モデル更新に合わせてプレハブの情報も更新されればよいのですが、5.6現在では我慢するしかなさそうです。

      riberunn  2017年5月22日 10:14 PM

down

コメントする