making of ユニティちゃんステージデモ in comicmarket 86
DESCRIPTION
2014/10/04に開催された、ゲーム未来学研究会01「Oculusを最前列で遊ぶ冴えたやり方」セミナー資料。 コミックマーケット86で公開されたユニティちゃんステージデモのメイキングについて。 ユニティちゃんステージデモのリアルタイム映像はこちらからどうぞ http://unity-chan.com/events/c86/WebPlayer/TRANSCRIPT
Making ofユニティちゃんステージデモ in ComicMarket 86Unity Technologies Japan合同会社!コミュニティエバンジェリスト!
小林 信行"ゲーム未来学研究会01"
「Oculusを最前列で遊ぶ冴えたやり方」"セミナー資料"2014/10/04
本日のテーマ• コミケ86で公開しました『ユニティちゃんステージデモ』制作にあたってのポストモーテムを、主にキャラクター制御の観点から行います!
• デモの組み込み自体は約2日間で終了しましたが、その高速組込を可能にしたMecanimでのキャラクター制御や、その前段階でのデータ整理のやり方等を説明します!
• プロジェクト公開と共に参加型イベントを予定してます。今日の講演が参考になることを祈りつつ…(*^_^*)
本日のお品書き
C86『unity-chan!』ポストモーテムⅠ.MotionBuilderを使ったモーションキャプチャデータの調整Ⅱ.Unity上でのセットアップⅢ.完成プロジェクトのひも解き方Ⅳ.
C86『unity-chan!』ポストモーテムⅠ.
コミケ86『unity-chan!』風景 8/15-17
3Dキャラ制作
楽曲制作 モーション制作 モーション調整
ダイナミクス設定
ステージエフェクト作成
Mecanim組込 リソース結合
キャラコントロール用コンポーネント作成
3Dステージ制作(カメラポイントの設定も含む)
デモ制作の大まかな流れ
8/14 4:37 ~ 22:43 Ver1.0 Release
8/13
最終調整
ステージコントロール用コンポーネント作成
何故、高速組込が可能だったのか?• Mecanim/Humanoidの柔軟性⇒本番モデル(CandyRockStar)が完成する前から、ユニティちゃんVer1.2で、モーションキャプチャデータの調整の他、音合わせを含む必要なキャラクター制御の組込自体は終了していた!
• 二人のエキスパートプログラマの手を極力止めない開発環境⇒gitを使った同時開発環境。開発開始前にgitリポジトリを準備、そこにリソース納品。!
• リソース担当が、プログラマがどのような「手」で組み上げてくるか理解した上での、リソースの準備⇒複数のDCCツールを使って時間をかけなければければクオリティアップができない部分と、Unityで楽してクオリティアップができる部分を分けて、リソースを作成
手戻りがほぼない実装を実現できた
MotionBuilderを使ったモーションキャプチャデータの調整Ⅱ.
モーションキャプチャとは?
• アクターのモーションを直接アニメーションデータとして取り込むシステムのこと。!
• 主な方式として、光学方式、磁気センサー方式、映像解析方式などがある。
モーションキャプチャ収録風景
モーションキャプチャ収録時のポイント
• 収録データの冒頭で必ずアクターさんに5秒ほどTスタンスをとってもらう"
• ダンスの場合、収録時の音楽スタートのフレームを記録しておく"
• FPSはMotionBuilder上で最終調整ができる。最低30fpsあれば問題ないが、可能なら高レートで収録しておく
Unity上のモデルにMocapデータを流し込むだけ
なら、モーションデータがFBX化されていれば、Mecanim/Humanoidの標準機能だけで十分なんだよっ!
ここからは、クオリティアップのための調整ノウハウのお話になるよっ!
あまり公開されないお話なので、やり方よりも
考え方(作業の目的)に注目してねっ!
キャプチャデータの調整例
手が胸に突っ込んでいるのを調整 ポーズのずれの調整し、より人間らしくする
キャプチャデータの調整例
元のダンサーとの体格の違いによる、手足の先の方向ずれ(肘膝のフリップ)の調整 (C86ダンスの場合にはなかった)
キャプチャデータの調整ワークフローMocapデータ
Mocapデータのキャラクタライズ
ユニティちゃんVer1.2モデル
モデルのキャラクタライズ
Mocapデータをユニティちゃんモデルに流し込み
リターゲットパラメタ(Reach/Pull)の調整
ユニティちゃんコントロールリグへMocapデータをプロット
アニメーションレイヤーを使った調整
ユニティちゃんスケルトンへアニメーションをベイク
Storyツールによるカット調整 完成
キャラクタライズとは?
• 『キャラクタライズ』とは、MotionBuilder/Maya上で、HumanIK用コントロールリグを設定することを言います。!
• モデルおよびモーションをそれぞれキャラクタライズをすることで、任意のモーションをモデルに流し込めるようになります。!
• Mecanim/HumanoidでのFBXデータのRig/Animation設定と同じ考え方です。
モーションをキャラクタライズすることで、キャラクター名からモーションにアクセスできるようになります
ユニティちゃんVer1.2のスケルトン階層
キャラクタライズの結果、作成されたコントロールリグ階層
ユニティちゃんVer1.2のメッシュ階層
スケルトンとリグとメッシュ
対応
バインド
キャラクタライズ
Mocapデータの流し込み
こちらに変更する
ユニティちゃんVer1.2のスケルトン階層
ユニティちゃんVer1.2のコントロールリグ階層
ユニティちゃんVer1.2のメッシュ階層
Mocapデータのスケルトン階層
Mocapデータのコントロールリグ階層
キャラクタライズ
Mocapアニメーションデータ
ソース変更
スケマティックで見てみると
キャラクタライズ
バインド
リターゲットパラメタの調整
主にReachでモデルの各関節の位置をMocapデータ側の関節の位置になるべく近づける。 L/R Elbow Reach、L/R Hand Reach T、L/R Hand Reach R、Chest Reach Tなど。 必要に応じてPullもReach同様に調整する。
リターゲットパラメタの調整
コントロールリグへのMocapデータのプロットCharacter Controlsメニューより Bake(Plot) to Control Rig実行 ⇒Sourceが、ユニティちゃんモデルのコントロールリグ側に変わる。
この結果、Mocapデータのアニメーションが、モデルのコントローラ側の値に移し変えられた(リプロットされた)ことになります。
Character Controlsメニュー
ユニティちゃんVer1.2のスケルトン階層
ユニティちゃんVer1.2のコントロールリグ階層
ユニティちゃんVer1.2のメッシュ階層
Mocapデータのスケルトン階層
Mocapデータのコントロールリグ階層
キャラクタライズ
Mocapアニメーションデータ
コントロールリグへプロット
スケマティックで見てみると
キャラクタライズ
バインド
Mocapアニメーションデータ
アニメーションレイヤーを使った調整
アニメーションレイヤー
タイムライン
必ずSnap & Play on Framesにする
現在編集中のレイヤー元のアニメーションのレイヤー
修正キーを打つレイヤーは Additiveにしておく
アニメーションレイヤーを使った調整
随時クリップを送りながら、腕が身体に突っ込んでいるような不具合部分を修正する。手の置き位置などの修正は、修正したい箇所を挟むようにまずフルボディで2つキーを打っておき、その後で修正したいコントローラをなるべく少ないキーで修正する。
アニメーションレイヤーを使った調整•初期位置(Tスタンス)での手や頭の角度などの最終調整。オリジナルアニメーションにアニメーションレイヤーを追加し、レイヤー上でモーションを微調整する。 •大きめの修正はIKで、細かい修正はローテーションでやるとよい。 •モーションによっては手足がフリップすることもある。その場合はフリップする直前にフルボディモードでキーを追加してやるとよい。 •フリップ確認には、元のモーションを横にずらして一緒に再生してやるとわかりやすい •細かいコントローラの使い方や、フルボディIKの使い方は、
http://www.slideshare.net/nyaakobayashi/bd-maya-ltcharaanime131128
ユニティちゃんスケルトンへアニメーションをベイク
• コントロールリグでのモーションの修正が終わったら、モデルのスケルトンへモーションをベイクする • Character ControlsメニューよりBake(Plot) to Skelton実行 • ここまで終わったらFBXセーブし、MotionBuilderのStoryでモーションのカット調整に進める。
スケルトンへのベイクが終了するとSorceはNoneに、アニメーションレイヤーはBaseAnimationになる。
Mocapデータを調整する「意味」
• 本番に近いモデルに割り当てることで、動きを再確認する"
• よりキャラにあった動きやポーズに修正する"• コントロールリグに30fpsでリプロットすることで、結果Mocapデータが、いわゆるヌルヌルの状態から、適宜サンプリングされることになる"
• 調整キーを追加することで、ポーズやアクションにメリハリが生まれる
ダンスアニメーションFBXの組込用仕様
0 1 60 61 7221
Tスタンス
ウォームアップ ダンスモーション本編(30fps)
音楽IN
ダイナミクスが落ち着くまでの予備時間
このフレームは、MecanimのAnimation設定側で切り落とす
Storyツールによるカット調整
Storyツールのタブ
新たにシーンに読み込んだアニメーションデータを含むFBXファイルをカットしたり、繋いだりして編集します
ここでアニメーションを流し込むキャラクターと、ボディマスクを選択します
新たにシーンに読み込んだアニメーションデータを持たないキャラクタライズ済みのユニティちゃんモデル
Storyツールによるカット調整• MBで新規シーンを開き、Storyパネルに編集をしたいアニメーションの含まれているFBXをD&Dする • さらに割り当てるキャラクターモデルをアニメーションなしでシーンにマージし、Storyパネル上のCharacterに指定する。キャラクターモデルのソースがNoneならば、Storyに読み込まれているアニメーションで動く。 • シザーツールなどを使いながら、アニメーションクリップのカット(尺)調整をする。 • アニメーションのカット調整が終わったら、Story上で出力したいアニメーションを指定し、右メニューより Plot Whole Scene To Current Take で、空のTake1に出力する。
シザーツール
残る作業 = Mocapでは出来ない作業
• ダイナミクス(揺れ物)設定"• 手の表現(エクスプレッション)"• 表情変化の指定"• 楽曲とシンクロする口パク合わせ
全部Unity上でやってしまう!
Unity上でのセットアップⅢ.
ダイナミクスの設定
• ユニティちゃんVer.1.2に付属する、SpringManager.cs、SpringCollider.cs、SpringBone.csを使う。基本設定は付属ドキュメントを参照。 • 今回のセッティングでは、ユニティちゃんを一定の場所から大きく動かさないので、胸周りのスプリングは柔らかめにしてあります(ntnyさんのこだわり) • 他、上着の裾周りのスプリング設定にこだわりがあります(ntnyさんのこだわり) • SpringBoneは全部で68個入っています
Mecanim:アニメーションレイヤーを使った手のエクスプレッションの追加
• 手のエクスプレッション(表情)は、Mocapで撮るのは大変なので、こちらは3dsMax上で手付けをしています(ntnyさん) • Tスタンスで手のエクスプレッションのみが変化するアニメーション入りFBXファイルを作成し、Unity上でMecanimのアニメーションレイヤーで合成します。手はボディマスクでその部分のみ、アニメーションがOverrideされるようにします • ダンスが3種類あるので、ダンスのステート変移に合わせて同じモーションを別ステートとして登録してあります
Mecanim:アニメーションイベントを使った顔のエクスプレッションの追加
• ユニティちゃんVer.1.2に収録されている、FaceUpdate.csに含まれている表情切り替え用イベントコールOnCallChangeFace()メソッドを、Mecanimのアニメーションイベントで呼び出します • 手のエクスプレッションを収録しているHandExpression.fbx内でアニメーションイベントを設定することで、同じFBXファイルで手と表情のエクスプレッションを同時変更します
Mecanim:アニメーションイベントを使った音楽再生のタイミング合わせ
• こちらも同様にCandyRockStarモデルにアタッチされているMusicStarter.csのOnCallMusicPlay()メソッドをMecanimのアニメーションイベントからコールします • このアニメーションイベントは、ダンスモーションに合わせる必要があるので、ダンスモーションが含まれているFBXに、音楽開始のタイミングと停止のタイミングでイベントコールが設定されています
楽曲とシンクロした口パク
• シーン内にLipSyncControllerというゲームオブジェクトがあり、それにアタッチされているLipSyncController.csが担当します。 • この手の演出は、楽曲と口パクをシンクロさせるデータをどれだけ正確に作るかがキモなんですが… • 今回はかなり力業で作りました(^_^;)。その代わり綺麗です(ntnyさんのこだわり)
Advanced:IKによるLookAtシステム
Advanced:IKによるLookAtシステム• C86後に実装された機能です。Mecanim/Humanoidの Animator.SetLookAtWeight()と連動して、視線追従に基づく眼球ジョイントのローテーション変化を、ユニティちゃんモデルの瞳テクスチャのUVオフセットに変換して実現します • 使い方は簡単で、Mecanim/Humanoidのアバター設定(Rig/Configure)でLeft EyeおよびRight Eyeに割り当てたロケータに、各々DeltaLookAtAxis.csをアタッチし、それぞれのDeltaLookAtAxisコンポーネントから、左右の瞳オブジェクトを参照します • あとは、Animator.SetLookAtWeight()の眼球ウェイトを大きくすれば、自動で瞳のUV移動を伴う視線追従を行います • TGS用OculusRiftデモで使われているようです
Unityでの実装/DCCツールでの作業仕分けのポイント
• Unityで実装したほうが楽なデータは、Unity上でやってしまう!"
• 特に使い回しが多そうなデータは、DCCツール上で組み込んでしまうよりは、Unity上で合成したほうが楽"
• Mecanim/Humanoidは、極めて強力。モーション流し込みの柔軟性はMotionBuilder以上
完成プロジェクトのひも解き方Ⅳ.
Unityではシーン内のゲームオブジェクトに様々な コンポーネントをアタッチすることで、機能を実現します
ひとつのCandyRockStarゲームオブジェクトに たくさんのコンポーネントがアタッチされている。 これらの各コンポーネントが、それぞれに 指定された機能を実現している。 ⇒各コンポーネントがどのようにお互いを参照しあっているかの方法を理解すると、シーン構成がわかりやすくなる
ポイントは各コンポーネント間の参照関係をどうやって知るか?
•詳しくはこちらの資料を参照。http://www.slideshare.net/nyaakobayashi/how-toinspectcompletescenes130618
•プラス、今回はアニメーション関連のコンテンツなので、各LateUpdate()イベントにも注意する。細かいキャラクターの追加制御は、LateUpdate()内で行ってます
クラスとコンポーネントをガレージキットで例えてみよう!
原型 シリコンゴム型 キャスト注入 製品
画像は、Wonder Festival オフィシャルサイト『ガレージキットとは』よりhttp://wf.kaiyodo.net/knowledge/garagekit/
上が超簡単に説明した、ガレージキットの製作の流れ
Class / type / Instantiate / Componentの関係
原型 シリコンゴム型 キャスト注入 製品
クラス オブジェクトインスタンス化
GameObjectにアタッチすることで実体(インスタンス)化できるクラス
⇒コンポーネント
コード本体 タイプ(型)
画像は、Wonder Festival オフィシャルサイト『ガレージキットとは』よりhttp://wf.kaiyodo.net/knowledge/garagekit/
※自分で書いたスクリプトも、もちろん含まれる
ポストとメモリのカンケイ??
?
ポストとメモリのカンケイ??ポスト •ポストには目的に応じて様々なタイプがある •各々のポストには、住所がひも付けられている •ポストを使いたい場合、まずポストを設置し、郵便局に住所登録をしておく必要がある •ポストに何か届けたい時には、届けものに正確に住所を指定する必要がある
ポスト⇒メモリと読み替えてみると…?
コンポーネント (GameObjectにアタッチされて
実体化したクラス)
ポストの用途やサイズ等(タイプ)を事前に決めて、設置する⇒「コンポーネント参照用変数を宣言する」
ポストの住所を指定して、郵便物等を送る/受け取る/利用する⇒「コンポーネントを参照する」
コンポーネント参照のための手順
他にも、「カプセル化」「多態性」「継承」「オーバーライド関数」「ドットシンタックス」「名前空間」「スコープ」とか、いろいろあるけど、それはまたどこかで(^_^;)
UnityのC#コーディングで、ビギナーが迷いやすい
のは、「Unity向けのスクリプトをC#の文法で書い
ている」というトコじゃないかなっ?そこを「Unityならではのライブラリ機能」と、
「C#が元々持っている文法やライブラリ機能」を 意識して区別する練習をしてみると、コーディング
が急に楽になるよっ!
Q&A