making of ユニティちゃんステージデモ in comicmarket 86

51
Making of ユニティちゃんステージデモ in ComicMarket 86 Unity Technologies Japan合同会社 コミュニティエバンジェリスト 小林 信行 ゲーム未来学研究会01 Oculusを最前列で遊ぶ冴えたやり方」 セミナー資料 2014/10/04

Upload: nobuyuki-kobayashi

Post on 06-Dec-2014

11.769 views

Category:

Engineering


6 download

DESCRIPTION

2014/10/04に開催された、ゲーム未来学研究会01「Oculusを最前列で遊ぶ冴えたやり方」セミナー資料。 コミックマーケット86で公開されたユニティちゃんステージデモのメイキングについて。 ユニティちゃんステージデモのリアルタイム映像はこちらからどうぞ http://unity-chan.com/events/c86/WebPlayer/

TRANSCRIPT

Page 1: Making of ユニティちゃんステージデモ in ComicMarket 86

Making ofユニティちゃんステージデモ in ComicMarket 86Unity Technologies Japan合同会社!コミュニティエバンジェリスト!

小林 信行"ゲーム未来学研究会01"

「Oculusを最前列で遊ぶ冴えたやり方」"セミナー資料"2014/10/04

Page 2: Making of ユニティちゃんステージデモ in ComicMarket 86

本日のテーマ• コミケ86で公開しました『ユニティちゃんステージデモ』制作にあたってのポストモーテムを、主にキャラクター制御の観点から行います!

• デモの組み込み自体は約2日間で終了しましたが、その高速組込を可能にしたMecanimでのキャラクター制御や、その前段階でのデータ整理のやり方等を説明します!

• プロジェクト公開と共に参加型イベントを予定してます。今日の講演が参考になることを祈りつつ…(*^_^*)

Page 3: Making of ユニティちゃんステージデモ in ComicMarket 86

本日のお品書き

C86『unity-chan!』ポストモーテムⅠ.MotionBuilderを使ったモーションキャプチャデータの調整Ⅱ.Unity上でのセットアップⅢ.完成プロジェクトのひも解き方Ⅳ.

Page 4: Making of ユニティちゃんステージデモ in ComicMarket 86

C86『unity-chan!』ポストモーテムⅠ.

Page 5: Making of ユニティちゃんステージデモ in ComicMarket 86

コミケ86『unity-chan!』風景 8/15-17

Page 6: Making of ユニティちゃんステージデモ in ComicMarket 86

3Dキャラ制作

楽曲制作 モーション制作 モーション調整

ダイナミクス設定

ステージエフェクト作成

Mecanim組込 リソース結合

キャラコントロール用コンポーネント作成

3Dステージ制作(カメラポイントの設定も含む)

デモ制作の大まかな流れ

8/14 4:37 ~ 22:43 Ver1.0 Release

8/13

最終調整

ステージコントロール用コンポーネント作成

Page 7: Making of ユニティちゃんステージデモ in ComicMarket 86

何故、高速組込が可能だったのか?• Mecanim/Humanoidの柔軟性⇒本番モデル(CandyRockStar)が完成する前から、ユニティちゃんVer1.2で、モーションキャプチャデータの調整の他、音合わせを含む必要なキャラクター制御の組込自体は終了していた!

• 二人のエキスパートプログラマの手を極力止めない開発環境⇒gitを使った同時開発環境。開発開始前にgitリポジトリを準備、そこにリソース納品。!

• リソース担当が、プログラマがどのような「手」で組み上げてくるか理解した上での、リソースの準備⇒複数のDCCツールを使って時間をかけなければければクオリティアップができない部分と、Unityで楽してクオリティアップができる部分を分けて、リソースを作成

手戻りがほぼない実装を実現できた

Page 8: Making of ユニティちゃんステージデモ in ComicMarket 86

MotionBuilderを使ったモーションキャプチャデータの調整Ⅱ.

Page 9: Making of ユニティちゃんステージデモ in ComicMarket 86

モーションキャプチャとは?

• アクターのモーションを直接アニメーションデータとして取り込むシステムのこと。!

• 主な方式として、光学方式、磁気センサー方式、映像解析方式などがある。

Page 10: Making of ユニティちゃんステージデモ in ComicMarket 86

モーションキャプチャ収録風景

Page 11: Making of ユニティちゃんステージデモ in ComicMarket 86

モーションキャプチャ収録時のポイント

• 収録データの冒頭で必ずアクターさんに5秒ほどTスタンスをとってもらう"

• ダンスの場合、収録時の音楽スタートのフレームを記録しておく"

• FPSはMotionBuilder上で最終調整ができる。最低30fpsあれば問題ないが、可能なら高レートで収録しておく

Page 12: Making of ユニティちゃんステージデモ in ComicMarket 86

Unity上のモデルにMocapデータを流し込むだけ

なら、モーションデータがFBX化されていれば、Mecanim/Humanoidの標準機能だけで十分なんだよっ!  

ここからは、クオリティアップのための調整ノウハウのお話になるよっ!  

あまり公開されないお話なので、やり方よりも  

考え方(作業の目的)に注目してねっ!

Page 13: Making of ユニティちゃんステージデモ in ComicMarket 86

キャプチャデータの調整例

手が胸に突っ込んでいるのを調整 ポーズのずれの調整し、より人間らしくする

Page 14: Making of ユニティちゃんステージデモ in ComicMarket 86

キャプチャデータの調整例

元のダンサーとの体格の違いによる、手足の先の方向ずれ(肘膝のフリップ)の調整 (C86ダンスの場合にはなかった)

Page 15: Making of ユニティちゃんステージデモ in ComicMarket 86

キャプチャデータの調整ワークフローMocapデータ

Mocapデータのキャラクタライズ

ユニティちゃんVer1.2モデル

モデルのキャラクタライズ

Mocapデータをユニティちゃんモデルに流し込み

リターゲットパラメタ(Reach/Pull)の調整

ユニティちゃんコントロールリグへMocapデータをプロット

アニメーションレイヤーを使った調整

ユニティちゃんスケルトンへアニメーションをベイク

Storyツールによるカット調整 完成

Page 16: Making of ユニティちゃんステージデモ in ComicMarket 86

キャラクタライズとは?

• 『キャラクタライズ』とは、MotionBuilder/Maya上で、HumanIK用コントロールリグを設定することを言います。!

• モデルおよびモーションをそれぞれキャラクタライズをすることで、任意のモーションをモデルに流し込めるようになります。!

• Mecanim/HumanoidでのFBXデータのRig/Animation設定と同じ考え方です。

モーションをキャラクタライズすることで、キャラクター名からモーションにアクセスできるようになります

Page 17: Making of ユニティちゃんステージデモ in ComicMarket 86

ユニティちゃんVer1.2のスケルトン階層

キャラクタライズの結果、作成されたコントロールリグ階層

ユニティちゃんVer1.2のメッシュ階層

スケルトンとリグとメッシュ

対応

バインド

キャラクタライズ

Page 18: Making of ユニティちゃんステージデモ in ComicMarket 86

Mocapデータの流し込み

こちらに変更する

Page 19: Making of ユニティちゃんステージデモ in ComicMarket 86

ユニティちゃんVer1.2のスケルトン階層

ユニティちゃんVer1.2のコントロールリグ階層

ユニティちゃんVer1.2のメッシュ階層

Mocapデータのスケルトン階層

Mocapデータのコントロールリグ階層

キャラクタライズ

Mocapアニメーションデータ

ソース変更

スケマティックで見てみると

キャラクタライズ

バインド

Page 20: Making of ユニティちゃんステージデモ in ComicMarket 86

リターゲットパラメタの調整

主にReachでモデルの各関節の位置をMocapデータ側の関節の位置になるべく近づける。 L/R Elbow Reach、L/R Hand Reach T、L/R Hand Reach R、Chest Reach Tなど。 必要に応じてPullもReach同様に調整する。

Page 21: Making of ユニティちゃんステージデモ in ComicMarket 86

リターゲットパラメタの調整

Page 22: Making of ユニティちゃんステージデモ in ComicMarket 86

コントロールリグへのMocapデータのプロットCharacter Controlsメニューより Bake(Plot) to Control Rig実行 ⇒Sourceが、ユニティちゃんモデルのコントロールリグ側に変わる。

この結果、Mocapデータのアニメーションが、モデルのコントローラ側の値に移し変えられた(リプロットされた)ことになります。

Character Controlsメニュー

Page 23: Making of ユニティちゃんステージデモ in ComicMarket 86

ユニティちゃんVer1.2のスケルトン階層

ユニティちゃんVer1.2のコントロールリグ階層

ユニティちゃんVer1.2のメッシュ階層

Mocapデータのスケルトン階層

Mocapデータのコントロールリグ階層

キャラクタライズ

Mocapアニメーションデータ

コントロールリグへプロット

スケマティックで見てみると

キャラクタライズ

バインド

Mocapアニメーションデータ

Page 24: Making of ユニティちゃんステージデモ in ComicMarket 86

アニメーションレイヤーを使った調整

アニメーションレイヤー

タイムライン

必ずSnap & Play on Framesにする

現在編集中のレイヤー元のアニメーションのレイヤー

修正キーを打つレイヤーは Additiveにしておく

Page 25: Making of ユニティちゃんステージデモ in ComicMarket 86

アニメーションレイヤーを使った調整

随時クリップを送りながら、腕が身体に突っ込んでいるような不具合部分を修正する。手の置き位置などの修正は、修正したい箇所を挟むようにまずフルボディで2つキーを打っておき、その後で修正したいコントローラをなるべく少ないキーで修正する。

Page 26: Making of ユニティちゃんステージデモ in ComicMarket 86

アニメーションレイヤーを使った調整•初期位置(Tスタンス)での手や頭の角度などの最終調整。オリジナルアニメーションにアニメーションレイヤーを追加し、レイヤー上でモーションを微調整する。 •大きめの修正はIKで、細かい修正はローテーションでやるとよい。 •モーションによっては手足がフリップすることもある。その場合はフリップする直前にフルボディモードでキーを追加してやるとよい。 •フリップ確認には、元のモーションを横にずらして一緒に再生してやるとわかりやすい •細かいコントローラの使い方や、フルボディIKの使い方は、

http://www.slideshare.net/nyaakobayashi/bd-maya-ltcharaanime131128

Page 27: Making of ユニティちゃんステージデモ in ComicMarket 86

ユニティちゃんスケルトンへアニメーションをベイク

• コントロールリグでのモーションの修正が終わったら、モデルのスケルトンへモーションをベイクする • Character ControlsメニューよりBake(Plot) to Skelton実行 • ここまで終わったらFBXセーブし、MotionBuilderのStoryでモーションのカット調整に進める。

スケルトンへのベイクが終了するとSorceはNoneに、アニメーションレイヤーはBaseAnimationになる。

Page 28: Making of ユニティちゃんステージデモ in ComicMarket 86

Mocapデータを調整する「意味」

• 本番に近いモデルに割り当てることで、動きを再確認する"

• よりキャラにあった動きやポーズに修正する"• コントロールリグに30fpsでリプロットすることで、結果Mocapデータが、いわゆるヌルヌルの状態から、適宜サンプリングされることになる"

• 調整キーを追加することで、ポーズやアクションにメリハリが生まれる

Page 29: Making of ユニティちゃんステージデモ in ComicMarket 86

ダンスアニメーションFBXの組込用仕様

0 1 60 61 7221

Tスタンス

ウォームアップ ダンスモーション本編(30fps)

音楽IN

ダイナミクスが落ち着くまでの予備時間

このフレームは、MecanimのAnimation設定側で切り落とす

Page 30: Making of ユニティちゃんステージデモ in ComicMarket 86

Storyツールによるカット調整

Storyツールのタブ

新たにシーンに読み込んだアニメーションデータを含むFBXファイルをカットしたり、繋いだりして編集します

ここでアニメーションを流し込むキャラクターと、ボディマスクを選択します

新たにシーンに読み込んだアニメーションデータを持たないキャラクタライズ済みのユニティちゃんモデル

Page 31: Making of ユニティちゃんステージデモ in ComicMarket 86

Storyツールによるカット調整• MBで新規シーンを開き、Storyパネルに編集をしたいアニメーションの含まれているFBXをD&Dする • さらに割り当てるキャラクターモデルをアニメーションなしでシーンにマージし、Storyパネル上のCharacterに指定する。キャラクターモデルのソースがNoneならば、Storyに読み込まれているアニメーションで動く。 • シザーツールなどを使いながら、アニメーションクリップのカット(尺)調整をする。 • アニメーションのカット調整が終わったら、Story上で出力したいアニメーションを指定し、右メニューより Plot Whole Scene To Current Take で、空のTake1に出力する。

シザーツール

Page 32: Making of ユニティちゃんステージデモ in ComicMarket 86

残る作業 = Mocapでは出来ない作業

• ダイナミクス(揺れ物)設定"• 手の表現(エクスプレッション)"• 表情変化の指定"• 楽曲とシンクロする口パク合わせ

全部Unity上でやってしまう!

Page 33: Making of ユニティちゃんステージデモ in ComicMarket 86

Unity上でのセットアップⅢ.

Page 34: Making of ユニティちゃんステージデモ in ComicMarket 86

ダイナミクスの設定

• ユニティちゃんVer.1.2に付属する、SpringManager.cs、SpringCollider.cs、SpringBone.csを使う。基本設定は付属ドキュメントを参照。 • 今回のセッティングでは、ユニティちゃんを一定の場所から大きく動かさないので、胸周りのスプリングは柔らかめにしてあります(ntnyさんのこだわり) • 他、上着の裾周りのスプリング設定にこだわりがあります(ntnyさんのこだわり) • SpringBoneは全部で68個入っています

Page 35: Making of ユニティちゃんステージデモ in ComicMarket 86

Mecanim:アニメーションレイヤーを使った手のエクスプレッションの追加

• 手のエクスプレッション(表情)は、Mocapで撮るのは大変なので、こちらは3dsMax上で手付けをしています(ntnyさん) • Tスタンスで手のエクスプレッションのみが変化するアニメーション入りFBXファイルを作成し、Unity上でMecanimのアニメーションレイヤーで合成します。手はボディマスクでその部分のみ、アニメーションがOverrideされるようにします • ダンスが3種類あるので、ダンスのステート変移に合わせて同じモーションを別ステートとして登録してあります

Page 36: Making of ユニティちゃんステージデモ in ComicMarket 86

Mecanim:アニメーションイベントを使った顔のエクスプレッションの追加

• ユニティちゃんVer.1.2に収録されている、FaceUpdate.csに含まれている表情切り替え用イベントコールOnCallChangeFace()メソッドを、Mecanimのアニメーションイベントで呼び出します • 手のエクスプレッションを収録しているHandExpression.fbx内でアニメーションイベントを設定することで、同じFBXファイルで手と表情のエクスプレッションを同時変更します

Page 37: Making of ユニティちゃんステージデモ in ComicMarket 86

Mecanim:アニメーションイベントを使った音楽再生のタイミング合わせ

• こちらも同様にCandyRockStarモデルにアタッチされているMusicStarter.csのOnCallMusicPlay()メソッドをMecanimのアニメーションイベントからコールします • このアニメーションイベントは、ダンスモーションに合わせる必要があるので、ダンスモーションが含まれているFBXに、音楽開始のタイミングと停止のタイミングでイベントコールが設定されています

Page 38: Making of ユニティちゃんステージデモ in ComicMarket 86

楽曲とシンクロした口パク

• シーン内にLipSyncControllerというゲームオブジェクトがあり、それにアタッチされているLipSyncController.csが担当します。 • この手の演出は、楽曲と口パクをシンクロさせるデータをどれだけ正確に作るかがキモなんですが… • 今回はかなり力業で作りました(^_^;)。その代わり綺麗です(ntnyさんのこだわり)

Page 39: Making of ユニティちゃんステージデモ in ComicMarket 86

Advanced:IKによるLookAtシステム

Page 40: Making of ユニティちゃんステージデモ in ComicMarket 86

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デモで使われているようです

Page 41: Making of ユニティちゃんステージデモ in ComicMarket 86

Unityでの実装/DCCツールでの作業仕分けのポイント

• Unityで実装したほうが楽なデータは、Unity上でやってしまう!"

• 特に使い回しが多そうなデータは、DCCツール上で組み込んでしまうよりは、Unity上で合成したほうが楽"

• Mecanim/Humanoidは、極めて強力。モーション流し込みの柔軟性はMotionBuilder以上

Page 42: Making of ユニティちゃんステージデモ in ComicMarket 86

完成プロジェクトのひも解き方Ⅳ.

Page 43: Making of ユニティちゃんステージデモ in ComicMarket 86

Unityではシーン内のゲームオブジェクトに様々な コンポーネントをアタッチすることで、機能を実現します

ひとつのCandyRockStarゲームオブジェクトに たくさんのコンポーネントがアタッチされている。 これらの各コンポーネントが、それぞれに 指定された機能を実現している。 ⇒各コンポーネントがどのようにお互いを参照しあっているかの方法を理解すると、シーン構成がわかりやすくなる

Page 44: Making of ユニティちゃんステージデモ in ComicMarket 86

ポイントは各コンポーネント間の参照関係をどうやって知るか?

•詳しくはこちらの資料を参照。http://www.slideshare.net/nyaakobayashi/how-toinspectcompletescenes130618

•プラス、今回はアニメーション関連のコンテンツなので、各LateUpdate()イベントにも注意する。細かいキャラクターの追加制御は、LateUpdate()内で行ってます

Page 45: Making of ユニティちゃんステージデモ in ComicMarket 86

クラスとコンポーネントをガレージキットで例えてみよう!

原型 シリコンゴム型 キャスト注入 製品

画像は、Wonder Festival オフィシャルサイト『ガレージキットとは』よりhttp://wf.kaiyodo.net/knowledge/garagekit/

上が超簡単に説明した、ガレージキットの製作の流れ

Page 46: Making of ユニティちゃんステージデモ in ComicMarket 86

Class / type / Instantiate / Componentの関係

原型 シリコンゴム型 キャスト注入 製品

クラス オブジェクトインスタンス化

GameObjectにアタッチすることで実体(インスタンス)化できるクラス

⇒コンポーネント

コード本体 タイプ(型)

画像は、Wonder Festival オフィシャルサイト『ガレージキットとは』よりhttp://wf.kaiyodo.net/knowledge/garagekit/

※自分で書いたスクリプトも、もちろん含まれる

Page 47: Making of ユニティちゃんステージデモ in ComicMarket 86

ポストとメモリのカンケイ??

Page 48: Making of ユニティちゃんステージデモ in ComicMarket 86

ポストとメモリのカンケイ??ポスト •ポストには目的に応じて様々なタイプがある •各々のポストには、住所がひも付けられている •ポストを使いたい場合、まずポストを設置し、郵便局に住所登録をしておく必要がある •ポストに何か届けたい時には、届けものに正確に住所を指定する必要がある

ポスト⇒メモリと読み替えてみると…?

Page 49: Making of ユニティちゃんステージデモ in ComicMarket 86

コンポーネント (GameObjectにアタッチされて

実体化したクラス)

ポストの用途やサイズ等(タイプ)を事前に決めて、設置する⇒「コンポーネント参照用変数を宣言する」

ポストの住所を指定して、郵便物等を送る/受け取る/利用する⇒「コンポーネントを参照する」

コンポーネント参照のための手順

Page 50: Making of ユニティちゃんステージデモ in ComicMarket 86

他にも、「カプセル化」「多態性」「継承」「オーバーライド関数」「ドットシンタックス」「名前空間」「スコープ」とか、いろいろあるけど、それはまたどこかで(^_^;)

UnityのC#コーディングで、ビギナーが迷いやすい

のは、「Unity向けのスクリプトをC#の文法で書い

ている」というトコじゃないかなっ?そこを「Unityならではのライブラリ機能」と、

「C#が元々持っている文法やライブラリ機能」を 意識して区別する練習をしてみると、コーディング

が急に楽になるよっ!

Page 51: Making of ユニティちゃんステージデモ in ComicMarket 86

Q&A