プログラミング/Unity/MMDモデルをキーボード操作 のバックアップソース(No.1)

MMDモデルをキーボード操作で走らせたりジャンプさせたりしてみます。

#contents

*はじめに [#abstraction]

この文書では下記の2通りの方法でMMDモデルを手軽に操作可能にしてみます。

+Unity5標準アセットの Third Person Character を利用する。
+ユニティちゃんアセットを利用する。

汎用性では前者が、個人的好みでは後者がオススメです。

MMDモデルのUnity取り込みにはMMD4Mecanimを利用します。今回操作可能にするMMDモデルはヒノイチ氏製作の川内改二モデル((なぜ川内かって?カワイイからだ!))です。

-[[UNITY-CHAN! OFFICIAL WEBSITE>http://unity-chan.com/]]
-[[MMD4Mecanim - Stereoarts Homepage>http://stereoarts.jp/]]
-[[【第13回MMD杯Ex】 川内型三姉妹+でshake it! 【モデル配布】>http://www.nicovideo.jp/watch/sm24380090]]
#nicovideo(sm24380090)

Unity 5.0.0f4 を使用しました…が、ユニティちゃんアセットを使う方法はUnity4でも可能です。

&ref(http://unity-chan.com/images/imageLicenseLogo.png,left,nolink,ユニティちゃんライセンス);~
このコンテンツは、『[[ユニティちゃんライセンス>http://unity-chan.com/contents/license_jp/]]』で提供されています。

*前準備 [#preparation]

どちらの方法を使う場合でも共通して行う前作業です。

**MMDモデル取り込み [#preparation-mmd4mecanim]

[[MMDモデルを物理ベースレンダリング>../MMDモデルを物理ベースレンダリング]]のページでも書いた内容ですが、あちらとは少しだけ違います。

+空のプロジェクトを作成する。
+MMD4Mecanimをインポートする。
--プロジェクトを開いている状態で MMD4Mecanim.unitypackage をダブルクリックし、出てきたダイアログでImportボタンを押すだけ。
+MMDモデルをフォルダ丸ごとProjectビューの Assets フォルダ以下の適当な場所にドロップする。
+放り込んだモデルフォルダの中に (モデルファイル名).MMD4Mecanim というファイルができているはずなのでそれを選択する。
+Inspectorビューに利用規約が出るのでよく読んで同意し、次に出てきた画面でProcessボタンを押す。
+色々走った後、モデルフォルダ内にPrefabができあがる。
+Prefabを選択し、InspectorビューのRigタブへ移動し、 Animation Type を「Humanoid」に変更してApplyボタンを押す。
--モデルの形状によってはこの後にボーンの登録をしなければならないのですが、今回の川内改二モデルは問題ないので割愛します。

Animation Type を「Humanoid」に変更することで、Unityのアニメーション制御システム ''Mecanim'' を利用可能になります。

**床の設置 [#preparation-floor]

モデルが落下しないように床を設置します。コリジョン(当たり判定)さえ持っていればPlaneでも何でもいいのですが、せっかくの艦娘モデルなので標準アセットから水面を持ってきてみましょう。

+メニューから Assets > Import Package > Environment を選択する。
+出てきたダイアログでNoneボタンを押して一旦全チェックを外し、 Standard Assets/Environment/Water/Water フォルダをチェックする。
+Importボタンを押す。
+Projectビューのフォルダツリーから Assets/Standard Assets/Environment/Water/Water/Prefabs フォルダを選択する。
+中に入っている WaterProDaytime というPrefabをHierarchyビューにドロップする。
+Hierarchyビューの WaterProDaytime を選択し、Inspectorビューにて下記の作業を行う。
--TransformのScaleを X=100, Y=1, Z=100 くらいの広さにしておく。
--Add Component ボタンを押し、「mesh」あたりまで入力すると Mesh Collider が出てくるのでそれを追加する。

ここまでで再生ボタンを押すと揺れる水面が再生されます。

&ref(揺れる水面_サムネイル.png,left,nolink,揺れる水面表示);~
&ref(揺れる水面.png,left,nolink,noimg,原寸表示);

今回は水飛沫の演出等は行わないので、割とシュールな絵面になりそうですが…。

**シーン保存とプロジェクト複製 [#preparation-copy-project]

ここまで行ったら@kbd{Ctrl+S};を押して、適当な名前を付けてシーンをファイルに保存しておきましょう。

この先は2通りの方法を試すので、一旦Unityを閉じてプロジェクトフォルダーを丸ごとコピーしておけば、上述の状態まで持ってくる手間を省けるでしょう。

*Unity5標準アセット Third Person Character を利用する [#tpc]

**ThirdPersonController の配置 [#tpc-controller]

+メニューから Assets > Import Package > Characters を選択する。
+出てきたダイアログでNoneボタンを押して一旦全チェックを外し、下記の2フォルダをチェックする。
--Standard Assets/Characters/ThirdPersonCharacter
--Standard Assets/CrossPlatformInput
+Importボタンを押す。
+Projectビューのフォルダツリーから Assets/Standard Assets/Characters/ThirdPersonCharacter/Prefabs フォルダを選択する。
+中に入っている ThirdPersonController というPrefabをHierarchyビューにドロップする。
+Hierarchyビューの ThirdPersonController を選択し、InspectorビューにてTransformのPositionを X=0, Y=0, Z=0 に変更しておく。

ここまで行うとGameビューに謎の男Ethanが現れ、再生ボタンを押すと下記のキーで操作できるようになっています。

|~入力|~動き|h
|LEFT:|LEFT:|c
|@kbd{↑};, @kbd{→};, @kbd{↓};, @kbd{←};|移動する。|
|@kbd{Space};|ジャンプする。|
|@kbd{C};|押している間、しゃがみ状態になる。|
|@kbd{Shift};|押している間、移動速度が半減する。|

更にゲームパッドにも対応しており、ゲームパッドが接続されていればそちらで操作することもできます。

&ref(ThirdPersonCharacter_Ethan_サムネイル.png,left,nolink,ThirdPersonCharacter でのEthan操作中表示);~
&ref(ThirdPersonCharacter_Ethan.png,left,nolink,noimg,原寸表示);

**EthanをMMDモデルに置き換え [#tpc-replace-model]

+Hierarchyビューの ThirdPersonController を展開する。
#ref(Hierarchyビュー_Ethan.png,left,nolink,Hierarchyビューを展開表示したところ)
+EthanBody, EthanGlasses, EthanSkeleton を選択し、@kbd{Delete};キーを押して削除する。
--確認ダイアログが表示されますが構わずContinueボタンを押してください。
+[[前準備>#preparation]]で作成したMMDモデルのPrefabを、ProjectビューからHierarchyビューの ThirdPersonController の下にドロップする。
#ref(Hierarchyビュー_川内.png,left,nolink,HierarchyビューにMMDモデルをドロップしたところ)
+Hierarchyビューの ThirdPersonController を選択し、Inspectorビューにて下記の作業を行う。
--AnimatorのAvatarをMMDモデルのAvatarに変更する。
---右端の小さい丸を押すとAvatarの一覧が出てくるので、そこからMMDモデルのAvatarを選択すればOK。
--Capsule Collider のサイズをモデルに合わせて調整する。
---今回の川内改二モデルなら、CenterのYを 0.82 、Radiusを 0.25 、Heightを 1.64 くらいにすると大体ちょうどよいでしょう。
--Third Person Character (Script) のパラメータを調整する。
---パラメータの意味は大体名前の通りです。
+HierarchyビューのMMDモデルを選択し、Inspectorビューにて MMD4 Mecanim Model (Script) の Physics Engine を「Bullet Physics」に変更する。
--スカートやマフラーを物理計算させるために必要です。

ここまで行って再生ボタンを押せば、MMDモデルを操作できます。

&ref(ThirdPersonCharacter_川内_サムネイル.png,left,nolink,ThirdPersonCharacter でのMMDモデル操作中表示);~
&ref(ThirdPersonCharacter_川内.png,left,nolink,noimg,原寸表示);

腕がスカートを突き抜けているように見えるのは全力で見逃してください。

*ユニティちゃんアセットを利用する [#unitychan]

**アセットをインポート [#unitychan-import]

+公式サイトの [[DATA DOWNLOAD>http://unity-chan.com/contents/guideline/]] のページから『ユニティちゃん 3Dモデルデータ』をダウンロードする。
+ダウンロードしたパッケージをインポートする。
--プロジェクトを開いている状態でダウンロードしたファイルをダブルクリックし、出てきたダイアログでImportボタンを押すだけ。
--ユニティちゃんは Version 1.2 の時点ではUnity5に対応していないので警告が出ますが気にしないでください。

今回は必要そうな分のみインポートしましたが、ユニティちゃんアセットは余すところなく役に立つので、全部インポートして眺めてみるのもよいでしょう。

**MMDモデルにユニティちゃんのスクリプトを適用 [#unitychan-script]

試しにProjectビューのフォルダツリーから Assets/UnityChan/Prefabs/for Locomotion フォルダを開き、中に入っている unitychan_dynamic_locomotion というPrefabをHeirarchyビューにドロップして再生してみましょう。

|~入力|~動き|h
|LEFT:|LEFT:|c
|@kbd{↑};|前進する。|
|@kbd{←};|後退する。|
|@kbd{→};, @kbd{↓};|停止時は方向転換。前進や後退と組み合わせることで斜め移動。|
|@kbd{Space};|停止時は待機モーションをとる。前進時はジャンプする。|

ユニティちゃんを操作できましたね。もちろんゲームパッドでも操作できます。なお、ジャンプさせるとエラーが出ますが、これは専用のカメラを配置していないためです。

要は、これをMMDモデルに適用すればよいわけです。今回は目パチや表情変化まではやりませんが…。

+[[前準備>#preparation]]で作成したMMDモデルのPrefabを、ProjectビューからHierarchyビューにドロップする。
+HierarchyビューのMMDモデルを選択し、Inspectorビューにて下記の作業を行う。
++AnimatorのControllerに、Projectビューのフォルダツリーから Assets/UnityChan/Animators フォルダ内の UnityChanLocomotions をドロップする。
++MMD4 Mecanim Model (Script) の Physics Engine を「Bullet Physics」に変更する。
---スカートやマフラーを物理計算させるために必要です。
++Add Component ボタンを押し、「unity」あたりまで入力すると Unity Chan Control Script With Rgid Body が出てくるのでそれを追加する。
++追加した Unity Chan Control Script With Rgid Body (Script) のパラメータを調整する。
---パラメータの意味は大体名前の通りです。
---Forward Speed は 5 くらいに抑えた方が物理計算による破綻が起きにくいです。
++上述のコンポーネント追加によってMMDモデルに自動追加された Capsule Collider を、モデルがちょうど覆われるような配置に調整する。
---今回の川内改二モデルなら、CenterのYを 0.82 、Radiusを 0.25 、Heightを 1.64 くらいにすると大体ちょうどよいでしょう。
++同じくMMDモデルに自動追加された Rigidbody に対して下記の作業を行う。
---キャラが斜めに傾かないよう、Constraintsの Freeze Rotation の X, Y, Z すべてにチェックを付ける。
---必要に応じてMass等の値を変更する。

ここまで行って再生ボタンを押せば、MMDモデルを操作できます。

&ref(ユニティちゃんアセット_川内_サムネイル.png,left,nolink,ユニティちゃんアセットでのMMDモデル操作中表示);~
&ref(ユニティちゃんアセット_川内.png,left,nolink,noimg,原寸表示);

こちらの方が待機モーション等が自然な感じがしますね。

ちなみに、操作説明を画面に表示したくない場合は UnityChanControlScriptWithRgidBody.cs の OnGUI メソッドを丸ごと削除しましょう。

**三人称視点カメラを使う [#unitychan-camera]

せっかくなのでユニティちゃんアセットに用意されている三人称視点カメラを使ってみましょう。

+Hierarchyビューに元からある Main Camera を選択し、Deleteキーを押して削除する。
+Projectビューのフォルダツリーから Assets/UnityChan/Prefabs/for Locomotion フォルダを選択する。
+中に入っている Main Camera というPrefabをHierarchyビューにドロップする。
+同じく中に入っている CamPos, FrontPos, JumpPos, LookAtPos という4つのPrefabをHierarchyビューのMMDモデルの下にドロップする。

ここまでやるとHierarchyビューは次のように変更されているはずです。

&ref(Hierarchyビュー_カメラ変更前.png,left,nolink,カメラ変更前のHierarchyビュー); → &ref(Hierarchyビュー_カメラ変更後.png,left,nolink,カメラ変更後のHierarchyビュー);

再生ボタンを押して再生してみると、カメラがMMDモデルに追従します。また、下記の操作が行えます。

|~入力|~動き|h
|LEFT:|LEFT:|c
|@kbd{左Ctrl};, マウス左クリック|押している間、モデルの正面を映すカメラになる。|
|@kbd{左Alt};, マウス右クリック|押している間、モデルを見上げるようなカメラになる。|

ついでに、ジャンプさせてもエラーが出なくなります。

&ref(ユニティちゃんアセット_川内_カメラ_サムネイル.png,left,nolink,ユニティちゃんアセットでのカメラ操作中表示);~
&ref(ユニティちゃんアセット_川内_カメラ.png,left,nolink,noimg,原寸表示);

月は出ているか!

*終わりに [#conclusion]

色々説明不足な部分はありますが、MMDモデルを操作する処理がスクリプトを1文字も書かずに作れました。

今回はユニティちゃんアセット側しか紹介しませんでしたが、標準アセットにも三人称視点カメラ(および一人称視点カメラ)はあります。Unity5はまず標準アセットを一通り触ってみるところから始めてみるとよいかもしれません。

ユニティちゃんは今回書いただけに留まらず様々なUnityの技術が詰まっており、またいくつかはアセット内のPDFドキュメントで詳しく説明されています。こちらも一通り眺めておきたいところですね。

*参考サイト [#link]

:[[UNITY-CHAN! OFFICIAL WEBSITE>http://unity-chan.com/]]|ユニティちゃんの公式サイトです。
:[[Stereoarts Homepage>http://stereoarts.jp/]]|MMD4Mecanimの配布元です。
:[[Unity内でMMDモデルを自由に走らせる手軽な方法 - テラシュールブログ>http://tsubakit1.hateblo.jp/entry/2014/09/27/235941]]|Third Person Character を利用する方法の参考にしました。