2017年8月17日

Unity InputはTimeScaleの影響をうける


時間停止中の入力処理で少しだけひっかかったのでメモメモ…



ゲーム全体の時間の流れを簡単に変更したい場合はTime.timeScaleの値を設定するのが便利ですよね。timeScale = 0にすれば時間が停止し、timeScale = 1にすれば元の時間の進み方に戻ります。さらに時間が停止した状態でもオブジェクトを動かしたいのであれば、Time.deltaTimeのかわりにTime.unscaledDeltaTimeを使い、timeScaleに依存しない処理にする…というのがありがちな方法ではないでしょうか。

しかし、この方法で時間を停止した場合、Input.GetAxisを使って入力を受け取っていると予期しない動作になることがあります。というのは、どうやらInput.GetAxisはtimeScaleの影響をうけているっぽいからです。UnityのInputクラスには、InputManagerで設定できるGravityやSensitivityの値に応じて「入力値を徐々に変化させる」という機能が実装されています。

InputManagerで設定可能

このスムーズに値を変更する処理がtimeScaleの影響をうけているらしく、Input.GetAxisで取得した値はこんな感じになります。


Time.timeScale = 1のときはなめらかに遷移していたのに、Time.timeScale = 0になった瞬間に毎フレームひたすら同じ値を返しています。これはマズい…

そんなときに役立つのがInput.GetAxisRawです。名前に"Raw"とついているとおり、余計な処理をしていない"生の"入力値を取得することができます。


Time.timeScale = 0になっても問題なく入力値が変化しています。ただし、ボタンの応答速度をなめらかにする処理がなくなってしまうため、キーボードやボタン操作だと-1か0か1しか返さないみたいな状態になるので注意。Input.GetAxisUnscaledとかがあれば便利なのにな~。

0 件のコメント:

コメントを投稿