Time.timeScaleの値を設定することで再生の速度を変えることができます。
Update(), LateUpdate(), FixedUpdate()のそれぞれについてtimeScaleの影響を確認してみました。
ボタン制御用スクリプト
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
using UnityEngine; using System.Collections; public class Controller : MonoBehaviour { UIButton _buttonPause; UIButton _buttonSlow; UIButton _buttonPlay; void Awake() { _buttonPause = GameObject.Find("ButtonPause").GetComponent<UIButton>(); EventDelegate.Add(_buttonPause.onClick, onClickButtonPause); _buttonSlow = GameObject.Find("ButtonSlow").GetComponent<UIButton>(); EventDelegate.Add(_buttonSlow.onClick, onClickButtonSlow); _buttonPlay = GameObject.Find("ButtonPlay").GetComponent<UIButton>(); EventDelegate.Add(_buttonPlay.onClick, onClickButtonPlay); } public void onClickButtonPause() { Time.timeScale = 0; } public void onClickButtonSlow() { Time.timeScale = 0.3f; } public void onClickButtonPlay() { Time.timeScale = 1; } } |
Update() deltaTime使用せず
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
using UnityEngine; using System.Collections; public class Mover1 : MonoBehaviour { float _speed = 5; void Update() { Vector3 pos = transform.localPosition; pos.x += _speed / 60; if (pos.x > 2) { pos.x = 2; _speed = -_speed; } else if (pos.x < -2) { pos.x = -2; _speed = -_speed; } transform.localPosition = pos; } } |
Update() deltaTime使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
using UnityEngine; using System.Collections; public class Mover2 : MonoBehaviour { float _speed = 5; void Update() { Vector3 pos = transform.localPosition; pos.x += _speed * Time.deltaTime; if (pos.x > 2) { pos.x = 2; _speed = -_speed; } else if (pos.x < -2) { pos.x = -2; _speed = -_speed; } transform.localPosition = pos; } } |
LateUpdate()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
using UnityEngine; using System.Collections; public class Mover3 : MonoBehaviour { float _speed = 5; void LateUpdate() { Vector3 pos = transform.localPosition; pos.x += _speed / 60; if (pos.x > 2) { pos.x = 2; _speed = -_speed; } else if (pos.x < -2) { pos.x = -2; _speed = -_speed; } transform.localPosition = pos; } } |
FixedUpdate()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
using UnityEngine; using System.Collections; public class Mover4 : MonoBehaviour { float _speed = 5; void FixedUpdate() { Debug.Log(Time.deltaTime); Vector3 pos = transform.localPosition; pos.x += _speed / 60; if (pos.x > 2) { pos.x = 2; _speed = -_speed; } else if (pos.x < -2) { pos.x = -2; _speed = -_speed; } transform.localPosition = pos; } } |
実行結果
deltaTimeを使用しないと、Update()内の動作は影響されません(LateUpdate()も同様でした)。
フレームレートが50fpsに固定されているFixedUpdate()ではtimeScaleの影響を直接受けることができるが、フレームレートが固定されていないUpdate()とLateUpdate()では、deltaTimeの値を使わないと、timeScaleの影響を受けることが出来ないようです。
参考
Unity3D MonoBehaviour Lifecycle:
http://www.richardfine.co.uk/2012/10/unity3d-monobehaviour-lifecycle/
コメントを残す
コメントを投稿するにはログインしてください。