Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Персонаж может прыгать бесконечное количество раз, как это исправить?

Артёмова Анастасия Ученик (111), закрыт 1 неделю назад
Скрипт прыжка срабатывает до тех пор пока ты нажимаешь пробел снова и снова, не могу понять как сделать так, чтобы прыгать он мог максимум 2 раза. Помогите пожалуйста!
 using UnityEngine; 

public class playermovement : MonoBehaviour
{
public gamemanager gm;
public Rigidbody rb;
public float strafeSpeed = 50f;
public float runspeed = 50f;
public float jumpForce = 10f;

protected bool strafeForward = false;
protected bool strafeBack = false;
protected bool strafeRight = false;
protected bool strafeLeft = false;
protected bool dojump = false;

void Update()
{
if (Input.GetKey("w"))
{
strafeForward = true;
}
else
{
strafeForward = false;
}
if (Input.GetKey("s"))
{
strafeBack = true;
}
else
{
strafeBack = false;
}
if (Input.GetKey("d"))
{
strafeRight = true;
}
else
{
strafeRight = false;
}
if (Input.GetKey("a"))
{
strafeLeft = true;
}
else
{
strafeLeft = false;
}
if (Input.GetKeyDown("space"))
{
dojump = true;
}
if (transform.position.y < -15f)
{
gm.EndGame();
Debug.Log(")= ыВы упали =(");
}
if (dojump)
{
dojump = true;
}

}
void FixedUpdate()
{
rb.AddForce(0, 0, runspeed * Time.deltaTime);
if (strafeForward)
{
rb.AddForce(0, 0, strafeSpeed * Time.deltaTime, ForceMode.VelocityChange);
}
if (strafeBack)
{
rb.AddForce(0, 0, -strafeSpeed * Time.deltaTime, ForceMode.VelocityChange);
}
if (strafeLeft)
{
rb.AddForce(-strafeSpeed * Time.deltaTime, 0, 0, ForceMode.VelocityChange);
}
if (strafeRight)
{
rb.AddForce(strafeSpeed * Time.deltaTime, 0, 0, ForceMode.VelocityChange);
}
if (dojump)
{
rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
dojump = false;
if (dojump)
{
dojump = true;
}
else
{
dojump = false;
}
}

}
}
Лучший ответ
Сергей Гений (57235) 1 месяц назад
ввести переменную для блокировки прыжка (во избежание спама)
и счетчик прыжков

если (нажата клавиша прыжка и блокировка снята и счетчик меньше двух )
{dojump = true; включить блокировку, увеличить счетчик на 1}
иначе {снять блокировку}

если (персонаж стоит на твердой поверхности) {обнулить счетчик}

Так при удерживании клавиши пробел будет удерживаться и блокировка, не позволяющая делать прыжок. Т.е. нужно отжать и нажать снова для повторного прыжка.
Если нажать прыжок после прыжка (в полете) то счетчик увеличится до 2 и заблокирует прыжки до тех пор, пока не коснешься поверхности.

Кстати:
 if (Input.GetKey("w"))  
{
strafeForward = true;
}
else
{
strafeForward = false;
}
это тоже самое что
 strafeForward = Input.GetKey("w")); 
Ну и далее в том же духе.
Остальные ответы
666 Мастер (1978) 1 месяц назад
  
public class playermovement : MonoBehaviour
{
public gamemanager gm;
public Rigidbody rb;
public float strafeSpeed = 50f;
public float runspeed = 50f;
public float jumpForce = 10f;

protected bool strafeForward = false;
protected bool strafeBack = false;
protected bool strafeRight = false;
protected bool strafeLeft = false;
protected bool dojump = false;

// Счетчик прыжков
private int jumpCount = 0;

void Update()
{
// ... остальной код ...

if (Input.GetKeyDown("space") && jumpCount < 2)
{
dojump = true;
jumpCount++;
}

// ... остальной код ...
}

void FixedUpdate()
{
// ... остальной код ...

if (dojump)
{
rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
dojump = false;
}
}
}
Чтобы персонаж мог прыгать максимум 2 раза, можно добавить счетчик прыжков и проверять его значение в методе FixedUpdate(). Например:

В этом коде:

* Счетчик прыжков jumpCount инициализируется как 0.
* В методе Update() проверяется, было ли нажато пробел и значение jumpCount меньше 2. Если оба условия выполняются, увеличивается jumpCount и устанавливается dojump в true.
* В методе FixedUpdate() проверяется, установлен ли dojump в true, и если это так, выполняется прыжок. После этого dojump сбрасывается в false.

Таким образом, персонаж сможет прыгать максимум 2 раза, после чего прыжки будут деактивированы.
Артёмова АнастасияУченик (111) 1 месяц назад
Спасибо огромное, только учусь, еще много не знаю, если стану отличным разработчиком, обязательно вспомню добрым словом!
666 Мастер (1978) Артёмова Анастасия, Советую пользоваться @gpt_lama_bot он поможет с кодом.
Патрик Бейтмен Гуру (2843) 1 месяц назад
Сделай так чтобы кнопка могла нажиматься только тогда, когда игрок касается земли, я так делал, получилось
Похожие вопросы