使用自定义力进行弹丸射击

问题描述

我制作了一个弹丸射击系统。我想按照指定的路径从位置 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;
    }