您的位置:首页 > 移动开发 > Unity3D

Unity3D 为什么Transform.Translate 中的x/y/z值经常会通过speed * Time.deltaTime获取?应该这样的

2015-12-20 22:34 369 查看
先上代码:

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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: