Я хочу сделать это так, когда я прыгнул один раз с правым щелчком в воздухе, я не могу сделать это снова - PullRequest
0 голосов
/ 09 марта 2020

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

здесь мой текущий сценарий движения:

public class Move2D : MonoBehaviour 
{
    public float moveSpeed = 5f;
    public bool isGrounded = false;

    void Update()
    {
        Jump();
        Vector3 movement = new Vector3(Input.GetAxis("Horizontal"), 0f, 0f);
        transform.position += movement * Time.deltaTime * moveSpeed;
    }

    void Jump()
    {
        if (Input.GetButtonDown("Jump") && isGrounded == true)
        {
            gameObject.GetComponent<Rigidbody2D>().AddForce(new Vector2(0f, 8f), ForceMode2D.Impulse);
        }

        if (Input.GetMouseButtonDown(1) && isGrounded == false)
        {
            gameObject.GetComponent<Rigidbody2D>().AddForce(new Vector2(0f, 4f), ForceMode2D.Impulse);
        }
    }
}

Вот мой текущий сценарий «заземления»

public class Grounded : MonoBehaviour

    {
    GameObject Player;
    // Start is called before the first frame update
    void Start()
    {
        Player = gameObject.transform.parent.gameObject;
    }

    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.collider.tag == "Ground")
        {
            Player.GetComponent<Move2D>().isGrounded = true;
        }
    }

    private void OnCollisionExit2D(Collision2D collision)
    {
        if (collision.collider.tag == "Ground")
        {
            Player.GetComponent<Move2D>().isGrounded = false;
        }
    }
}

Я следовал этому сценарию на YouTube. Пожалуйста, ответьте, если мне нужно предоставить больше информации для будущего поста. Я очень плохо знаком с кодированием.

Ответы [ 2 ]

0 голосов
/ 09 марта 2020

Сначала всегда сохраняйте ссылки, чтобы не выполнять ненужную работу!

Тогда я бы go наоборот:

  • Заземленный скрипт знает только, является ли он заземлен или нет.

  • Move2D активно запрашивает это значение и не устанавливает его откуда-либо еще «магическим образом».

In ваш заземленный скрипт у меня будет только

public class Grounded : MonoBehaviour
{
    // Read-only public property
    public bool IsGrounded { get; private set; }

    private void OnCollisionEnter2D(Collision2D collision)
    {
        // Note: Rather use CompareTag instead of == !
        // it is not only faster but also secure against typos. 
        // == would fail silently while CompareTag throws an exception 
        // indicating that you passed an invalid tag
        if (collision.collider.CompareTag("Ground"))
        {
            IsGrounded = true;
        }
    }

    private void OnCollisionExit2D(Collision2D collision)
    {
        if (collision.collider.CompareTag("Ground"))
        {
            IsGrounded = false;
        }
    }
}

Тогда, если я правильно понимаю, вы можете добавить один простой флаг bool CanDoubleJump, который доступен только один раз после прыжка и сбрасывается в false после того, как он был использован. Таким образом, Move2D может выглядеть как

public class Move2D : MonoBehaviour
{
    // Already reference this via drag&drop in the Inspector
    [SerializeField] private Rigidbody2D _rigidbody;

    // I would also go this way round and let the Move2D script
    // actively check for the value instead of getting it set from somewhere else
    [SerializeField] private Grounded _grounded;

    // As fallback get it once on runtime
    private void Awake ()
    {
        if(!_rigidbody) _rigidbody = GetComponent<Rigidbody2D>();
        if(!_grounded) _grounded = GetComponentInChildren<Grounded>(true);
    }


    private bool CanDoubleJump;

    private void Update()
    {
        Jump();
        // Note instead of going through the transform which breaks the Physics
        // I would rather simply set the velocity and let the Rigidbody itself handle the rest
        _rigidbody.velocity = new Vector2(Input.GetAxis("Horizontal") * Time.deltaTime * moveSpeed, _rigidbody.velocity.y);
    }

    private void Jump()
    {
        // Checking the bool flag is cheaper so do it first
        if (_grounded.IsGrounded && Input.GetButtonDown("Jump"))
        {
            _rigidbody.AddForce(Vector2.up * 8f, ForceMode2D.Impulse);
            CanDoubleJump = true;
        }
        // I would add else since anyway both can't be true at the same time
        else if (CanDoubleJump && !_grounded.IsGrounded && Input.GetMouseButtonDown(1))
        {
            _rigidbody.AddForce(Vector2.up * 4f, ForceMode2D.Impulse);
            CanDoubleJump = false;
        }
        // Reset the flag if it wasn't used just in case
        else if(_grounded.IsGrounded)
        {
            CanDoubleJump = false;
        }
    }
}

Напечатано на смартфоне, но я надеюсь, что идея проясняется

0 голосов
/ 09 марта 2020

Таким образом, у вас уже есть isGrounded, чтобы предотвратить двойное нажатие клавиши прыжка (пробел, я думаю, вы сказали), и что logi c будет достаточно простым, чтобы работать, чтобы предотвратить двойное повышение:

  • добавьте новую глобальную переменную isBoosted (добавьте ее в isGrounded);
  • при прыжке, а также добавьте импульс вашему мобу, также установите isBoosted в false;
  • , когда вы щелкаете правой кнопкой мыши для второго перехода, проверьте, что isBoosted ложно;
  • внутри кода для щелчка правой кнопкой мыши, установите isBoosted в значение true, а также как добавление еще большего импульса к вашей модели.

При первом повышении вы установите isBoosted в значение true, при второй попытке повысить его не удастся, так как тест для isBoosted ложь потерпит неудачу. Когда вы падаете на землю и снова используете место, чтобы прыгнуть, он сбрасывается, поэтому каждый раз, когда вы «перезагружаетесь», вы получаете новый импульс.

Это «лучший» способ сделать это? Наверное, нет, но это соответствует тому, что у вас уже есть ...

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