- 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
![](https://koobas.hobune.stream/wayback/20220613135133im_/https://answers.unity.com/themes/thub/images/avi.jpg)
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