- Home /
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();
}
}
Answer by Programmer-Tau · Nov 03, 2013 at 03:28 PM
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();
}
}
Thanks, it worked you are a genius, you have a like from me, but I dont quite well understand what happened. :(
Hey do you have facebook or something? so I can ask for help when I have a problem, you are really a genius and a very useful contact. This is my facebook by the way: https://www.facebook.com/juanse.coello
and my email is juansecoello@gmail.com $$anonymous$$illion thanks!!!
Blockquote
Your answer
Follow this Question
Related Questions
How to fix a infinity jump? 1 Answer
Custom Character Script Allowing Movement in the Air? 0 Answers
Let Character Controller jump. 0 Answers
Let Character Controller jump. 1 Answer
why does character controller accelerate off ledges? 1 Answer