MRが楽しい

MRやVRについて学習したことを書き残す

UnityにMMDモデルを取り込んでゲームキャラクタとして操作する

前回記事の続きです。
bluebirdofoz.hatenablog.com


次は、取り込んだMMDモデルをアクションさせてみます。
MMD用に配布されているモーションも取り込めるようですが、今回はおいかけっこアプリで利用しているモーションを流用します。
更に言えば、現在のおいかけっこアプリのユニティちゃんモデルをMMDモデルに差し替えることが可能か試してみます。

MMDモデルは前述の通り、扱いが難しいのでSVNのブランチを切って修正します。神経質かもしれませんが、それくらいコアな業界なのです。
・ブランチ/タグの作成
 https://tortoisesvn.net/docs/nightly/TortoiseSVN_ja/tsvn-dug-branchtag.html

では早速、モデルを取り出します。

生成されたモデルデータは変換したPMXファイルと同じディレクトリに保管されています。
同フォルダに「Materials」「Meshes」「Physics」の三つのフォルダが作成されていると思います。
ただ「Materials」「Meshes」「Physics」だけ運べば良いという訳ではなく、テクスチャ等はそのまま参照しているようです。
f:id:bluebirdofoz:20170611205706j:plain

更にMMDシェーダを利用しているのなら、mmd-for-unityフォルダのResourcesフォルダも必要です。
要は一通り必要になります。必要最低限だけコピーすることを考えていましたが、ここまで必要ならば、特に手を加えていない場合は利用するプロジェクトで再変換かける方が早そうです。
おいかけっこアプリにモデルを取り込むことができました。
f:id:bluebirdofoz:20170611205729j:plain


さて、次はこのMMDモデルとユニティちゃんモデルを差し替えます。

一番の問題点はキャラクタのモーションを共有できるかどうかです。
現在使用しているユニティちゃんのモーションは、Unitychanパッケージに付いていたものですが、UnityではMecanimという共通のアニメーションシステムが存在します。

ユニティちゃんのモーションはこの共通フォーマットに基づいて実装されているため、MMDモデルでMecanimの機能を有効にすれば、モーションが共通化できるのではないかという目論みです。
qiita.com

MikuMikuDanceforUnityでもこの機能がサポートされています。
モデルをインポートする際に「AnimationType」で「HumanMecanim」を選択してインポートすれば設定が行われます。
しかし、試してみた結果、MMDモデルは全く動きませんでした。

テストプロジェクトに戻って、よくよく見てみるとインポート実行時に「Transform "Model" must be the top mosst parent」というエラーが発生していました。
f:id:bluebirdofoz:20170611205838j:plain
どうやらモデルのアニメーションを行う「ヒューマノイドアバター」がきちんと出力されていない模様です。

うーむ。もはや更新停止して久しいためか。解決策を探そうにも、情報が全くありませんでした。
結果……原因特定と修正に6時間ほどかかりました。分かってしまえば少々の修正でしたが、Unity独自のルールが絡むため、苦労しました。
修正方法について備忘録として残しておきます。

原因は、Unity5のHumanMecanimには以下のルールができており、MikuMikuDanceforUnityはそれに基づいたコードに修正されていないことでした。
ヒューマノイドアバターは必ずオブジェクト内のトップオブジェクトに設定すること。
・ボーンの全親オブジェクトはこのトップオブジェクトの直下に配置すること(間に他オブジェクトを挟むとダメ)。

修正箇所は以下の二箇所です。(PMX+HumanMecanimインポートの場合)
・PMXConverter.cs 998行目(AttachParentsForBone関数)

//親のボーンが無いなら
//モデルルートの子に為る
//以下、エラーのためコメントアウト
//bones[i].transform.parent = model_root_transform;
// エラー対応
// ルートオブジェクトに全親ボーンを直接セットする
bones[i].transform.parent = root_game_object_.transform;

・AvatarSettingScript.cs 56行目(SettingHumanAvatar関数)

//アバタールートトランスフォームの取得
//以下、エラーのためコメントアウト
//Transform avatar_root_transform = root_game_object_.transform.FindChild("Model");
// エラー対応
// ヒューマノイドアバターはトップオブジェクトに設定する
Transform avatar_root_transform = root_game_object_.transform;

これでエラー無く、ヒューマノイドアバターを作成できます。
再チャレンジです。おいかけっこアプリのユニティちゃんモデルマネージャを差し替える形で入れ込みます。
f:id:bluebirdofoz:20170611205941j:plain
見事、MMDモデルが開始モーション通りに動きました。

ジャンプアクションや休憩アクションもキーボード操作に応じて難なくこなします。
f:id:bluebirdofoz:20170611210100j:plain

個人利用ではありますが、15分ほどのインポート作業で様々なキャラクタをゲームの操作キャラクタにできるようになりました。
うはは。こりゃ楽しい。