如何计算Unity2D中子弹的轨迹?

时间:2016-05-13 19:13:09

标签: c# unity3d physics projectile

我正在玩用抛物线移动的子弹进行2D游戏,但在我拍摄射弹之前,我希望能够计算它的轨迹。

fread()

此代码将rigidbody2d添加到我的项目符号(newGO)。我尝试在飞行1秒后计算一个点:

            float velocity = Mathf.Min(Mathf.Max(distance, 1), 2.5f);
        float cos = Mathf.Cos( (gameObject.transform.localEulerAngles.z + 90) * Mathf.Deg2Rad);
        float sin = Mathf.Sin( (gameObject.transform.localEulerAngles.z + 90) * Mathf.Deg2Rad);
        newGO.GetComponent<Rigidbody2D>().AddForce(velocity * new Vector3(cos, sin))

不幸的是,它没有返回正确的结果。我该怎么办? 感谢您的帮助,对不起我的英语。

1 个答案:

答案 0 :(得分:1)

我认为作为一个抛射物你应该使用Rigidbody2D.velocity设置射弹的初始速度而不是Rigidbody2D.AddForce。 (虽然文档不推荐)

这个简单的脚本预测附加对象在变量“timeLimit”确定的时间内的位置,并将“目标”游戏对象移动到该点。

public class Velocity : MonoBehaviour {

    public GameObject target;

    private float HoriInitialSpeed = 5;
    private float VertInitialSpeed = 5;
    private float timeLimit = 2;
    private float timeElapsed=0;

    void Start ()
    {
        float HoriPredict = HoriInitialSpeed * timeLimit;
        float VertiPredict = VertInitialSpeed* timeLimit + (0.5f * Physics2D.gravity.y * timeLimit * timeLimit);

        target.transform.Translate(HoriPredict, VertiPredict,0);
        GetComponent<Rigidbody2D>().velocity = new Vector2(HoriInitialSpeed, VertInitialSpeed);
    }

    void Update () {
        timeElapsed += Time.deltaTime;
        if(timeElapsed >= timeLimit)
        {
            //stop the bullet
            GetComponent<Rigidbody2D>().velocity = new Vector2(0, 0);
            GetComponent<Rigidbody2D>().gravityScale = 0;
        }
    }
}

注意:子弹和目标必须位于同一点