慢下来Rigidbody

时间:2017-06-11 13:41:22

标签: c# unity3d unity5

我正在根据GetAxis ("Vertical")和速度修改器添加前进力normal max speed

我也允许“速度提升”,在boosted max speed之前的正常添加力之上增加更多力量。

我正在经历的困难是在提升期结束后减慢对象的速度

所以基本上如果你的速度加快到正常的最大速度,你不能再加速提升速度,将物体减速回到正常的最大速度。

这是我到目前为止所得到的:

    float velocity;
    float magnitude = myRigidBody.velocity.magnitude;
    float vertical = Input.GetAxis ("Vertical");
    if (Input.GetKeyUp(KeyCode.LeftShift)) {
        boost = false;
    }
    if (Input.GetKeyDown (KeyCode.LeftShift)) {
        boost = true;
    }
    if (!boost) {
        velocity = vertical * speed;
        Vector3 force = myRigidBody.transform.forward * velocity;
        if (magnitude + force.sqrMagnitude < normalMaxSpeed) { 
            myRigidBody.drag = 0f;
            myRigidBody.AddForce (force, ForceMode.Impulse);
        } else if (magnitude + force.sqrMagnitude >= maxTrust + 50) { 
            myRigidBody.drag = 1.5f;
        }
    } else if ( magnitude < boostedMaxSpeed) { 
        velocity = vertical * (speed + speedBoost);
        myRigidBody.AddForce (myRigidBody.transform.forward * velocity, ForceMode.Impulse);

这有些有效,但除了改变阻力之外必须有更好的解决方案。

1 个答案:

答案 0 :(得分:4)

除了更改阻力之外,还有其他方法可以做到这一点。你只需要试验看哪一个效果最好。

1 。更改拖动

myRigidBody.drag = 20f;

2 。以相反的速度加力。

public Rigidbody myRigidBody;
void FixedUpdate()
{
    Vector3 oppositeVelocity = -myRigidBody.velocity;
    myRigidBody.AddRelativeForce(oppositeVelocity);
}

3 。将当前速度减小或恢复到法向力。

public Rigidbody myRigidBody;
Vector3 normalForce;

void Start()
{
    normalForce = new Vector3(50, 0, 0);

    //Add force  
    myRigidBody.velocity = new Vector3(500f, 0f, 0f);
    //OR
    //myRigidBody.AddForce(new Vector3(500f, 0f, 0f));
}

void FixedUpdate()
{
    //Go back to normal force within 2 seconds
    slowDown(myRigidBody, normalForce, 2);
    Debug.Log(myRigidBody.velocity);
}

bool isMoving = false;

void slowDown(Rigidbody rgBody, Vector3 normalForce, float duration)
{
    if (!isMoving)
    {
        isMoving = true;
        StartCoroutine(_slowDown(rgBody, normalForce, duration));
    }
}

IEnumerator _slowDown(Rigidbody rgBody, Vector3 normalForce, float duration)
{
    float counter = 0;
    //Get the current position of the object to be moved
    Vector3 currentForce = rgBody.velocity;

    while (counter < duration)
    {
        counter += Time.deltaTime;
        rgBody.velocity = Vector3.Lerp(currentForce, normalForce, counter / duration);
        yield return null;
    }

    isMoving = false;
}

4 。更改Physics Material动态摩擦。你不能使用这种方法,因为它需要你没有的对撞机。

//Get the PhysicMaterial then change its dynamicFriction
PhysicMaterial pMat = myRigidBody.GetComponent<Collider>().material;
pMat.dynamicFriction = 10;

实验并决定哪一个最适合您。根据您制作的游戏类型,它们很有用。例如,#4 主要用于滚球,因为它使用需要频繁碰撞的物理材料来实际工作。

#3 中使用的方法可让您控制转换应发生的时间。如果你需要控制它那么那就是选择。