この記事について
この記事は自分の備忘録的な内容です。
やりたい事
Unityで一時停止ができるようになりたい。
その中で、TimeScale=0;というやり方についてまとめておきます。
結論
- TimeScale=0にすることでゲーム進行を止めることができる
- 止めたくない処理はUpdate関数に、止めたい処理はFixedUpdate関数に入れる
- Update関数の処理を止めたい場合にはdeltaTimeを掛ける
TimeScaleとは
Time.timeScaleは時間の経過速度です。
1が基準となって、1よりも小さいと時間経過が遅くなり、1よりも大きいと時間経過が早くなります。
試しに左右の壁にぶつかり続けるボールを用意してその速度を変えるボタンを用意してみました。
なるほどこれで一時停止が作れるね!!!
とはいきませんでした。
不完全な点
まず、この時間を停止させる方法ですがUpdate関数は生きています。
全てが動作不可になると何もできなくなりますからね(メニュー画面を開くとか元に戻すとかができなくなると意味がない)。
これにより動かなくなるのは時間が関係する処理です。
- FixedUpdate関数内の処理(決められた時間間隔で実行されるUpdate関数)
- Rigidbodyを利用した処理全般
- アニメーション(回避方法あり)
なのでUpdate関数内でpositionを操作することで移動している場合、timeScale=0にしても動くことが可能な状態になってしまします。
CubeMoveManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CubeMoveManager : MonoBehaviour
{
public float speed;
// Update is called once per frame
void Update()
{
var pos = transform.position;
if (Input.GetKey("right"))
{
pos = new Vector3(pos.x + speed,pos.y,pos.z);
}
if (Input.GetKey("left"))
{
pos = new Vector3(pos.x - speed,pos.y,pos.z);
}
transform.position = pos;
}
}
この状態を避ける方法はとりあえず二つ挙げておく。
- FixedUpdateに変更する
- 移動スピードにdeltaTimeをかける
注意点
timeScaleの設定はシーンをロードしてもそのままの状態になるので、シーンを遷移する際には必ずtimeScale=1に設定し直すこと。