きっポグ

- kitposition's weblog -

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

f:id:kitposition:20160221230604p:plain

 ユニティちゃん3Dモデルを用いたコンテンツをいくつか作ってみて、身体のモーション同様に重要だと感じるのは表情です。ユニティちゃんの場合、身体の動きはボーンが動くことで産み出されますが、表情は「ブレンドシェイプ」という機能で実現しています。ブレンドシェイプとは、ボーンを動かすのではなく、メッシュ(大雑把に言うとモデルの"外皮")のポリゴンの頂点を動かすことでメッシュを変形させる技術で、モーフとか頂点アニメーションと呼ばれたりもするようです。
 それでは、今回はユニティちゃんの豊かな表情を引き出すために頑張ってみることにします!

 ユニティちゃんに標準で付属する表情モーション

 前述の通り、ユニティちゃんは表情をブレンドシェイプで実装していますが、Unityにはブレンドシェイプ自体を新規で作成する機能はありません。できるのは、他のツール*1等であらかじめブレンドシェイプが設定されたモデルについて、ブレンドシェイプのウェイト(重み)を変更して形状を変化させることだけです。

 しかし、Unityではボーンの動きと同様、このブレンドシェイプのウェイトの変化もAnimation Clipファイル(.anim)として保存することができます。実はユニティちゃんにはこの表情の.animファイルがあらかじめ同梱されているため、ブレンドシェイプの知識が一切なくても表情の切り替えが可能です。

 標準付属の表情.animファイルは以下の通りです。日本語の説明は私が勝手につけてます。

●大人ユニティちゃん*2

default 標準(済まし気味の微笑み)
smile1 口を開けて笑う
smile2 口を閉じて笑う
conf 困惑する
sap 驚く
angry1 口をへの字にして怒る
angry2 口を開けて怒る
disstract1 ジト目
disstract2 ジト目でニヤリ
eye_close 目を閉じる
ASHAMED 恥ずかしがる
SURPRISE 驚く(sapより控えめ)
MTH_A あの発音(口開け)
MTH_I いの発音(口一文字)
MTH_U うの発音(口つぼみ)
MTH_E えの発音(口横開け)
MTH_O おの発音(口縦開け)

●SDユニティちゃん

default 標準(澄まし気味の微笑み)
smile 口を閉じて笑う
smile2 口を開けて笑う
angry 口を結んで怒る
confuse 困惑する
sad 悲しむ
scold 叱る
strain キリッ
surprise 驚く
damaged 被ダメージ
relux リラックス
eye_close 目を閉じる
mth_a あの発音(口開け)
mth_i いの発音(口一文字)
mth_u うの発音(口つぼみ)
mth_e えの発音(口横開け)
mth_o おの発音(口縦開け)
mth_L 左下がりのニヤリ
mth_R 右下がりのニヤリ

Animator内での表情コントロール

 さて、前述のモーションをAnimator Controller(Animator)に登録することで、さまざまな状況に基づいて表情を切り替えることができるのですが、さらに親切なことにユニティちゃんにはそのAnimatorも最初から付属しています。

 一例として、大人ユニティちゃんに付属するAnimatorの1つ、「UnityChanActionCheck」をAnimatorウインドウで開き、中身を見てみましょう。

f:id:kitposition:20160221214442p:plain

 …と、これはどうやら表情ではなくて身体のモーションのようですね。でも、左上をよく見ると…?

f:id:kitposition:20160221214511p:plain

  このAnimatorには2層のアニメーションレイヤーが存在していて、今見えているのはBase Layerの方でした。では、その下にあるFaceというレイヤーに切り替えてみると…?

f:id:kitposition:20160221215127p:plain

 おぉ!全ての表情モーションが登録済みです。
 ここでこのFaceレイヤーのプロパティ*3を見てみると、

f:id:kitposition:20160221215606p:plain

 このFaceレイヤーには、顔部分にのみアニメーションが適用されるように設定されたアバターマスク「face only mask」が登録されているため、このレイヤーで指定された表情モーションはBase Layerで指定される身体のモーションとは独立して顔部分にのみ適用されることがわかります*4

 あとは、この表情モーションをコード等で切り替えることで、表情を自在にコントロールできます。その切替用のスクリプトまでもあらかじめ付属しており、プレハブのユニティちゃんには最初からアタッチされています。それがFaceUpdate.csです。
 コードは省略しますが、OnCallChangeFace(string)メソッドにモーションの名前を引数として渡して呼び出すことでモーションを切り替えます。このコード自体はデモシーン用なので、表情切替のGUIボタン用コードがあったりしてそのまま自作ゲーム等に使うには邪魔ですが、その辺バッサリ切ってしまえば応用は容易でしょう。

アニメーションイベントによる表情の切り替え

 また、身体のモーションと表情の変化をうまくリンクさせる方法として、アニメーションイベントを使う手があります。これは、Animation Clipのタイムライン上にイベント発火点を設定して任意のタイミングで任意のイベントを呼ぶ機能で、いちいちコードを弄らずにタイムライン上で視覚的にタイミングを調整できるのでとても便利です*5

 SDユニティちゃんでは、標準で付属する身体モーションの殆どにアニメーションイベントが設定されています*6。例えば、身体モーション「Jumping@loop」のタイムラインをAnimationウインドウで見ると、 

f:id:kitposition:20160221223118p:plain

上の方にいくつか見えるクサビのようなものがアニメーションイベントで、マウスでドラッグして好きな位置に好きなだけ配置できます。ここに見えているアニメーションイベントにはいずれも先ほどのOnCallChangeFace(string)メソッドが登録され、渡す引数(アニメーション名)はそれぞれ個別に設定されています。

 これによって、このようにモーションと合った豊かな表情が実現しています。

  もし同じモーションでも表情がないと、

…ってこれはこれでかわいい気もしますがw やっぱり表情があるほうがいいよね(^^;

まとめ

  冒頭に「ブレンドシェイプ」を持ち出したはずが、ユニティちゃんの超親切仕様のおかげで全くブレンドシェイプに触れずに一通りのことができてしまいました
 しかし、今回説明した方法では当然ながら付属のモーションを適用させることしかできません*7。でもどうせなら、もっと色んな表情をさせてみたいですよね。記事冒頭に乗せたようなヤンチャな表情もいいし、他にもこんなのとか!

f:id:kitposition:20160221230000p:plain

 こういうオリジナルの表情をさせるためには、やはりブレンドシェイプのウェイトを制御する必要があります。その方法は…次回のお楽しみ!(akeytsuも中途半端なのに続くのか!大丈夫かw)

ライセンス表記

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

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

*1:ブレンドシェイプを作成できるツールとしてはMaya、Blenderなどがありますが、私はどれも使えないのでこのブログでは紹介しません。

*2:sapとかdisstractとか単語として意味不明のものがあるのですがそいういうファイル名なので…

*3:レイヤー名の横にある歯車マークをクリックすると表示されます。

*4:歯車マークの左にあるMは、このレイヤーにアバターマスクが設定済であることを示します。「face only mask」はユニティちゃんに付属しますが、Unity上で好きな部位をマスクしたアバターマスクを作成することもできます。

*5:私のような非プログラマーは便利と感じるのですが、コードで制御したい方には不便なのかも…

*6:大人ユニティちゃんの身体モーションではタイムライン上でブレンドシェイプ自体を弄って表情を変えているようです。

*7:今回登場したアニメーションレイヤーのように、Unityにはアニメーションを合成する手段が複数あるので、それらを駆使して付属のモーションを組み合わせればさまざまな表情をさせることもできなくはないのですが、それなりに面倒です。