所以我的资产(以及其他)中有这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));
}
}
}
答案 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;
}
}