在碰撞中正确地加速爆发游戏中的球

时间:2018-04-03 21:24:43

标签: c# unity3d

所以我的资产(以及其他)中有这3个脚本。我的总经理(GM),我的球和我的疯狂砖块。当它触及疯狂的砖块时,它每次都应该移动得更快一点。在我的GM中,我设置了一个等于false的布尔快球,并使用GM实例在我的crazybrick脚本中将其设置为真。然后在我的球形剧本中,如果是真的,我会逐步让球变快,然后将快球设置为假。我用调试日志测试它,每次都快100f。第一次测试看起来都很完美。但随后的测试会发生奇怪的事情。球有时会变慢,或者在速度过快之后射出我的墙壁,或者似乎没有变得更快。它总是不同的。下面是我对三个脚本的相关代码。

public class GM : MonoBehaviour {
 public bool fastBall = false;
 public static GM instance = null;
}


public class CrazyBrick : MonoBehaviour {
    public GameObject brickParticle;

    void OnCollisionEnter ()
    {
        GM.instance.fastBall = true;
        Instantiate (brickParticle, transform.position, Quaternion.identity);
        GM.instance.DestroyBrick ();
        Destroy (gameObject);
    }
}


public class Ball : MonoBehaviour {


    public float ballInitialVelocity = 600f;
    public float newVelocity;
    private Rigidbody rb;
    private bool ballInPlay;


    // Use this for initialization
    void Awake () {

        rb = GetComponent<Rigidbody> ();
    }

    // Update is called once per frame
    void FixedUpdate () {
        if (GM.instance.fastBall) {

            newVelocity = newVelocity + 100f;
            Debug.Log ("increment 100f: " + newVelocity);
            rb.AddForce(new Vector3(newVelocity, newVelocity, 0));

            GM.instance.fastBall = false;

        }
        if(Input.GetButtonDown("Fire1") && ballInPlay == false)
        {

            transform.parent = null;
            ballInPlay = true;
            rb.isKinematic = false;
            rb.AddForce(new Vector3(ballInitialVelocity, ballInitialVelocity, 
            0));
        }
    }
}

1 个答案:

答案 0 :(得分:1)

如果您知道刚体设置的确切速度,那么您可以直接设置速度而不是调用AddForce。最重要的是,您正在调用AddForce并添加全速度加上100个单位。因此,如果您的速度为50,那么您计算150并使用它调用addforce,给你50 + 150,而不是仅仅给你150.如果你想打电话给AddForce那么你应该添加100。

另外,如果你沿着X和Y添加相等的力,你正在做的那么,那么实际上超过了原来的数量。如果你考虑毕达哥拉斯定理,直角三角形的斜边比其他两边长。因此,如果您要向X添加100和向Y添加100,那么您实际上每秒大约会增加141个单位。您应该获得速度方向,并沿该方向添加100个单位,这样可以避免添加多个向量然后必须对该值进行标准化的问题。

在您使用rb.AddForce()的地方尝试类似的内容:

// Get the current velocity vector
var oldVelocity = rb.velocity;

// Get the current speed
var oldMagnitude = oldVelocity.magnitude;

// Get the current direction the rigid body is moving in
var direction = oldVelocity.normalized;

// The new velocity is in the same direction but faster than before
var newVelocity = direction * (oldMagnitude + 100f);

// Set the rigid body to the new velocity
rb.velocity = newVelocity;

也许这对你有用:

void FixedUpdate () {
    if (GM.instance.fastBall) {

        // Get the current velocity vector
        var oldVelocity = rb.velocity;

        // Get the current speed
        var oldMagnitude = oldVelocity.magnitude;

        // Get the current direction the rigid body is moving in
        var direction = oldVelocity.normalized;

        // The new velocity is in the same direction but faster than before
        var newVelocity = direction * (oldMagnitude + 100f);

        // Set the rigid body to the new velocity
        rb.velocity = newVelocity;

        GM.instance.fastBall = false;
    }
    if(Input.GetButtonDown("Fire1") && ballInPlay == false)
    {
        transform.parent = null;
        ballInPlay = true;
        rb.isKinematic = false;

        // Get the current direction the rigid body is moving in
        var direction = oldVelocity.normalized;

        rb.velocity = direction * ballInitialVelocity;
    }
}