Unityな日々(Unity Geek)

Unityで可視化アプリを開発するための試行錯誤の覚書

timeScaleでアニメーション速度を変更する

Time.timeScaleでFixedUpdate()の時間間隔を調整できる。

Time.timeScale=1.0 で、デフォルトの速度(時間間隔)
Time.timeScale=0.5で、速度を半分(時間間隔を2倍)にする
Time.timeScale=0.0は、速度ゼロ、すなわち、FixedUpdate()を停止する


具体的な事例で見てみる。

子オブジェクトのスクリプト。一定速度で回転する。

using UnityEngine;
using System.Collections;

public class revolution : MonoBehaviour {
	
    // Update is called once per frame
        void FixedUpdate () {
        transform.RotateAround(Vector3.up, 0.02f);
    }
}


親オブジェクト:一定速度で上昇するスクリプト。スペースキーでTime.timeScale=0.0f/1.0fにトグルする。これによって、アニメーションの停止・作動を切り替える。

using UnityEngine;
using System.Collections;

public class move : MonoBehaviour {
	
	// Use this for initialization
	    void Start () {
	}
	
	// Update is called once per frame
	void Update () {
	    if (Input.GetKeyDown ("space")){
            print ("space key was pressed Time.timeScale="+Time.timeScale);
	    Time.timeScale = Mathf.Abs (1.0f-Time.timeScale);
	}

	}
	void FixedUpdate(){
		transform.Translate(0.01f*Vector3.up);
	}
	
}


ここで注意するのは次の2点。

1)timeScale=0.0fで停止するのは、FixedUpdate()のみ。Update()はTime.timeScaleの値に関係なく、動き続ける。
 つまり、上の事例では、親オブジェクトのUpdate()内のInput.GetKeyDownによるキー入力は有効のままである。

2)親オブジェクトでTime.timeScale=0.0fとすると、子オブジェクトを含む全てのFixedUpdate()が停止する。上の例では、親オブジェクトの上昇が止まるだけでなく、子オブジェクトの回転も止まる。
 親子関係にあるオブジェクトだけではなく、シーン内のすべてのオブジェクトでFixedUpdate()は停止する。