Как сделать так, чтобы персонаж прыгал одним прыжком за раз в Unity 3D? - PullRequest
0 голосов
/ 07 февраля 2020

Я создал скрипт для прыжка моего персонажа, но он продолжает прыгать, когда я продолжаю нажимать кнопку. Я просто хочу, чтобы он прыгал один раз.

using UnityEngine;
[RequireComponent(typeof(Rigidbody))]

public class Jump : MonoBehaviour {
   Rigidbody rb;
   void Start()
   {
       rb = GetComponent<Rigidbody>();  
   }
   void Update()
   {
      if (Input.GetKeyDown(KeyCode.Space))
      {
         rb.AddForce(new Vector3(0, 5, 0), ForceMode.Impulse);
      }
   }
}

Ответы [ 4 ]

0 голосов
/ 08 февраля 2020

Чтобы добавить, создать векторы, коллайдеры и логические значения

private BoxCollider2D box;
Vector3 max = box.bounds.max;
Vector3 minValue = box.bounds.minValue;

Vector2 x = new Vector2(max.x, minValue.y -0.1f);
Vector2 y = new Vector2(minValue.x, minValue.y - 0.1f;

Collider2D ground = Physics2D.OverlapArea(x,y);
bool jump = (ground != null) ? true : false;
if (jump && Input.GetKeyDown(KeyCode.Space)) {
    //jump
}

Просто добавьте Векторы, чтобы проверить, где находится игрок, и Коллайдер, чтобы проверить, находится ли игрок на земле, и бул, который определяет, является ли прыжок разрешено, и вставьте bool с Input.GetKeyDown. Если bool равно true и клавиша нажата, тогда прыгайте.

0 голосов
/ 07 февраля 2020

Оставьте логическое значение типа canJump и установите его в false, когда игрок прыгает. Но вместо таймера, как кто-то уже предлагал, обычно вы используете Physics.Raycast, указывающий вниз от игрока, или какое-либо другое обнаружение столкновений, чтобы определить, когда игрок упал на землю, и установите canJump в true, когда это произойдет. Если вы используете число для canJump, а не bool, вы можете разрешить двойной прыжок.

0 голосов
/ 07 февраля 2020

Я бы порекомендовал метод, который возвращает логическое значение и проверяет, заземлен ли ваш персонаж. Такой метод реализован в едином интегрированном символьном контроллере . Реализация его по своему усмотрению может выглядеть так:

function IsGrounded(): boolean {
    return Physics.Raycast(transform.position, Vector3.down, collider.bounds.extents.y + offset);
}

Вы должны добавить небольшое смещение в случае неровности грунта. Если вы используете капсульный коллайдер на своем персонаже, вы можете использовать капсульный чек .

function IsGrounded(): boolean {
    return Physics.CheckCapsule(collider.bounds.center,new Vector3(collider.bounds.center.x,
                                collider.bounds.min.y-offset,collider.bounds.center.z),radius);
}

, в этом случае радиус должен быть радиусом вашего капсульного коллайдера и смещаться на небольшое значение. добавленное вами значение.

0 голосов
/ 07 февраля 2020

добавьте состояние или отметьте в хранилище состояние перехода, когда начнете переходить, установите для него значение true. В методе обновления проверьте флажок перед добавлением силы. измените флаг на false после времени простоя

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...