x


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 ++;
     }
more ▼

asked Aug 04 '12 at 05:48 PM

pjcarey97 gravatar image

pjcarey97
16 1 3 5

(comments are locked)
10|3000 characters needed characters left

1 answer: sort voted first

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++
}
more ▼

answered Aug 04 '12 at 11:39 PM

speedything gravatar image

speedything
425 1 4

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.

Aug 05 '12 at 12:03 AM aldonaletto
(comments are locked)
10|3000 characters needed characters left
Your answer
toggle preview:

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Topics:

x4155
x292
x207
x142

asked: Aug 04 '12 at 05:48 PM

Seen: 184 times

Last Updated: Aug 05 '12 at 12:03 AM