Unity3D 爲什麼Transform.Translate 中的x/y/z值經常會通過speed * Time.deltaTime獲取?應該這樣的

先上代碼:

public class Player : MonoBehaviour {
	protected Transform m_transform;
	public float m_speed = 1;
	// Use this for initialization
	void Start () {
		m_transform = this.transform;
	}
	
	// Update is called once per frame
	void Update () {
		float movev = 0;
		float moveh = 0;
		if (Input.GetKey (KeyCode.UpArrow)) {
			movev -= m_speed * Time.deltaTime;
		}
		if (Input.GetKey (KeyCode.DownArrow)) {
			movev += m_speed * Time.deltaTime;
		}
		if (Input.GetKey(KeyCode.LeftArrow)) {
			moveh += m_speed * Time.deltaTime;
		}
		if (Input.GetKey (KeyCode.RightArrow)) {
			moveh -= m_speed * Time.deltaTime;
		}
		m_transform.Translate (new Vector3 (moveh, 0, movev));
	}
}

上面的水平方向(x軸)的位移量moveh通過m_speed * Time.deltaTime方式獲取。

我之前剛學時一直納悶速度就速度麼,直接moveh += m_speed不就完了,乘的Time.deltaTime是個什麼鬼。。。(現在想來很幼稚,因爲答案真的很簡單/(ㄒoㄒ)/~~)

今天恍然大悟,解釋如下:

比如定義的m_speed = 1,,意思是角色速度爲1米/秒,

那麼如果moveh += m_speed ,就默認了經過了1秒的時間水平方向移動了1米。

這個時候請注意,這個函數是多長時間調用一次呢?答案是:1幀,而不是1秒,

那麼一幀有多久呢?也就幾十毫秒吧,準確的時間就是Time.deltaTime(它表示距上一次調用Update或FixedUpdate 所用的時間)。所以說用m_speed * Time.deltaTime,就是這麼及時毫秒,應該移動的距離。

最後分析一下,爲什麼這麼用?

以我之前做Winform上的GDI繪製的經驗,比如我要文字滾動顯示,我會採用在OnPainting中每次移動N個像素的辦法來處理;

在ActionScript中,也是在OnFrame中每次移動N個像素來處理。

也就是說從來沒有擺脫幀的束縛,如果幀頻變了,速度就變了。

那麼這種方法就不一樣了,因爲我不用去考慮幀,我只關心該幀與上幀間隔了多久,然後就知道該移動多少距離了,哪怕他幀頻變了,也不會影響我既定的N米/秒的速度(當然如果幀頻過小,會使畫面不流暢)。

最後附上我剛纔看到的一篇解釋Time.deltaTime文章鏈接,供參考(http://blog.csdn.net/xgx198831/article/details/7411504)

發佈了61 篇原創文章 · 獲贊 34 · 訪問量 35萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章