射弹物理 - 为什么在 Unity 中使用 Time.sinceLevelLoad 而不是 Time.delatime 时会得到不同的结果?
Projectile Physics - Why do i get a different result when using Time.sinceLevelLoad over Time.delatime in Unity?
我正在研究 Unity 中对象的射弹物理。在这种情况下,我只是使用一个球体对象并根据重力计算它的矢量和它应该采用的路径(暂时不考虑其他力,如摩擦力)。
我使用的公式如下:s = ut + ½at²
代码解决方案非常简单,如下所示:
using UnityEngine;
using System.Collections;
public class TestProjectileForce : MonoBehaviour {
// Create vector components to calculate force & position
private float force = 1.8f;
private float g = 9.8f;
private float angle = 30f;
private float fx;
private float fy;
// projectile calculate
private float dis_x;
private float dis_y;
// Use this for initialization
void Start () {
// calculate x & y vector
fx = Mathf.Round (force * Mathf.Cos(Mathf.Deg2Rad * angle));
fy = Mathf.Round (force * Mathf.Sin(Mathf.Deg2Rad * angle));
}
// Update is called once per frame
void Update () {
// s = ut + 1/2at2
dis_x = (float)(fx * Time.timeSinceLevelLoad);
dis_y = (float)(fy + Time.smoothDeltaTime + (0.5) * (-g) * Time.timeSinceLevelLoad * Time.timeSinceLevelLoad);
Debug.Log (dis_x+", "+dis_y);
transform.Translate (new Vector2(dis_x, dis_y));
}
}
但是我注意到,我应该得到的预期结果会有很大差异,具体取决于我是否使用 Time.sinceLevelLoad
而不是 Time.deltaTime
。谁能向我解释这是为什么?当使用 Time.sinceLevelLoad
时,我得到了球在重力作用下的弧形和下落的预期结果,但是使用 Time.deltatime
时,球只会发射而不是预期的弧形。
Time.deltaTime 是此更新处理的时间间隔。在 30fps 时,假设帧速率没有变化,则为 1/30s。对于物理你应该使用 FixedUpdate,它总是一个固定的间隔。
Time.timeSinceLevel load is at it says, 自加载关卡以来经过的游戏时间。
它们是截然不同的概念。第一个可用于推导迭代解决方案,第二个可用于随时间评估函数(假设您始终希望从关卡加载开始评估)。
我正在研究 Unity 中对象的射弹物理。在这种情况下,我只是使用一个球体对象并根据重力计算它的矢量和它应该采用的路径(暂时不考虑其他力,如摩擦力)。
我使用的公式如下:s = ut + ½at²
代码解决方案非常简单,如下所示:
using UnityEngine;
using System.Collections;
public class TestProjectileForce : MonoBehaviour {
// Create vector components to calculate force & position
private float force = 1.8f;
private float g = 9.8f;
private float angle = 30f;
private float fx;
private float fy;
// projectile calculate
private float dis_x;
private float dis_y;
// Use this for initialization
void Start () {
// calculate x & y vector
fx = Mathf.Round (force * Mathf.Cos(Mathf.Deg2Rad * angle));
fy = Mathf.Round (force * Mathf.Sin(Mathf.Deg2Rad * angle));
}
// Update is called once per frame
void Update () {
// s = ut + 1/2at2
dis_x = (float)(fx * Time.timeSinceLevelLoad);
dis_y = (float)(fy + Time.smoothDeltaTime + (0.5) * (-g) * Time.timeSinceLevelLoad * Time.timeSinceLevelLoad);
Debug.Log (dis_x+", "+dis_y);
transform.Translate (new Vector2(dis_x, dis_y));
}
}
但是我注意到,我应该得到的预期结果会有很大差异,具体取决于我是否使用 Time.sinceLevelLoad
而不是 Time.deltaTime
。谁能向我解释这是为什么?当使用 Time.sinceLevelLoad
时,我得到了球在重力作用下的弧形和下落的预期结果,但是使用 Time.deltatime
时,球只会发射而不是预期的弧形。
Time.deltaTime 是此更新处理的时间间隔。在 30fps 时,假设帧速率没有变化,则为 1/30s。对于物理你应该使用 FixedUpdate,它总是一个固定的间隔。
Time.timeSinceLevel load is at it says, 自加载关卡以来经过的游戏时间。
它们是截然不同的概念。第一个可用于推导迭代解决方案,第二个可用于随时间评估函数(假设您始终希望从关卡加载开始评估)。