首页 > 解决方案 > 在给定距离和速度的情况下查找碰撞时间

问题描述

假设我在位置 x = 0 有一个对象 A,在位置 x = 16 有一个对象 B。

假设 A 有这个代码:

public class Move : MonoBehaviour 
{
    float speed = 0.04f;

    Update()
    {
       transform.Translate(speed, 0, 0);
    }
}

我的问题是:如何评估 A 与 B 碰撞需要多少秒(精确)?


如果我应用公式 S = S0 + vt,它将无法正常工作,因为我不知道如何测量它在一秒钟内将通过多少帧来准确测量速度是多少。

标签: unity3d

解决方案


首先你不应该那样做。您的代码当前依赖于帧速率,因此如果您的帧速率较高,则对象移动得更快!

而是使用Time.deltaTime

此属性提供当前帧和前一帧之间的时间。

将您的速度从Unity Units / frame转换为Unity Units / second

transform.Translate(speed * Time.deltaTime, 0, 0);

这意味着对象现在移动0.04 Unity Units / second(与帧速率无关)。


然后我会说所需的时间(以秒为单位)很简单

var distance = Mathf.Abs(transform.position.x - objectB.transform.position.x);
var timeInSeconds = distance / speed;

虽然..这显然仍然假设“碰撞”是指在同一位置(至少在X轴上)..您也可以考虑它们的宽度,因为它们的表面会比这更早碰撞;)

var distance = Mathf.Abs(transform.position.x - objectB.transform.position.x) - (objectAWidth + objectBWidth);
var timeInSeconds = distance / speed;

推荐阅读