【Unity】Unity-Chanは二度笑う~ユニティちゃん表情モーション研究~その1
ユニティちゃん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ウインドウで開き、中身を見てみましょう。
…と、これはどうやら表情ではなくて身体のモーションのようですね。でも、左上をよく見ると…?
このAnimatorには2層のアニメーションレイヤーが存在していて、今見えているのはBase Layerの方でした。では、その下にあるFaceというレイヤーに切り替えてみると…?
おぉ!全ての表情モーションが登録済みです。
ここでこのFaceレイヤーのプロパティ*3を見てみると、
このFaceレイヤーには、顔部分にのみアニメーションが適用されるように設定されたアバターマスク「face only mask」が登録されているため、このレイヤーで指定された表情モーションはBase Layerで指定される身体のモーションとは独立して顔部分にのみ適用されることがわかります*4
あとは、この表情モーションをコード等で切り替えることで、表情を自在にコントロールできます。その切替用のスクリプトまでもあらかじめ付属しており、プレハブのユニティちゃんには最初からアタッチされています。それがFaceUpdate.csです。
コードは省略しますが、OnCallChangeFace(string)メソッドにモーションの名前を引数として渡して呼び出すことでモーションを切り替えます。このコード自体はデモシーン用なので、表情切替のGUIボタン用コードがあったりしてそのまま自作ゲーム等に使うには邪魔ですが、その辺バッサリ切ってしまえば応用は容易でしょう。
アニメーションイベントによる表情の切り替え
また、身体のモーションと表情の変化をうまくリンクさせる方法として、アニメーションイベントを使う手があります。これは、Animation Clipのタイムライン上にイベント発火点を設定して任意のタイミングで任意のイベントを呼ぶ機能で、いちいちコードを弄らずにタイムライン上で視覚的にタイミングを調整できるのでとても便利です*5。
SDユニティちゃんでは、標準で付属する身体モーションの殆どにアニメーションイベントが設定されています*6。例えば、身体モーション「Jumping@loop」のタイムラインをAnimationウインドウで見ると、
上の方にいくつか見えるクサビのようなものがアニメーションイベントで、マウスでドラッグして好きな位置に好きなだけ配置できます。ここに見えているアニメーションイベントにはいずれも先ほどのOnCallChangeFace(string)メソッドが登録され、渡す引数(アニメーション名)はそれぞれ個別に設定されています。
これによって、このようにモーションと合った豊かな表情が実現しています。
もし同じモーションでも表情がないと、
…ってこれはこれでかわいい気もしますがw やっぱり表情があるほうがいいよね(^^;
まとめ
冒頭に「ブレンドシェイプ」を持ち出したはずが、ユニティちゃんの超親切仕様のおかげで全くブレンドシェイプに触れずに一通りのことができてしまいました。
しかし、今回説明した方法では当然ながら付属のモーションを適用させることしかできません*7。でもどうせなら、もっと色んな表情をさせてみたいですよね。記事冒頭に乗せたようなヤンチャな表情もいいし、他にもこんなのとか!
こういうオリジナルの表情をさせるためには、やはりブレンドシェイプのウェイトを制御する必要があります。その方法は…次回のお楽しみ!(akeytsuも中途半端なのに続くのか!大丈夫かw)
ライセンス表記
※記事中で使用したユニティちゃんモデルはユニティちゃんライセンス条項の元に提供されています。
*1:ブレンドシェイプを作成できるツールとしてはMaya、Blenderなどがありますが、私はどれも使えないのでこのブログでは紹介しません。
*2:sapとかdisstractとか単語として意味不明のものがあるのですがそいういうファイル名なので…
*3:レイヤー名の横にある歯車マークをクリックすると表示されます。
*4:歯車マークの左にあるMは、このレイヤーにアバターマスクが設定済であることを示します。「face only mask」はユニティちゃんに付属しますが、Unity上で好きな部位をマスクしたアバターマスクを作成することもできます。
*5:私のような非プログラマーは便利と感じるのですが、コードで制御したい方には不便なのかも…
*6:大人ユニティちゃんの身体モーションではタイムライン上でブレンドシェイプ自体を弄って表情を変えているようです。
*7:今回登場したアニメーションレイヤーのように、Unityにはアニメーションを合成する手段が複数あるので、それらを駆使して付属のモーションを組み合わせればさまざまな表情をさせることもできなくはないのですが、それなりに面倒です。