Вопрос о двойном прыжке и столкновении в Unity - PullRequest
0 голосов
/ 02 февраля 2019

Я только начал изучать, как сделать простую 2D-платформерную игру в Unity, и я посмотрел Blackthornprod 2D-платформерское видео о движении , чтобы узнать, как заставить персонажа двигаться и прыгать.До сих пор я был в состоянии понять большую часть видео, однако я столкнулся с некоторой проблемой с частью «Прыжки».

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

Итак, вот код:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    public float JumpForce;       // jumping force

    private bool isGrounded;      //if the player is touching the ground
    public Transform GroundCheck; //object that contains the position of the 
                                  //"circle"
    public LayerMask GroundLayer; //the layer that the "circle" collide with
    public float radius;          //radius of the circle
    public float BaseNumOfJumps;  //maximum number of jumps
    private float NumOfJumps;     //current number of jumps


    private Rigidbody2D rb;

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
        NumOfJumps = BaseNumOfJumps;
    }

    void FixedUpdate()
    {
        //check the collision between the "circle" and the ground
        isGrounded = Physics2D.OverlapCircle(GroundCheck.position, 
        radius,GroundLayer);

       //here is the horizontal movement update part, but they are 
       //irrelevant so I cut them off

    }

    void Update()
    {
        //if the player touches the ground, reset the number of jumps
        if (isGrounded)
        {
            NumOfJumps = BaseNumOfJumps;
        }

        //when jumping, decrease the number of jumps
        if (Input.GetKeyDown(KeyCode.UpArrow) && NumOfJumps > 0)
        {
            rb.velocity = Vector2.up * JumpForce;
            NumOfJumps--;
        }
    }

}

Здесь, где началась проблема, фактическое максимальное количество прыжков всегда выше, чем введенное мной значение.Так, например, если я поставлю BaseNumOfJumps = 2, то я могу прыгнуть 3 раза вместо 2, аналогично, если BaseNumOfJumps = 1, тогда я могу прыгнуть 2 раза и т. Д.

Через некоторое время я узналчто из-за того, что размер круга всегда немного больше, чем у фактического игрока, когда я прыгаю, был момент между тем, когда ноги игрока находятся в воздухе, но круг все еще перекрывается с землей, что сбрасываеттекущее количество прыжков (также называемое NumOfJumps в моем коде) и позволяющее моему персонажу сделать еще один прыжок, чем число, введенное в BaseNumOfJumps. Я не знаю, было ли это правдой или нет , но здесь было то, что я себе представлял . В этом комментарии к видео также описана та же проблема.

Хотя Blackthornprod уже упоминал это значение как «дополнительные прыжки», поэтому, если я введу «1» в этом значении, я прыгну дважды, «2», и я прыгаю 3 раза и т. Д. Я все еще сталкивался с некоторыми трудностями в согласовании количества прыжков.Что если мой персонаж просто соскользнет с земли, не прыгнув как этот ?Круг не столкнется с землей, и я смогу прыгнуть с точным количеством прыжков, которые я ввел в BaseNumOfJumps, короче:

Если максимальное количество прыжков, которые я ввел, равно 2, я смогуна (опять же, это всего лишь мое предположение, поэтому я могу ошибаться ):

Какойконечно создать некоторую несогласованность.Я искал другие учебники о прыжках и столкновениях, но большинство из них либо используют другие формы проверки столкновений (например, OnCollisionStay, OnCollisionEnter), либо используют тот же метод, который я использовал, но не углубился в объяснение этого (так что в основном они одинаковы)как в видео Blackthornprod)

Итак, как я могу решить эту проблему, как я могу изменить радиус «круга», чтобы он уходил от земли в тот же момент, когда ноги игрока уходят, когда они прыгают?Или я должен использовать другие формы проверки столкновений, как я уже упоминал ранее, и если да, то в чем их отличие и какая из них наиболее эффективна?

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

1 Ответ

0 голосов
/ 02 февраля 2019

Давайте получим концептуальное понимание того, что мы хотим сделать.Мы хотим, чтобы у игрока было одинаковое количество прыжков, независимо от того, прыгнут ли они первыми (с помощью одного прыжка) или нет (НЕ с помощью одного прыжка).Тем не менее, одна простая истина очевидна: наш заземленный прыжок не может быть использован, если мы не на земле. Мы можем добиться этого, отслеживая заземленные прыжки и прыжки в воздухе отдельно.

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

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

Все это рассмотрено дает нам следующую логику:

int numberOfJumps = 1; //Or however many you want.
boolean initiallyJumped = false;

//Other stuff
void Update()
{
    //Reset jumps BEFORE considering allowing jumps
    if(isGrounded)
    {
        initiallyJumped = false;
        resetJumpCounter();
    }

    if(Input.GetKeyDown(KeyCode.UpArrow))
    {
        if(!initiallyJumped && isGrounded)
        {
            jump();
            initallyJumped = true;
        }
        else
        {
            int jumpsRemaining = numberOfJumps;
            if(initiallyJumped)
            {
                jumpsRemaining--;
            }

            if(numberOfJumps > jumpsRemaining)
            {
                jump();
                numberOfJumps--;
            }
        }
    }
}

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

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