テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】AnimationControllerを用意せずAnimatorによるアニメーションを使う

f:id:tsubaki_t1:20170802223713g:plain

Playable APIを使用してアニメーションをAnimationController無しで制御します。

大量のアニメーションとAnimationController

Animation Controllerは、キャラクターのアニメーション制御を行う上で便利な機能です。上手く作れば、キャラクターの状況を流し込むとキャラクターが現在取るべきアニメーションを取ってくれる…といった事が期待出来ます。

http://cdn-ak.f.st-hatena.com/images/fotolife/t/tsubaki_t1/20151221/20151221025751.jpg

 

とは言え、上手く使いこなせないと面倒なシステムでもあります。所謂ステートマシンのスパゲティ状態や、大半のアニメーションが単一のステートを指すような状態になると、非常に管理が煩雑な状態になるかもしれません。

また大量のAnimation Controllerがプロジェクト内に氾濫するといった事も起こります。

http://cdn-ak.f.st-hatena.com/images/fotolife/t/tsubaki_t1/20151220/20151220110821.jpg

 

これについて、以前AnimationControllerを散らさないアプローチについての記事を書きましたが、Unity 2017.1よりPlayable APIがちゃんと使い物になったので、不要になりそうです。

tsubakit1.hateblo.j

Playable APIとは何ぞや

Playable APIについてはコチラ

tsubakit1.hateblo.jp

Playable APIでAnimationっぽい事をしたい

Playable APIでAnimationっぽい事をします。

完全にAPIを模倣するというよりは、AnimationController無しにAnimationClipやAnimation Nameを指定したら再生するといった事を実現する事が目標です。

上手く行けば、本記事トップのGifアニメのようなボタンを押したらアニメーションを再生する的な事が実現出来ます。

ソースコード

コードはこんな感じです。

gist.github.com

Cross Fadeでアニメーションをフェードしながら切り替えます。アニメーション名を指定する場合は事前にClip Listに登録が必要です。AnimationClipを直指定する場合はClipListに登録する必要はありません。

Playはアニメーションをフェードせず切り替えます。主に2D用です。

  • CrossFade (AnimationClip clip);
  • CrossFade (string animation);
  • Play (AnimationClip clip);
  • Play (string animation);

なお、ClipListには最低一つのAnimationClipの登録が必要です。

f:id:tsubaki_t1:20170802225713j:plain

サンプル

使い方です。

f:id:tsubaki_t1:20170803115442g:plain

まずAnimatorの設定されてるモデルと同じGameObjectにSimple Animatorを登録します。その際、AnimatorのAnimation Controllerは必ずNoneにします。

AvaterやUpdate Mode、Culling ModeはAnimatorのパラメータが使われます。必要に応じて設定します。

f:id:tsubaki_t1:20170802225935j:plain

 

Clip Listに最低一つのAnimationClipを登録します。
AnimationClip名で再生するアニメーションを切り替えたい場合は、切り替えたいAnimationClipを全て登録します。

f:id:tsubaki_t1:20170802230202j:plain

 

後はSimpleAnimator.CrossFade( "animationclip名"); 等を実行すれば、アニメーションを再生してくれます。これはAnimationClip名ですが、AnimationClip直再生でもOKです(その場合はClipListに足す必要はありません)

gist.github.com

また、EventSystemからも呼べます。
ボタンを押したらアニメーションとかは、コレが楽かもしれません。

f:id:tsubaki_t1:20170802235356j:plain

 

問題

  • アニメーションの編集には使えません。
  • Playable APIの問題を引き継ぎます

【Unity】「PlayMakerによる初めてのUnityプログラミング」

f:id:tsubaki_t1:20170801230425j:plain

Playmakerに関する良い感じの資料が公開されたのでメモします。

Playmaker…一体何藤木遊作なんだ…

PlayMakerによる初めてのUnityプログラミング

件の資料はコチラ

www.slideshare.net

Playmakerの紹介からRoll a Ballを作成するワークショップまで

内容は先日のUnity道場PlayMakerによる初めてのUnityプログラミングの内容で、

  • Playmakerの紹介
  • Playmakerのインストー
  • 基本的な操作方法

から始まり、最終的には

といった内容みたいです。

www.youtube.com

実際のチュートリアルを操作後、このドキュメントを進めれば差分的な感じでPlayMakerがどういった物か分かりそうです。

関連

unity3d.com

【Unity】Cubeを跳ねさせる

f:id:tsubaki_t1:20170731002426g:plain

今回は小ネタというか、やってみたと言うか…豆腐を跳ねさせるという内容です。

Cubeだって跳ねる

ゲームの仮素材ランキングがあるとしたら、多分ブッチギリで人気No1はCubeでしょう。かのスプラトゥーンですらプロトタイプはCubeだったと聞きます。

つまりCubeには無限の可能性があります。ならば、Cubeは跳ねる事が可能なハズです。

とりあえず、跳ぶ!

とりあえずアニメーションでCubeを跳ねさせてみます。

初期値点から一定時間で最高高度へ、そして一定時間で初期値点へ。リニアな移動です。

f:id:tsubaki_t1:20170731002835g:plain

f:id:tsubaki_t1:20170731002922j:plain

か、硬い…!

跳ねてると言うより、上から吊るして持ち上げてると言った方がシックリくるレベルの動きです。

カーブを付ける

跳ねる動きを考えてみます。

基本的にジャンプする瞬間は最高速度で上へ移動し、段々と重力に引かれて減速、最終的に初期加速より重力が勝って落下を開始して、最後に着地…という流れです。

f:id:tsubaki_t1:20170731003448j:plain

f:id:tsubaki_t1:20170731004256g:plain

f:id:tsubaki_t1:20170731004112j:plain

大分ジャンプしてる感が出てきました。

通常のキャラクターならこれでも十分なのですが、Cubeでジャンプだとまだ十分ではありません。なぜならCubeにはモーションが無いからです。

豆腐はフルフルする

Cubeにモーションを設定してみます。

しかしCubeには関節はありません。ならばどうするか…Scaleを使います。

Cubeのような物がジャンプするには、どんなモーションが必要か。

  • 平べったくなり力を溜める
  • 反動で上に跳ねる(縦に伸びる)
  • 縦に伸びた反動でフルフルする
  • 落下開始
  • 地面に着地した衝撃でぺたんこになる

f:id:tsubaki_t1:20170731004828j:plain

f:id:tsubaki_t1:20170731004842j:plain

これで跳ねます。
単純なScaleですが、タイミングを調整することで何というか見ていて気持ちのよい感じの動きになったんじゃないかなと思います。

f:id:tsubaki_t1:20170731005119g:plain

頂点単位でモーフしたい?うるせぇ豆腐ぶつけんぞ

 

という事で、異世界転生したらCubeだって勇者を目指せる話でした。

…言語チート欲しい。英語に対応してるやつ

関連

www.youtube.com

【Unity】Playable APIで幾つかの小技

昨日のPlayable APIで書ききれなかった事を少し追記します。

tsubakit1.hateblo.jp

複数のAnimatorに単一のPlayableを流し込む

PlayableGraphにOutputは実は複数作ることが出来ます。コレを利用すると、複数のオブジェクトを完全に同期した状態でアニメーションさせる事が出来ます。

f:id:tsubaki_t1:20170730124159j:plain

またOutputでアニメーションを流し込んだ場合でもアバターはAnimator毎に制御されているので、Humanoidならボーン構造の異なる物でもアニメーションが可能です。

アニメーションのコストがかかるのはスキニングの部分なので大した意味はありませんが、何かに使えるかもしれません。

f:id:tsubaki_t1:20170730123706g:plain

AnimationClipPlayableが共通化されているので、一つのAnimationClipPlayableを操作すれば一気に複数のアニメーションが制御出来るのは中々に面白いです。

逆を言えば、少しずつタイミングをズラしたようなアニメーションは出来ない点には注意が必要です。

f:id:tsubaki_t1:20170730124714g:plain

gist.github.com

アニメーションの出力先を切り替える

outputは出力先を切り替えることも出来ます。

例えばキャラクターが選択された際のモーション等があった時、キャラクター一人ひとりにPlayableGraphを作るのはナンセンスなので、PlayableGraphだけ作って出力先を切り替えてしまう訳です。

f:id:tsubaki_t1:20170730130343j:plain

なお、Output出力先を切り替えてもアニメーションは最初から再生される訳ではありません。最初から再生したい場合は、PlayableのTimeを0に戻す等の操作が必要そうです。

f:id:tsubaki_t1:20170730130658g:plain

gist.github.com

Aditiveの再生

ギミックを動かす等を行う時、Aditiveで動かせると一々親オブジェクトを用意しなくても良いので何かと便利です。

Playable APIの場合、AnimationLayerMixerPlayableにAditiveのオプションがあるのでソレを使用します。

f:id:tsubaki_t1:20170730134049g:plain

gist.github.com

tsubakit1.hateblo.jp