- Home /
How to start looped code (like that in Update()) from the area that runs once?
Okay.
I need to freeze character movement for some time when GetButtonDown (to play Jump Prepare animation; I need the character to stay).
Character is running -> Hit Jump -> Character is Preparing -> Character is Jumping. So I need to stop moving when it is preparing to jump (it is a little time step as 0.3335 seconds).
This code below runs in Update() in the script that on the character. 'v' is input from the Vertical axis. JumpForward() just defines a Vector to jump and AddForce to character's Rigidbody.
if (Input.GetButtonDown("Jump") && v > 0.5f) // jump forward
{
isJumpPressed = true; // trigger prepare animation
// stop motion
// we need to run AddForce with delay for prepare animation!
Invoke("JumpForward", 0.667f / 2f);
I can assign 0 to 'v' variable (that is responsive to movement) in each frame while the character is preparing (while this animation is playing)... But how can I do it? This code runs only once when the button is down.
How to start looped code (like that in Update()) from the area that runs once?
Thank you for any help.
The idea is
for (float i = 0.3335; i > 0; i -= Time.deltaTime) // can I use float ins$$anonymous$$d int?
{
v = 0;
}
v will be 0 until time will pass.
if (Input.GetButtonDown("Jump") && v > 0.5f) // jump forward
{
isJumpPressed = true; // trigger prepare animation
// stop motion
for (float i = 0.3335f; i > 0; i -= Time.deltaTime) // can I use float ins$$anonymous$$d int?
{
v = 0f;
}
// we need to run AddForce with delay for prepare animation!
Invoke("JumpForward", 0.667f / 2f);
}
This didn't work.
Answer by dom_cobb_22 · May 10, 2019 at 07:34 PM
Here is as I solve this.
void Update()
{
// Should stop?
if (shouldStop)
{
v = 0f;
}
// JUMPING
{
if (Input.GetButtonDown("Jump") && v > 0.5f) // jump forward
{
isJumpPressed = true; // trigger prepare animation
// stop motion
shouldStop = true;
StartCoroutine(ShouldStopOff());
// we need to run AddForce with delay for prepare animation!
Invoke("JumpForward", 0.667f / 2f);
}
}
}
IEnumerator ShouldStopOff()
{
yield return new WaitForSeconds(0.3335f);
shouldStop = false;
}
The answer is Coroutines.
Your answer
Follow this Question
Related Questions
Initialising List array for use in a custom Editor 1 Answer
While Loop Not Assigning Array 1 Answer
AddComponent passing variable before Start/Awake 5 Answers
How can I decrease points by the second? 2 Answers
problem changing spawnTime variable 1 Answer