问题描述
我制作了一个弹丸射击系统。我想按照指定的路径从位置 A 到 B 拍摄一个物体。除了一件事外,一切正常。作用在物体上的速度是根据 A 和 B 之间的距离计算的,时间的值是 1 来移动这个距离。这意味着我打得越远,它走得越快。我想控制施加的力。这意味着无论我打近还是打远,它都应该以我设定的速度前进。尝试标准化速度并将其乘以我的自定义力值,但随后它远离其轨迹。 (请参阅下面的此链接,无论我们击中物体多近或多远。它在遵循指示的轨迹时以相同的速度前进。我想开发此功能。 https://play.google.com/store/apps/details?id=com.ghakilo.trickytrack)
Vector3 calculateVeLocity(Vector3 target,Vector3 origin,float time)
{
Vector3 distance = target - origin;
Vector3 distanceXZ = distance;
distanceXZ.y = 0f;
float Sy = distance.y;
float Sxz = distanceXZ.magnitude;
float Vxz = Sxz / time;
float Vy = 0f;
Vy = Sy / time + 0.5f * Mathf.Abs(Physics.gravity.y) * time;
Vector3 result = distanceXZ.normalized;
result = result * Vxz;
result.y = Vy;
return result;
}
解决方法
物理时间!
速度是一个矢量,其大小为速度。
如果你想固定你的射弹开始的速度,那只会把速度的方向留在你的手中,所以你需要计算你想要射入射弹的方向.
如果你像我一样,你会直接射击目标,所以你需要设置从原点到目标的方向向量。这只是target - origin
,或者您计算为distance
。我将称其为 direction
,因为这正是它的真正用途。
现在要将其用作速度的方向向量,请将 distance
转换为单位向量(不确定在统一框架中如何执行此操作,但是 direction.Normalize()
?)
然后乘以速度得到你的速度向量!
Vector3 calculateVelocity(Vector3 target,Vector3 origin,float speed)
{
Vector3 direction = target - origin;
direction.Normalize();
Vector3 result = direction * speed;
return result;
}
,
首先将 rigidbody
添加到您的项目符号并将重力比例设置为 .5
并将此代码添加到您的项目符号预制件
Vector3 calculateVelocity(Transform target,Transform origin,float time)
{
Vector3 direction = target.transform.position - origin.transform.position;
float distance = Vector3.Distance(origin.transform.position,target.transform.position);
result = direction.normalized * distance * speed * Time.deltaTime;
return result;
}