- Home /
Why am I losing some inputs on Update function?
I wrote a simple C# script to control my character using CharacterController component, but I'm losing some Inputs from "Jump" button and I don't know what is happening.
My logic is very simple: I'm reading the input and calculating the next movement to be done in Update function and using CharacterController.Move on FixedUpdate function with the movement calculated before.
Here is my code:
using UnityEngine;
using System.Collections;
[RequireComponent (typeof(CharacterController))]
public class SimpleCharacterController : MonoBehaviour {
//-------------------------- ATTRIBUTES --------------------------
public float MoveSpeed = 4.0f;
public float GravityForce = 0.3f;
public float JumpStrength = 0.1f;
public string JumpButton = "Jump";
private float verticalSpeed = 0.0f;
private Vector3 finalMovement = Vector3.zero;
private UnityEngine.CharacterController controller;
//------------------------- AWAKE FUNCTION -----------------------------
public virtual void Awake()
{
controller = GetComponent<UnityEngine.CharacterController>();
}
//------------------------- UPDATE FUNCTION ----------------------------
public void Update()
{
// Calculate character movement horizontally(x, z = movement) and vertically(y = gravity/jump)
this.finalMovement = calculeMovement () + calculeGravityJump ();
}
private Vector3 calculeMovement()
{
float horizontal = Input.GetAxis("Horizontal");
float vertical = Input.GetAxis("Vertical");
return
transform.forward * vertical * MoveSpeed * Time.deltaTime +
transform.right * horizontal * MoveSpeed * Time.deltaTime;
}
// This method saves the current vertical speed to calculate the movement in the next updates
private Vector3 calculeGravityJump()
{
// If the character is on the ground, vertical movement is nullified
if (controller.isGrounded)
{
verticalSpeed = 0.0f;
}
// If character isn't on the ground, apply gravity to the vertical movement
else
{
verticalSpeed = Mathf.Max(
- GravityForce, // Limits maximum fall speed
verticalSpeed - GravityForce * Time.deltaTime // Apply gravity to current speed
);
}
// If press to jump and is able to jump, add vertical force
if (Input.GetButtonDown(JumpButton) && isAbleToJump())
{
verticalSpeed = JumpStrength;
}
return Vector3.up * verticalSpeed;
}
public bool isAbleToJump()
{
return controller.isGrounded; // A character is able to jump whenever it is on ground
}
//-------------------------- FIXED UPDATE -----------------------------
public void FixedUpdate ()
{
this.controller.Move (this.finalMovement);
}
}
Thank you for the help.
Any chance you are getting slow frames (spikes in performance) where two Jumps would occur in a single frame?
I don't know how to precisely check this... $$anonymous$$y game is running at around 76~84 fps. But I think even if this happens, the character would jump normally because in one of the frames the player pressed Jump button. No?
Your answer
Follow this Question
Related Questions
The name 'Joystick' does not denote a valid type ('not found') 2 Answers
Input.GetAxis won't start working properly. 1 Answer
How to modify the base movement speed of the character in JS 1 Answer
Mouse movement swings character around in circles 1 Answer
Simple rigidbody.AddForce only applying once each time key is pressed 1 Answer