テラシュールブログ

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

【Unity】アニメーションと物理演算を連動させる 5.6以降

以前、アニメーションと物理演算を連動させる方法について紹介しましたが、Unity 5.6でもっとシンプルになりました。

tsubakit1.hateblo.jp

Animate Physicsなる機能

Unity 5.6のアップグレードガイドを眺めていると、少し気になる項目がありました。

docs.unity3d.com

Animate Physics: Rigidbodies attached to objects where the Animator has Animate Physics selected now have velocities applied to them when animated. This will give correct physical interactions with other physics objects, and bring the Animator in line with the behaviour of objects animated by the Animation Component.

This will affect how your animated Rigidbodies interact with other Rigidbodies (the Rigidbodies are moved instead of teleported every frame), so make sure to verify that your Animators with Animate Physics are behaving as you expect.

 

つまり、どういうことだってばよ

アニメーションの動きを物理演算で動くオブジェクトに伝える

どうも、アニメーションの動きを物理演算に伝える機能のようです。

例えば、下のように「上に急速に動く」地面の上に物を載せると、放り投げられたようにキャラクターが上にすっ飛びます。

この動きは、明らかに「テレポート」で動いておらず、確実に動きを追随してるように見えます。

f:id:tsubaki_t1:20170403220811g:plain

同様に、動いているプラットフォームの上に物を乗っけてみます。ちゃんと乗れば上手く運んでくれました。

f:id:tsubaki_t1:20170403221145g:plain

もちろん3Dでも動作します。

f:id:tsubaki_t1:20170403221922g:plain

やり方

やり方は簡単です。

  1. Animatorコンポーネントを追加する
  2. Animatorコンポーネントの子、もしくは同オブジェクトにRigidbodyを付ける
  3. Update modeをAnimate Physicsに設定する

f:id:tsubaki_t1:20170403222155j:plain

重要なのは、Animatorが動かすものにRigidbodyが付いている事と、Update ModeがAnimate Physicsになっている事です。

これで自由にモデルを放り投げる事ができそうです。

念願の動く床のプラットフォームゲームが出来ない

さて、これで動く床が出来そうに思いますが、実際自分もソレを夢見てましたが、そうは問屋がおろしませんでした。

物理演算の値を受けているハズなのに、明らかに滑っていきます。

f:id:tsubaki_t1:20170403223010g:plain

それもその筈で、Unityが標準で提供しているPlatformarCharacter2DやThirdPersonCharacterのコンポーネントは、RigidbodyのVelocityを上書きする事で移動しています。
このため、Animate Physicsがいくら値を設定しても上書きされ、滑ってしまうという訳です。

 

逆を言えば、ちゃんとRigidbodyの値を使っていれば物の上に乗れるという訳です。

例えば、適当ですが下のようにVelocityを残してやれば、プラットフォームに乗って動くようになります。

f:id:tsubaki_t1:20170403224206j:plain

f:id:tsubaki_t1:20170403224004g:plain

ただ、加速度が移動について回ってしまうので、2Dであって欲しい「キビキビした動き」は失われますので、その辺りも含めて調整する必要がありそうです。

関連

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp