Jump gets disabled with courutine!

I have two scripts, they work perfectly, they move the character around and make it jump, but when I apply the courutine, wich works perfectly with a debug log, the jump simply doesnt work, the character doesnt jump anymore when I press the spacebar.
How come is this??

Here are the codes.

TP MOTOR

using UnityEngine;
using System.Collections;

public class TP_Motor : MonoBehaviour {

public static TP_Motor Instance;

public float MoveSpeed = 20f;
public float JumpSpeed = 13f;
public float Gravity = 31f;
public float TerminalVelocity = 60f;

public Vector3 MoveVector { get; set; }
public float VerticalVelocity { get; set; }

void Awake () 
{
    Instance = this;
}

public void UpdateMotor () 
{
    ProcessMotion();

}

public void ProcessMotion()
{
    // First Movevector

    // Transform MoveVector to worldspace
    MoveVector = transform.TransformDirection(MoveVector);

    // Normalize MoveVector if Magnitude > 1
    if (MoveVector.magnitude > 1)
        MoveVector = Vector3.Normalize(MoveVector);

    // Multiply MoveVector by MoveSpeed
    MoveVector *= MoveSpeed;

    // Reapply VerticalVelocity MoveVector.y
    MoveVector = new Vector3(MoveVector.x, VerticalVelocity, MoveVector.z);

    // Apply Gravity
    ApplyGravity();

    // Move the character into world space
    TP_Controller.CharacterController.Move(MoveVector * Time.deltaTime);
}

void ApplyGravity()
{
    if (MoveVector.y > -TerminalVelocity)
        MoveVector = new Vector3(MoveVector.x, MoveVector.y - Gravity * Time.deltaTime, MoveVector.z);

    if (TP_Controller.CharacterController.isGrounded && MoveVector.y < -1)
        MoveVector = new Vector3(MoveVector.x, -1, MoveVector.z);
}

public void Jump()
{
    if (TP_Controller.CharacterController.isGrounded)
        VerticalVelocity = JumpSpeed;
}

}

TP CONTROLLER

using UnityEngine;
using System.Collections;

public class TP_Controller : MonoBehaviour
{

public static CharacterController CharacterController;
public static TP_Controller Instance;

float rotateSpeed = 60.0f;

void Awake()
{
    CharacterController = GetComponent("CharacterController") as CharacterController;

    Instance = this;

}

void Update()
{
    GetLocomotionInput();
    HandleActionInput();
    TP_Motor.Instance.UpdateMotor();
}

void GetLocomotionInput() // INPUTS FOR MOTION
{
    var deadZone = 0.1f;

    TP_Motor.Instance.VerticalVelocity = TP_Motor.Instance.MoveVector.y;

    TP_Motor.Instance.MoveVector = Vector3.zero;

    if (((Input.GetAxis("Vertical") > deadZone) && !Input.GetKey(KeyCode.LeftShift)) ||
        (Input.GetAxis("Vertical") < -deadZone && !Input.GetKey(KeyCode.LeftShift)))
        TP_Motor.Instance.MoveVector += new Vector3(0, 0, Input.GetAxis("Vertical"));

    if (Input.GetKey(KeyCode.LeftShift) & Input.GetKey("d"))
        TP_Motor.Instance.MoveVector += new Vector3(Input.GetAxis("Horizontal"), 0, 0);

    if (Input.GetKey(KeyCode.LeftShift) & Input.GetKey("a"))
        TP_Motor.Instance.MoveVector += new Vector3(Input.GetAxis("Horizontal"), 0, 0);

    if (Input.GetKey(KeyCode.LeftShift) & Input.GetKey("right"))
        TP_Motor.Instance.MoveVector += new Vector3(Input.GetAxis("Horizontal"), 0, 0);

    if (Input.GetKey(KeyCode.LeftShift) & Input.GetKey("left"))
        TP_Motor.Instance.MoveVector += new Vector3(Input.GetAxis("Horizontal"), 0, 0);

    if (((Input.GetAxis("Horizontal") > deadZone) && !Input.GetKey(KeyCode.LeftShift)) ||
        (Input.GetAxis("Horizontal") < -deadZone) && !Input.GetKey(KeyCode.LeftShift))
        transform.eulerAngles += new Vector3(0, Input.GetAxis("Horizontal") * rotateSpeed * Time.deltaTime, 0);
}

void HandleActionInput()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        StartCoroutine(DelayedJump());
    }
}

public void Jump()
{
    TP_Motor.Instance.Jump();
}

IEnumerator DelayedJump()
{
    yield return new WaitForSeconds(1f);
    Jump();
}

}

The coroutine was changing the order of operations. In your code, you have a variable called VerticalVelocity, which gets the upward velocity and is used in ProcessMotion function. However, once you added the coroutine, the order of operation changed, and the VerticalVelocity variable was getting reset inside GetLocomotionInput().

I moved the line of code from GetLocomotionInput() to the end of ProcessMotion, and this fixes your current problem. It jumped correctly on my machine, at least. Below is the fixed code.

I’d encourage you to learn how to use the debugger. This was a relatively straightforward bug to fix using a debugger.

Here’s the new TP_Motor:

using UnityEngine; using System.Collections;

public class TP_Motor : MonoBehaviour {

public static TP_Motor Instance;
 
public float MoveSpeed = 20f;
public float JumpSpeed = 13f;
public float Gravity = 31f;
public float TerminalVelocity = 60f;
 
public Vector3 MoveVector { get; set; }
public float VerticalVelocity { get; set; }
 
void Awake () 
{
    Instance = this;
}
 
public void UpdateMotor () 
{
    ProcessMotion();
 
}
 
public void ProcessMotion()
{
    // First Movevector
 
    // Transform MoveVector to worldspace
    MoveVector = transform.TransformDirection(MoveVector);
 
    // Normalize MoveVector if Magnitude > 1
    if (MoveVector.magnitude > 1)
        MoveVector = Vector3.Normalize(MoveVector);
 
    // Multiply MoveVector by MoveSpeed
    MoveVector *= MoveSpeed;
 
    // Reapply VerticalVelocity MoveVector.y
    MoveVector = new Vector3(MoveVector.x, VerticalVelocity, MoveVector.z);
 
    // Apply Gravity
    ApplyGravity();
 
    // Move the character into world space
    TP_Controller.CharacterController.Move(MoveVector * Time.deltaTime);
		
		
 
    VerticalVelocity = MoveVector.y;
}
 
void ApplyGravity()
{
    if (MoveVector.y > -TerminalVelocity)
        MoveVector = new Vector3(MoveVector.x, MoveVector.y - Gravity * Time.deltaTime, MoveVector.z);
 
    if (TP_Controller.CharacterController.isGrounded && MoveVector.y < -1)
        MoveVector = new Vector3(MoveVector.x, -1, MoveVector.z);
}
 
public void Jump()
{
    if (TP_Controller.CharacterController.isGrounded)
        VerticalVelocity = JumpSpeed;
}
}

Here’s the new TP_Controller:

public static CharacterController CharacterController;
public static TP_Controller Instance;
 
float rotateSpeed = 60.0f;
 
void Awake()
{
    CharacterController = GetComponent("CharacterController") as CharacterController;
 
    Instance = this;
 
}
 
 
void Update()
{
    GetLocomotionInput();
    HandleActionInput();
    TP_Motor.Instance.UpdateMotor();
}
 
void GetLocomotionInput() // INPUTS FOR MOTION
{
    var deadZone = 0.1f;
 
    TP_Motor.Instance.MoveVector = Vector3.zero;
 
    if (((Input.GetAxis("Vertical") > deadZone) && !Input.GetKey(KeyCode.LeftShift)) ||
        (Input.GetAxis("Vertical") < -deadZone && !Input.GetKey(KeyCode.LeftShift)))
        TP_Motor.Instance.MoveVector += new Vector3(0, 0, Input.GetAxis("Vertical"));
 
    if (Input.GetKey(KeyCode.LeftShift) & Input.GetKey("d"))
        TP_Motor.Instance.MoveVector += new Vector3(Input.GetAxis("Horizontal"), 0, 0);
 
    if (Input.GetKey(KeyCode.LeftShift) & Input.GetKey("a"))
        TP_Motor.Instance.MoveVector += new Vector3(Input.GetAxis("Horizontal"), 0, 0);
 
    if (Input.GetKey(KeyCode.LeftShift) & Input.GetKey("right"))
        TP_Motor.Instance.MoveVector += new Vector3(Input.GetAxis("Horizontal"), 0, 0);
 
    if (Input.GetKey(KeyCode.LeftShift) & Input.GetKey("left"))
        TP_Motor.Instance.MoveVector += new Vector3(Input.GetAxis("Horizontal"), 0, 0);
 
    if (((Input.GetAxis("Horizontal") > deadZone) && !Input.GetKey(KeyCode.LeftShift)) ||
        (Input.GetAxis("Horizontal") < -deadZone) && !Input.GetKey(KeyCode.LeftShift))
        transform.eulerAngles += new Vector3(0, Input.GetAxis("Horizontal") * rotateSpeed * Time.deltaTime, 0);
}
 
void HandleActionInput()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        StartCoroutine(DelayedJump());
    }
}
 
public void Jump()
{
    TP_Motor.Instance.Jump();
}
 
IEnumerator DelayedJump()
{
    yield return new WaitForSeconds(1f);
    Jump();
}
}