きっポグ

- kitposition's weblog -

【Unity】Unity-Chanは二度笑う~ユニティちゃん表情モーション研究~その3

f:id:kitposition:20160303012046p:plain

 前回は、ユニティちゃんのブレンドシェイプのウェイトを直接増減させることで、標準搭載の表情モーション以外のオリジナルの表情を作る方法をご紹介しました。
 しかし、ゲーム等で用いるためには、前々回(その1)で試した標準の表情モーション同様、Animation Clip(.anim)ファイルとして保存する必要があります。早速チャレンジしてみましょう!

下準備

 まずは、新規プロジェクトを作ってユニティちゃんパッケージをインポートし、その中のユニティちゃんのModelをシーンに投入します*1。今回のテーマは表情モーションですが、Tポーズのままでは気の毒なので、まず標準で付属する「Wait00」(要は立ってるだけ)のモーションを身体につけてあげましょう。なお、この後の作業は、エディタでAnimatorウィンドウAnimatonウィンドウ*2を表示させておくと把握しやすいです。現時点ではユニティちゃんモデルにモーションが設定されていないので、これらのウィンドウは空っぽです。

 さて、本来、このモデルにモーションをつけるには、

  1. ProjectビューでAnimation Controller(Animator)を新規作成
  2. 1のAnimatorをインスペクタでユニティちゃんにアタッチ
  3. AnimatorをAnimatorウィンドウで開き、空のデフォルトステートを新規作成
  4. 作成したデフォルトステートに、Projectビューにある「Wait00」のAnimation Clipをインスペクタから登録

 という作業が必要です。

 これを1つずつ順に手作業でやってももちろん良いのですが、もっと手っ取り早い方法がいくつも用意されていて、例えば以下のような手もあります。

  • 「Wait00」のAnimation Clipを、Hierarchyビューのユニティちゃんに重なるようにドラッグ&ドロップ

f:id:kitposition:20160303000228p:plain

 実はこれだけで、上記1~4が自動的に完了し、Hierarchyビューには作った覚えのないAnimator「unitychan(自由にリネーム可)」が出現して(下図A)勝手にモデルにアタッチされ(B)、その中にデフォルトステートとしてWait00が勝手に登録されています(C)。不気味なほど便利ですね。

f:id:kitposition:20160303001358p:plain

 この状態で再生すると、上のようにおなじみの立ちポーズになりました!

 いよいよ表情の設定!

 その1で紹介した通り、表情モーションを活用するにはAnimatorに身体モーションとは別のレイヤーを用意した方が便利です。Animatorウィンドウ左のパネルがLayersモードになっていることを確認し、上方の「+」ボタンをクリックすると新規のレイヤーが作られるので、「Face」とでも命名します。

f:id:kitposition:20160303002052p:plain

 次に、Faceレイヤーに「アバターマスク」を設定して、このレイヤーにこれから登録するモーションが顔にしか反映しないようにします。再び左のパネルで、Faceレイヤーの右上にある歯車マークをクリックしてプロパティを表示させ、「Mask」欄にユニティちゃんモデルに付属する「face only mask」を登録すればOKです。

f:id:kitposition:20160303002304p:plain

 ただしこの時点だと上図のようにレイヤーのWeight(反映度)が「0」になっていて、後々モーションを追加してもさっぱり動きませんので、必ず「1」にしておきます。 

 続いて、Projectビューで「Create→Animation」で空のAnimaton Clipを新規作成し、「myExpression」とでも命名します。このmyExpressionを、先ほどのAnimatorウィンドウのFaceレイヤーにドラッグ&ドロップすると、このレイヤーのデフォルトステートとして設定されます*3

f:id:kitposition:20160303003023p:plain

 ではいよいよ表情の調整です。ユニティちゃんを選択した状態で、今までの「Animatorウィンドウ」から「Animationウィンドウ」に目を移す(まぎらわしー)と、おそらくは先に設定した「Wait00」のタイムラインが表示されているはずです。
 今回はこれには用はないので、ウィンドウ左上のリストから「myExpression」に切り替えます。

f:id:kitposition:20160303003459p:plain

 myExpressionはまだ空っぽなので何も表示されない…と思いきや、何やら黄色い字で1行、Spriteやらmissingやら警告っぽく表示されています。

f:id:kitposition:20160303003720p:plain

これはえーと…よくわからないので無視しましょうw*4

 次に、左上のを押してモーション録画モードにします。この状態で表情を動かすと、すべてmyExpressionに記録される訳ですが、ここでシーン内のユニティちゃんをふと見ると… 

f:id:kitposition:20160303004151p:plain

 うぉ!録画モードにしたとたん、何やらインチキ占い師みたいなポーズになっています!でも今回調整するのは表情だけですから、ずばりこれも気にしないことにしますw

 あとはこの状態で、その2の記事で紹介したようにHierarchyビューでユニティちゃんを展開して表情のSkinned Mesh Rendererコンポーネントがアタッチされている各パーツを探し出し、インスペクタで値を好きなように調整します。調整の結果はリアルタイムでシーンビューのユニティちゃんに反映されるとともに、AnimationウィンドウのmyExpressionのタイムラインのフレーム0に登録されます*5  *6

f:id:kitposition:20160303005851p:plain

f:id:kitposition:20160303005910p:plain

 調整が終わったら、先ほどのボタンを押して録画モードを終了します*7。録画モードを脱すると表情は一旦元に戻りますが、しっかりmyExpressionファイルに記録されていますので、再生するとこの通りです!*8

 …て、もうちょっとマシな表情にしてあげればよかったですねぇ^^;

f:id:kitposition:20160303010042p:plain

 あとは、このmyExpressionモーションを部品として自作ゲームのAnimatorに登録するなど、標準の表情モーションと全く同じように扱うことができます。

先人の便利ツールがあった!

 以上が一応の手順ですが、要は表情.animファイルを1つ作りたいだけの割には少々大げさです(Tポーズがかわいそうで身体のモーションを設定したせいもありますが)。
 で、探してみたら、とても便利なツールを作成した方がおられました!

mebiustos.hatenablog.com

 詳しくはリンク先の記事をご覧いただきたいのですが、使い方はモデルにアタッチするだけととても簡単です。私が紹介した普通の方法に比べると、

  • Animatorを用意したりなどの下準備が不要
  • ブレンドシェイプが登録されたSkinned Mesh Rendererが存在するパーツを探して選択しなくても、スクリプトをアタッチしたオブジェクト配下に存在する全ブレンドシェイプをインスペクタで調整可能(スライダー付き)*9
    そして何より、
  • 表情ができた時点で「Create Clip」ボタンを押すとワンフレームの.animファイルが生成される

 と至れり尽くせりな感じです。仕組みを理解する上では1つ1つの手順を地道にやってみるのがよいと思いますが、実作業ではこういうツールでパパッとやれると本当に助かります。Unityは先人の叡智がネットにあふれていますね。皆様ありがとうございます。

 それでは、皆さんもユニティちゃん変顔ライフをお楽しみください!

ライセンス表記

ユニティちゃんライセンス

※記事中で使用したユニティちゃんモデルはユニティちゃんライセンス条項の元に提供されています。

*1:パッケージの中にはプレハブのユニティちゃんも入っていますが、デモ用のスクリプトがアタッチ済みだったりして説明のジャマなので今回はModelを使用しました。

*2:両者についてはakeytsuの紹介記事で少し触れています。

*3:Unityでは、初めから存在するEntryなどのステート以外で最初にAnimatorウィンドウに作成されたステートがデフォルトステートになり、オレンジ色で示されます。後で変更は可能です。

*4:手順は省略しますが削除しても問題ないっぽい

*5:Unityをはじめ多くのアニメーション作成ツールでは、タイムライン上のモーションの要となる時点に「キーフレーム」を設定し、そこにポーズをつけていくことで、キーとキーとの間の動きは勝手に補完してくれます。Unityでは任意の時点に明示的にキーフレームを追加する操作も可能ですが、録画モードでモデルに変更を加えると、ヘッドがある位置(今回ならフレーム0)に自動的にキーフレームが設定され、同時に変化があった部分がタイムラインに登録されてポーズが記録されます。一方で以前ご紹介したakeytsuの場合は明示的にキーフレームを追加する必要があるなど、この辺はツールの設計思想によって様々です。

*6:身体のモーションと同様、表情の場合も以降のフレームにキーを追加していくことで、アニメーションする表情をつくることも可能です。ただ、表情の場合は身体モーションに合わせてここぞというときにイベント等を用いて変化させるような使い方が多いので、今回のように特定の静止表情をワンフレームのモーションとして作成して使うケースも多いと思います。ユニティちゃんに付属する表情モーションファイルもすべてワンフレームです。

*7:録画モードを終了しても、ユニティちゃんは変なポーズのままです。再生するとちゃんと立ちますので実用上は問題ありませんが、どうしても気持ち悪いようならAnimationウィンドウでWait00のタイムラインに切り替え、時間の目盛りのどこかをクリックするとなぜかWait00のポーズになります。

*8:再生しても表情が変わらない場合、レイヤーのWeightが0のままになっていないか確認してみてください。

*9:大人ユニティちゃんのように、当該パーツが階層の奥深くにあったり、複数ある場合は特に便利です!