x


How do I spread a movement over several frames instead of one?

I'm trying to propel my character forward with the spacebar. So I set a force as a vector3, and a charactercontroller, and when the spacebar is pressed, I enter a while(force is more than 0) loop. In the loop, I move forward by whatever force is equal to, and then subtract a little from force. The result is an abrupt, 1-frame motion that I'm looking to change to a several frame motion with a smooth stop. Can anybody give me a hint on how to do this?

Here's that chunk of my code IF IT HELPS:

    CharacterController cont;
    Vector3 force;

    void Start()
    {
        cont = GetComponent<CharacterController> ();
        force = (new Vector3(0,0,1f) * Time.deltaTime); 
    }

     void Update ()
     {
        if (Input.GetButtonDown ("Boost"))
        { 
            while(force.z > 0)
        {
            cont.Move (force);
            force.z -= (0.1f) * Time.deltaTime;
        }
     } 
more ▼

asked Aug 05 '12 at 06:09 AM

pjcarey97 gravatar image

pjcarey97
16 1 3 5

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

1 answer: sort voted first

You have to realize that Update() is going to be called every frame unless the script is disabled. So ask yourself: Why do you need a while loop in a function that is called every frame?

What is going to happen if you remove it altogether?

Addendum: You should replace GetButtonDown with GetButton; The first one returns true the first frame that the button is pushed, the second returns true until the button is released.

more ▼

answered Aug 05 '12 at 06:16 AM

Muuskii gravatar image

Muuskii
1.1k 4 10

Thank you very much! This helped me out a lot, really!

Aug 05 '12 at 06:35 AM pjcarey97

One quick question, what if I wanted to do a full boost but with just one keypress?

Aug 05 '12 at 06:37 AM pjcarey97

for this task just declare a variable type boolean, 'boostEnabled' for example. then in Update() method make two separated things (fastwrited C#):

if (Input.GetKeyDown("Boost") {boostEnabled = false;}

...this will turn on boost on key press

if (boostEnabled)
{
    ...check if boost can work - have a boost power etc, disable 'boostEnabled' if can't work and exit if block
    cont.Move (force);
    force.z -= (0.1f) * Time.deltaTime;
}

...second block will work while boostEnabled is true even if button is unpressed.

Aug 05 '12 at 10:57 AM ScroodgeM
(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:

x4167
x499
x292
x207
x143

asked: Aug 05 '12 at 06:09 AM

Seen: 315 times

Last Updated: Aug 05 '12 at 10:57 AM