- Home /
A better way to do jumping?
I have a script that allows my player some basic movement with my gravity and I was going to ask if you guys had any better ways to do movement or jumping for a rigidbody. My jumping is really choppy and I can't jump when moving in any direction and after I try I can't jump any more. I would love some input or suggestions. Here's the script:
using UnityEngine;
using System.Collections;
//
//THIS SCRIPT CONTROLS THE MOVEMENT OF THE PLAYER
//
[RequireComponent (typeof (Rigidbody))]
public class PlayerMovement : MonoBehaviour
{
//ALL OF THE PUBLIC VARIABLES
public float walkSpeed = 8.0f;
public float strafeSpeed = 7.5f;
public float runSpeed = 11.0f;
public float jumpForce = 8.0f;
//ALL OF THE PRIVATE VARIABLES
private Vector3 moveDirection;
private float groundedDistance = 1.0f;
private bool grounded;
void Start ()
{
grounded = true;
}
void Update ()
{
moveDirection = new Vector3 (Input.GetAxisRaw ("Horizontal"), 0 , Input.GetAxisRaw ("Vertical")).normalized;
}
void FixedUpdate()
{
//CHECK TO SEE IF THE PLAYER IS GROUNDED OR NOT
RaycastHit hit;
Ray ray = new Ray(transform.position, -Vector3.up);
if (Physics.Raycast (ray, out hit))
{
if(hit.distance - 0.5f <= groundedDistance)
{
grounded = true;
}
else{
grounded = false;
}
}
//THE SPEED OF THE PLAYER
float speed = walkSpeed;
//WALKING
rigidbody.MovePosition (rigidbody.position + transform.TransformDirection(moveDirection) * speed * Time.deltaTime);
//JUMPING
if (Input.GetKeyUp (KeyCode.Space) && grounded == true)
{
rigidbody.AddForce (transform.up * jumpForce, ForceMode.Impulse);
}
}
}
Answer by sickb0y247 · May 28, 2014 at 10:38 AM
// IN UPDATE FUNCTION
if ( character.isGrounded ){
{
if (Input.GetKey(KeyCode.W))
Jump();
}
}
if(jumped)
velocity = Vector3.up * jumpSpeed;
movement += velocity;
movement += Physics.gravity;
movement *= Time.deltaTime;
// Actually move the character
character.Move( movement );
// EXTRA FUNCTIONS
function Jump(){
jumped = true;
currentAnimation = "jump";
Invoke("EndJump", jumpTime);
}
function EndJump(){
jumped = false;
}
this worked for me and lets you tweak your jump pretty easily to however you want it. jumpSpeed is actually more like jump power, how much he will be moving upward every update (keep in mind it's against the gravity). jumptime is how long the power will be added to the jump. Toy with these two and the gravity and you'll have a nice smooth (more unrealistic jump) if that's what you're going for. My jumpSpeed is 5 and my jumpTime is 1 with the gravity set to -3. My guy looks like he should be in the NBA ;)
Answer by Darwin Mecharov · May 26, 2014 at 04:53 AM
Try changing Line 55 to Vector3.up instead of transform.up. After that, change your jump force to a higher value or you won't see much change, about 200 works for me.
EDIT: I don't get your timer much, but a simple coroutine timer works fine for me. Hope this helps:
if(Input.GetKey(KeyCode.Space) && !jumped)
{
rigidbody.AddForce(Vector3.up * JumpHeight);
jumped = true;
Invoke("JumpDelayer", 1);
}
function JumpDelayer ()
{
jumped = false;
}
Your answer
Follow this Question
Related Questions
The name 'Joystick' does not denote a valid type ('not found') 2 Answers
Controlling direction while jumping using CharacterController 1 Answer
Player movement 0 Answers
Lerp & jumping with sin/cos 1 Answer
Character pass trought wall... 1 Answer