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?
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#
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()
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?
– rutterLooking for help managing the multi-jump. A jump count.
– Breckenridge119Max jump count, jump manager.
– Breckenridge119