テラシュールブログ

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

Unityでスローモーション

ゲームを作る上でスローモーションを行いたくなるケースがある。
その場合はUnityでストップやスローモーション・早送りを実現するにはのように、Time.timescaleで時間を停止・加速させてしまうのは手っ取り早い。少なくともAnimationで挙動を制御している場合。

しかし、rigidbody等のような異なる時間軸で動作する物がある場合は一緒にInterpolateを設定しておくことをお勧めする。

まず、普通にボックスsを吹っ飛ばすシーンがあったとする。

nomal crash
これを単純にTime.timeScaleだけで処理すると、以下のようになる。要するにガクガクになる(以下のGIFは60FPSで撮影)。スローで再生しているのだが、ブロックが明らかに飛んでしまう。

nomal slow
そこでInterpolateを使用した版。比較すると、スムーズにブロックが吹っ飛んでいるのがわかる。撮影自体は上のGifと同じだが、最後のスローモーション再生から通常再生に戻る所はかなり自然に見えると思う。

nomal slow2
Interpolateはrigidbody2dにもrigidbodyにもある。

スクリーンショット 2014-07-13 1.02.40

ちなみに負荷はコレの比ではないけど、Time.fixedDeltaTimeの値を大幅に減らす(rigidbodyの計算回数を跳ね上げる)場合でも、似たような効果が得られる。こっちは全てのrigidbodyに設定しなくても良いので作るのは楽。
(ただ計算回数を跳ね上げるって事は負荷が超高いって訳で。モバイルとかは逆に減らす方に舵を取ると電池・パフォーマンス面で嬉しい事になるかも)



一週間で1本ゲームを作る #Unity1Weekで思いついたネタ。
とりあえず今は「カブトのクロックアップ・クロックオーバー的な事して光を避ける」感じのゲームを作ってたけど、思ってたより面白く無いので他のゲームを考え中。むむむ