2014年12月23日火曜日

Candy Rock Star をさわってみた#05 ~ ユニティちゃんのアニメ連動移動制御

Candy Rock Star を題材にユニティちゃんディレクター杯に参加しました。
投稿後、作品制作過程での諸々をメモ。



投稿作品ではユニティちゃんは3体出していますが、個々に個別の移動制御をしています。
(投稿作品: 【画質向上版 】ユニティちゃん3人で踊ってもらった



■開発環境/ツール

Windows7x64
Unity 4.6.0f3


※Unity及び関連の機能を全て把握してるわけではない為、技術的な間違いを含む可能性もありますので注意です、念の為。



■ダンス・アニメーション

移動の話の前にまずアニメーションについて。

ダンスのアニメーションはCandy Rock Star のプロジェクトの中に3種存在しています。
(/Assets/UnityChan/Animations/C86unitychan_~)

オリジナルのプロジェクトをUnity上で再生し「CandyRockStar(Clone)」モデルを選択&Animatorウィンドウを見ると、
  • 001_SAK01_Final
  • 002_SIM01_Final
  • 003_NOT01_Final
の3つの遷移設定が見えます。
実際にはデフォルトの「002_SIM01_Final」が最初から最後まで再生されています。
オリジナルでは他の2つのダンスは再生していないようで、素材として用意されているのかなと思いました。


今回の投稿作品では他の2種のダンスも活用しています。

センターのユニティちゃんはデフォルトのダンスアニメーション「002_SIM01_Final」を使用。
他の2体のユニティちゃんには他2種のダンスアニメーションで踊るようにしています。
ですので3体とも終始異なるダンスを踊っています。
他の2つのダンスはメインのダンスと絡むように見える動きもあり、それらを生かす感じでディレクションを心がけました。 
(結構な時間この3種のダンスは並列再生してガン見してました(笑;)



■Root Motion

再生中の「CandyRockStar(Clone)」を選択してInspectorを見ると、Animator欄の「Apply Root Motion」にチェックが入っています。

このチェックが入っているとアニメーションによる前後左右の3D座標移動が有効になります。
もしこれを外すとダンスはその場でのみ踊るようになり位置移動をしなくなります。
つまりユニティちゃんが元気にステージを走りまわらなくなります。

このアニメーションの位置移動は外部ツールでアニメーションを作成する際に決定されているので、Unity上ではいじれません。
(と思いますが、何か手があったりするのかな・・・とかちょっと気になりますけど。




■ダンスフォーメーション

3体のユニティちゃんを横に並べて3種のダンスをそれぞれで再生。概ねいい感じに踊ってくれます。
しかしちょっと相互にニアミス気味な時があり微調整をしたい感じ。

時間的に迷うとこでしたがやはり調整を加えたい。ついでにちょっと野望もあるので(謎。
そこで位置移動を加えるにあたり2つの案が浮かびました。
  1. ダンスアニメーションを修正する。
    最も正攻法(?)。ダンスアニメーションを外部ツールで修正し再度Unityにもってくる。しかしこれはなんらかの方法でアニメーションをUnityからエクスポートしないと加工できない気がします。
    元は多分Mayaあたりで作られてるのでは?と思うので、その元データが無いと難しそう(どのみちMayaは無いけど!BVHならあるいは・・・
    ひょっとするとUnityのアニメーションをBlenderに持ち込む方法もあるかもしれませんが、締め切りまで時間もあまり無い状況でコンバート関係で時間を費やすのは得策ではないと判断。

  2. iTweenを使って駆動
    みんなダイスキiTween♪
    これでお手軽に駆動できるんじゃないかと思ったら少し甘かったです。
    しかし結局これで実装しました。



■iTweenで駆動

Root Motion が有効になっているので、アニメーション再生によりユニティちゃんは前後(Z)左右(X)上下(Y)に移動します。
つまりアニメーションで3軸が変動します。


普通にiTweenで駆動するとアニメーションによる軸移動とで相互に位置座標を上書きしようとする為、おかしい動きになります。

そこで「現在の座標」に対してオフセット(相対移動)で駆動すればそれっぽい動きになるだろうと考えました。

ここで問題点が。

iTween での相対移動指定の方法がわかりませんでした・・・。
何か方法があるのか、本当に機能上できないのか1~2時間程度ネットで調べても判明せず。

時間が勿体ないのでやむなくiTweenのコールバックを使い自前で相対移動を実装しました。
(参考: Unity - iTween メモ

当初この方法をすぐ採用せずiTweenの機能(&オブジェクトの本来(?)の基準座標位置を得る方法も)を探した理由は、単純に実装すると相対移動による累積誤差で徐々にずれていく可能性を危惧した為です。
誤差分を要所で減らす工夫もできそうですがゼロにはできないだろう、と。

しかしもはや時間も無いのでこれでいけるとこまで実装してみるしかない。累積誤差がでたら各イベント制御側の移動量指定分に補正量も埋め込んでいくしかないという考えで。

結果的にステージ上では全くわからないので、今回の用途では誤差分は心配する程のことではなかったようです。

※後にして思えば、アニメーション駆動の親オブジェクト内に子オブジェクトを入れて、子のローカル座標をiTweenで駆動すれば誤差無しで制御できるような気がしました。
ということは、CandyRockStar(Clone) はAnimator駆動のままで、その中の Character1_Reference のローカル座標をiTweenで駆動してやれば良かったのかも・・・。





■その他こもごも

そんなわけで3体のユニティちゃんはダンスアニメーションに対して、さらに3軸相対移動が可能な実装がされています。

と、いうことはユニティちゃんは上下方向にも動けるってことです。と、いうか動かしたかったので。
(ゲーム開発プラットフォームなUnityなわけですし、キャラクタ移動制御くらいできないでどうする・・・ですよね)


冒頭0:26付近でセンターのユニティちゃんが右手を振り上げて小ジャンプするシーンがありますが、ここで上方わずかに相対移動でジャンプ分をブーストしています(地面からより離れています)。
カメラアングルが足元を写してないのでわかりにくですが・・・;
(最終的に左のユニティちゃんとの被写界深度のカメラ焦点遷移を優先したアングルにしたので・・・;)



この小ジャンプをより演出する為に、0:23からのスピン後のバックステップでも後方に相対移動を追加。そこから前方へ戻る際も相対移動追加で勢いよくステージ手前へ移動、先の小ジャンプにつなぐようにしています。

0:32付近のバンザイしてるところが左右のユニティちゃんよりもセンターのユニティちゃんが高く飛ぶのでわかりやすいです。ここでも上方に相対移動させてます(その後すぐ下方に移動も)。



他、前後、斜め一列などのフォーメーションは元のアニメの動きに対して違和感ないような(バレないようなw)タイミングでこっそり相対移動させています。
(一応カメラで全景を写しても違和感ないように移動はつないでます。後でニコニ立体に視点変更可にして上げようかなと思っていたので。しかしバイナリサイズ制限があったとは・・・)

これらのタイミングをイベント化する作業が地味に大変でした。


個々の制御は自前の時間経過によるイベント発行部から、iTween駆動部へトリガーを与えて開始。
iTween駆動部には「指定時間内に指定の相対距離を移動」というパラメータを与えて制御を行っています。

非常に原始的な方法なので、ジャンプ上りと、ジャンプ下りは別イベントです。つまり数フレーム単位でイベント発生を人力で組んでいます。

つまり最終的なイベント発生タイミングの調整が大変な作りです;
※とにかくシステムとしてまずは稼働させないと締め切り時間が~なので。イベントタイミング作成は最悪物量=時間次第(1日は24時間!)なので気合で!な方針で(苦笑


ユニティちゃん3体のダンスフォーメーションはこれで駆動しているのでイベント発生タイミングと移動量、速度の調整は、やはり予想通りそれなりに時間を費やすこととなりました;

しかし最低限の移動の自由度は確保できたのでやはり実装おいて良かったと思います。
最終調整段階で動画の出来映えに(私的な満足度的には)関係する要素のひとつになっていたと思います。

0 件のコメント:

コメントを投稿