- Home /
How come my boost comes to an abrupt stop?
I want my character to boost and stop slowly. So I enter a 'while' loop, and set it to keep going until the force with which he's propelled forward is 0, and lessen the force at the end of the loop. So I'd think he's goes forward a little less every frame, and creates the effect of a slow stop, but instead it's all one very quick, abrupt movement. (I already asked this but I got no answer.
public int boosts = 3; int boostCount = 0; public float boostSpeed = 15.0f; CharacterController cont;
void Start ()
{
cont = GetComponent ();
}
void Update ()
{
if (Input.GetButtonDown ("Boost") && boostcount < boosts) {
Vector3 force = transform.TransformDirection (0, 0, 1) * boostSpeed * Time.deltaTime;
while (force.z > 0) {
cont.Move (force);
force.z -= (2.0f * Time.deltaTime);
}
boostcount ++;
}
Answer by speedything · Aug 04, 2012 at 11:39 PM
I believe the problem is that the "while" loop is inside the "if" statement, and it all happens in Update. Input.GetButtonDown only triggers on the frame the button is depressed so the while loop only runs for that single frame, before the next update restarts everything (this time with no button down being registered).
My favourite fix is to make this a coroutine...
void Update()
{
if (Input.GetButtonDown... //Put specific statement to trigger boost here
{
StartCoroutine(Boost());
}
}
IEnumerator Boost()
{
Vector3 force = ... //Put force here
while (force.z > 0)
{
cont.Move(force);
force.z -= (2.0f * Time.deltaTime);
yield return null; //To come back here next frame
}
boostcount++
}
Actually, the problem is caused by the while being executed entirely inside a single frame. The coroutine solution is the best: use yield to span the while over several frames.
Your answer
Follow this Question
Related Questions
How do I spread a movement over several frames instead of one? 1 Answer
Multiple Cars not working 1 Answer
Distribute terrain in zones 3 Answers
Vector3.SmoothDamp has some invalid arguments 0 Answers
Camera Smooth Distance Change 1 Answer