Как я могу использовать цикл, чтобы мой персонаж мог двойной прыжок? - PullRequest
0 голосов
/ 21 ноября 2018

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

public class SimplePlatformController : MonoBehaviour
{

    [HideInInspector]
    public bool facingRight = true;
    [HideInInspector]
    public bool jump = false;
    public float moveForce = 365f;
    public float maxSpeed = 5f;
    public float jumpForce = 1000f;
    public Transform groundCheck;




    private bool grounded = false;
    private Animator anim;
    private Rigidbody2D rb2d;


    // Use this for initialization
    void Awake()
    {
        anim = GetComponent<Animator>();
        rb2d = GetComponent<Rigidbody2D>();                        
    }

    // Update is called once per frame
    void Update()
    {
        for (int i = 0; i <= 1; i++) 
       {
            grounded = Physics2D.Linecast(transform.position, groundCheck.position, 1 << LayerMask.NameToLayer("Ground"));

            if (Input.GetButtonDown("Jump") && grounded)
            {
                i = 0;  
                jump = true;

            }

            if (Input.GetButtonDown("Jump") && !grounded)
            {
                jump = true;
                i = i + 1;
            }

        }
    }

    void FixedUpdate()
    {
        float h = Input.GetAxis("Horizontal");

        anim.SetFloat("Speed", Mathf.Abs(h));

        if (h * rb2d.velocity.x < maxSpeed)
            rb2d.AddForce(Vector2.right * h * moveForce);

        if (Mathf.Abs(rb2d.velocity.x) > maxSpeed)
            rb2d.velocity = new Vector2(Mathf.Sign(rb2d.velocity.x) * maxSpeed, rb2d.velocity.y);

        if (h > 0 && !facingRight)
            Flip();
        else if (h < 0 && facingRight)
            Flip();

        if (jump)
        {
            anim.SetTrigger("Jump");
            rb2d.AddForce(new Vector2(0f, jumpForce));
            jump = false;
        }
    }


    void Flip()
    {
        facingRight = !facingRight;
        Vector3 theScale = transform.localScale;
        theScale.x *= -1;
        transform.localScale = theScale;
    }

}

1 Ответ

0 голосов
/ 21 ноября 2018
Цикл

A for не подходит для этого, потому что вы хотите только продвинуть счетчик, если прыгаете.и вам нужно выйти из цикла, когда пришло время для завершения кадра.Теоретически, вы можете сделать это с помощью цикла while в Coroutine, но это неоправданно сложно.

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

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

Если вы хотитебыть в состоянии выполнить двойной прыжок после того, как вы просто выйдете с платформы, вы захотите установить счетчик прыжков на 0 в любое время, когда grounded установлен на true.

Объединение всех этих предложенийможет выглядеть так:

public class SimplePlatformController : MonoBehaviour
{

    // ...

    private int airJumpCount = 0; // Add this counter

    // ...

    // Update is called once per frame
    void Update()
    {
        grounded = Physics2D.Linecast(
                transform.position, groundCheck.position, 
                1 << LayerMask.NameToLayer("Ground"));

        if (grounded) airJumpCount = 0; // reset the counter when grounded

        if (Input.GetButtonDown("Jump") && grounded)
        {
            jump = true;  
        }

        // Only enter the air jump block if we still have more air jumps
        if ( Input.GetButtonDown("Jump") && !grounded && airJumpCount < 1) 
        {
            airJumpCount++;
            jump = true;  
        }
    }

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