Time.timeScale に左右されない時間を使う【Tips】

ども、ゴコーです。

前回明言したとおり、マイク・スクローラーに使った小技をいくつか紹介しておきます。

今回は時間の部分です。

マイク・スクローラーは

時間停止(Time.timeScale = 0)

通常再生(Time.timeScale = 1)

時間停止(Time.timeScale = 0)

という順番で進行していきます。

知らない人のために

Time.timeScale というのは、簡単に書くとゲームの進行速度です。

ゲーム内時間は Time.timeScale =1の時、通常通り移動したり、アニメーションしたり、落下したりします。
これが 「0.5」 の時は移動速度、アニメーション速度、落下速度などは全て半分になり、「0」の時は完全に止まります。

しかし、最後のゲームオーバー画面では上記のように Time.timeScale を 0 にしているのに uGUI のテキストが動いています。
これは、

Time.realtimeSinceStartup

を使用して自前でデルタ時間を計算しているからです。

Time.realtimeSinceStartup

Unityで扱える時間にはいくつか種類があります。

Time(公式):http://docs.unity3d.com/ScriptReference/Time.html

例えば、

time … ゲームが始まってからの経過時間
deltaTime … 直前のフレームを処理するのにかかった時間
fixedDeltaTime … 物理挙動に使用するフレームレートの更新する間隔

などですね。
そして、これらは前述のように Time.timeScale の影響を受けて挙動速度を0倍から1倍まで変化させます。

…ただし、 Time.realtimeSinceStartup だけは違います。

この変数は、ゲームの実行が始まってから現実で実際に経過している時間を記録しています。

それを使っていつも使っている Time.deltaTime のようなものを計算して利用しました。

以下が該当部分です。

Time.timeScale が 0 だから Update() が呼ばれない、ということはありません。
Update() で呼ばれても動けないだけです。
移動は関係無いので、計算はあくまで Update() 内で行います。

実際に使う時には以下のような感じになります。

例えば、

他のオブジェクトは Time.timeScale 半分だから移動速度も半分だけど、自分はリアルタイム使ってるからクロックアップしてるみたいだぜ!

みたいなこともできそうですね。
その代わり、このリアルタイムを使ってるオブジェクトは当然 Time.timeScale で止まれないので、逆に一時停止を別で作ってやる必要が出てきます。何事にもメリットデメリットがあるものです。

次回は久しぶりにユニティちゃんの2Dアクションチュートリアル進めます!

では、また。

Comments

comments

スポンサーリンク
336*280px