Unityでのポーズ処理の実装

前提知識

Time系のまとめ

割と網羅されていて、timeScaleとの関係がわかりやすかった参考サイト

Time.timeScaleについて

時間の経過をスケールする。
1fで通常。2fで2倍速。0.5fで1/2速(つまりスローモーション)、0fで停止。
0fにするとFixedUpdate()が実行されなくなる。

Time.deltaTimeについて

基本的には前のフレームから今のフレームまでの経過時間。
ただし、FixedUpdate()内で使うと、Time.fixedDeltaTimeと同じになるので注意。

timeScaleに依存しているので、timeScaleを0fにすると、deltaTimeも0になる。

参考:https://dkrevel.com/time-deltatime/

Time.frameCountについて

経過したフレーム数の合計。
Update関数で使うと毎フレーム1ずつ増える。

timeScaleに依存しないので、timeScaleで0fを設定しても、frameCountの値は毎フレーム増えていく。
なので、Update()内で移動処理としてframeCountとか使っていると、timeScaleで0fにしても移動し続けるので注意。

SetActive()について

※調査中

Update()とLastUpdate()とFixedUpdate()の違いについて

Update・・・毎フレーム呼ばれる基本処理を書くところ
LateUpdate・・・様々な計算が終わった後の最終調整を書くところ
FixedUpdate・・・物理演算に関係する処理を書くところ(ゲーム内時間に関係するもの)

基本的な使い分けとして、キー入力が絡む処理はUpdateに書いた方がいい。具体的には移動処理とか。
一定間隔で呼び出されるFixedUpdateに書いてしまうと、タイミングによって入力を検知できなくなる。

参考:https://dkrevel.com/unity-explain/update-fixedupdate-lateupdate/

基本

Time.timeScale = 0f;
でポーズ。
Time.timeScale = 1f;
で再開。

応用

「基本」の止め方だと、FixedUpdateに書かれた処理は止まるが、Updateに書かれた処理は止まらない。
Updateに書かれた処理を止めたい場合は、Update関数の最初に下記を追加してポーズ中かどうかを判定する。

        // ポーズ中なら何もしない
        if (Mathf.Approximately(Time.timeScale, 0f))
        {
            return;
        }

 

参考

https://gametukurikata.com/program/stop

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です