Unityの一時停止で止まるもの、止まらないもの【Time.timeScale】
▶
【Unity】3Dアクションゲームを作ろう!#7 ステージの作成(Skybox・落下判定)
▶
【Unity】3Dアクションゲームを作ろう!#8 ステージの作成(スイッチ・扉)
▶
【Unity】3Dアクションゲームを作ろう!#9 プレイヤーのHP管理
▶
【初心者Unity】JsonUtilityクラスでJSONを扱う方法
▶
【初心者Unity】スクリプトからコンポーネントを追加する方法
Unityの一時停止で止まるもの、止まらないもの【Time.timeScale】
Unityにおける一時停止といえば「Time.timeScale = 0 」ですが、いざ止めてみたらなんか動いてるやつがいるぞ…。
なんてことありませんか?そんなときはTimeScaleの使い方をもう一度確認してみましょう。
Time.timeScale は時間の経過をスケールするためのプロパティです。
時間に依存しない処理は「止まらない」場合があるため、そこらへんをしっかり把握する必要があります。
[Unity_317×90]
止まらない例①
いくつか例を見てみましょう。
例えば、以下の処理は「Time.timeScale = 0 」で止まりません。
void Update() { Debug.Log("止まるのか?いや、止まらない!"); }
一方、こちらの場合は止まります。
void FixedUpdate() { Debug.Log("止まります!"); }
つまり
・Update関数は、「Time.timeScale = 0 」にしても止まりません。
・FixedUpdate関数は、「Time.timeScale = 0 」で止まります。(関数が呼び出されない)
そもそもUpdateが止まっちゃったら、入力すら受け付けなくなっちゃうので、timeScaleを1に戻せないですよね。
止まらない例②
もう一つ例を見てみましょう。今度は両方ともUpdateでの処理です。
こちらの処理は止まります。
void Update() { GetComponent<Rigidbody>().velocity = new Vector3(1.0f, 0, 0); }
Rigidbodyへの操作はフレーム経過時間が加味されるため、Update内に記述しても止まります。
※本来、物理演算はFixedUpdateへの記述が推奨されていますが、今回は突っ込まない方向で。
※また、Update内でGetComponentをしていますが、本来はStart()内でやる方が良しです。
一方、こちらの処理は止まりません。
void Update() { transform.Translate(1.0f, 0, 0); }
上記のTransformへの操作は、上記の記述ではフレーム経過時間が加味されていないため、止まりません。
そもそも、Update内における描画に影響するような操作(座標の変更など)は、実行環境によるフレームレートの違いを補えるように、フレーム経過時間を加味した記述にすべきです。
したがって、止めるためには以下のように記述します。
void Update() { transform.Translate(1.0f * Time.deltaTime, 0, 0); }
このように記述しておけば、移動量に前フレームからの経過時間が乗算されるため、「Time.timeScale = 0」となった時にちゃんと止まります。
まとめ
「Time.timeScale = 0 」による一時停止は
・Updateは止まる。
・FixedUpdateは止まらない。
・Update内でも、時間を加味していない処理は止まらない。
・物理演算はどこに記述しても強制的に止まる。
以上のことを踏まえたうえで、効率的に利用してきましょう。
▶
【Unity】3Dアクションゲームを作ろう!#7 ステージの作成(Skybox・落下判定)
▶
【Unity】3Dアクションゲームを作ろう!#8 ステージの作成(スイッチ・扉)
▶
【Unity】3Dアクションゲームを作ろう!#9 プレイヤーのHP管理
▶
【初心者Unity】JsonUtilityクラスでJSONを扱う方法
▶
【初心者Unity】スクリプトからコンポーネントを追加する方法
ゲーム制作関連のオススメ連載リンク
とっても手軽なゲーム制作体験!
Unityゲーム開発基礎
実際のリリースゲームを題材にしたハンズオンゲーム制作連載
実践unityゲーム開発