- Home /
Multiple jump C# Script.
I am attempting to remake the game of Joust. For it I need to be able to jump more than once and when in the air. If someone could assists me that would be fantastic. Here is the code I have so far.
using UnityEngine;
using System.Collections;
[RequireComponent(typeof(PlayerPhysics))]
public class PlayerController : MonoBehaviour {
// Player Handling
public float gravity = 20;
public float speed = 8;
public float acceleration = 30;
public float jumpHeight = 12;
private float currentSpeed;
private float targetSpeed;
private Vector2 amountToMove;
private PlayerPhysics playerPhysics;
void Start () {
playerPhysics = GetComponent<PlayerPhysics>();
}
void Update () {
targetSpeed = Input.GetAxisRaw("Horizontal") * speed;
currentSpeed = IncrementTowards(currentSpeed, targetSpeed,acceleration);
if (playerPhysics.grounded) {
amountToMove.y = 0;
// Jump
if (Input.GetButtonDown("Jump")) {
amountToMove.y = jumpHeight;
}
}
amountToMove.x = currentSpeed;
amountToMove.y -= gravity * Time.deltaTime;
playerPhysics.Move(amountToMove * Time.deltaTime);
}
// Increase n towards target by speed
private float IncrementTowards(float n, float target, float a) {
if (n == target) {
return n;
}
else {
float dir = Mathf.Sign(target - n); // must n be increased or decreased to get closer to target
n += a * Time.deltaTime * dir;
return (dir == Mathf.Sign(target-n))? n: target; // if n has now passed target then return target, otherwise return n
}
}
}
Is there a bug with it, right now, or are you looking for help managing the multi-jump in some way, like a max jump count?
Looking for help managing the multi-jump. A jump count.
Answer by rutter · Nov 14, 2013 at 01:55 AM
As you can probably imagine, we're going to need to change this bit:
if (playerPhysics.grounded) {
amountToMove.y = 0;
// Jump
if (Input.GetButtonDown("Jump")) {
amountToMove.y = jumpHeight;
}
}
First, we need to keep track of how many jumps the player has left. We can reset it each time they touch the ground.
Second, instead of restricting jumps based on touching the ground, we can restrict them based on the number of jumps remaining.
So, we could define some member variables for your class:
const int MAX_JUMPS = 3;
int jumpsLeft = MAX_JUMPS;
And then tweak your update code, something like this:
//reset when player touches the ground
if (playerPhysics.grounded) {
jumpsLeft = MAX_JUMPS;
amountToMove.y = 0;
}
//player can jump up to MAX_JUMP times between resets
if (jumpsLeft > 0 && Input.GetButtonDown("Jump")) {
amountToMove.y = jumpHeight;
jumpsLeft -= 1;
}
From there, you could add other features...
Do you want a cooldown on the jump? Track Time.time, track its current value against the timestamp when jump was last pressed.
Do you want to limit extra jumps to the "peak" of their current jump? The player's y-velocity will approach zero while they're at the top of the jump's parabola, so you can use Mathf.Abs(amountToMove.y) to see if it's below some small value.
You can always add sounds, visual effects, or other feedback, too.
Afraid that didn't work for me. Could you possibly explain it more? I'm not really a programmer so I'm pretty new to C#
Answer by pelos · Jun 29, 2014 at 06:51 AM
since onCollisionStay might activate and then the RBD is to close will catch the onCollisionStay()
i change the code to use onCollisionStay, and onCollisionExit, and left a public variable so the user can control the amount of jumps
the first time you jump you start counting how many times you jumped, but for that you need to be grounded, click the jump for the secundary jumps you need to press the jump key, have at least one jump all ready and have less than the maximum.
when you toucht the ground the counter reset and you can start all over again.
the cool thing about this is that you can use the counter in another method to play difernet animations for each jump.
inside the update method you want to use the jump()
void Update ()
{
jump ();
//print (counter);
}
private int counter = 0;
public int amountOfJumps = 3;
private bool grounded = true;
void jump()
{
if (grounded == true && Input.GetButtonDown("Jump") == true && amountOfJumps >= counter )
{
grounded = false;
counter += 1;
rigidbody.velocity = new Vector3 (0f, 10f, 0f);
}
if (Input.GetButtonDown ("Jump") == true && amountOfJumps >=counter &&counter >= 1)
{
counter += 1;
rigidbody.velocity = new Vector3 (0f, 10f, 0f);
}
}
void OnCollisionEnter ()
{
grounded = true;
counter = 0;
}
void OnCollisionExist ()
{
grounded = false;
}
Your answer
Follow this Question
Related Questions
Multiple jump C# Script. 0 Answers
jump with character controller best way? 1 Answer
Not able to jump 1 Answer