Как мне повторить действие в C #, чтобы исправить механизм прыжков - PullRequest
0 голосов
/ 19 мая 2019

Я создаю основную 2D-платформерную игру, однако механизм прыжков будет запущен только один раз и приземлится сразу после этого. Как мне это зациклить?

Я пробовал обнаруживать столкновения (из тега: Ландшафт), и это очень помогает, но все равно работает неправильно.

Это мой код:

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

public class PlayerController2D : MonoBehaviour
{
    private Rigidbody2D rb2D;

    private Vector2 velocity;

    Vector2 xvelocity = new Vector2(10, 0);
    Vector2 yvelocity = new Vector2(0, 10);

    public float jumptime;
    bool grounded = true;

    bool jump = false;

    void Start()
    {
        rb2D = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        if (Input.GetButton("Jump"))
        {
            jump = true;
        }

    }

    private void FixedUpdate()
    {
        //Debug.Log(Input.GetAxisRaw("Vertical"));
        if (left == true)
        {
            //Debug.Log("Left");
            rb2D.MovePosition(rb2D.position + -xvelocity * Time.fixedDeltaTime);
        }

        if (right == true)
        {
            //Debug.Log("Right"); 
            rb2D.MovePosition(rb2D.position + xvelocity * Time.fixedDeltaTime);
        }

        //if (jump == true && grounded == true)
        //{
        //    jumptime -= Time.fixedDeltaTime;
        //    if (jumptime > 0)
        //    {
        //        rb2D.MovePosition(rb2D.position + yvelocity * Time.fixedDeltaTime);
        //    }
        //    if (jumptime <= 0)
        //    {
        //        jump = false;
        //        jumptime = 2;
        //    }

        if (jump == true && grounded == true && jumptime > 0)
        {
            jumptime -= Time.fixedDeltaTime;
            rb2D.MovePosition(rb2D.position + yvelocity * Time.fixedDeltaTime);
        } else if (jumptime <= 0)
        {
            jump = false;
            jumptime = 2f;
        }

        //if (Time.fixedDeltaTime >= 2)
        //{
        //    jump = false;
        //    rb2D.MovePosition(rb2D.position + -yvelocity * Time.fixedDeltaTime);
        //}
    }

    void OnCollisionExit2D(Collision2D other)
    {
        Debug.Log("No longer in contact with " + other.transform.name);
        jump = true;
        grounded = false;
    }

    void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.gameObject.tag == "Terrain")
        {
            Debug.Log("Landed");
            jump = false;
            grounded = true;
        }
    }
}

Ожидаемый результат заключается в том, что действие «прыжок» будет повторяться в течение ~ 1 / 1,5 секунды с хорошей высотой (vector2 yvelocity), поэтому оно будет подпрыгивать выше и впоследствии падать (благодаря гравитации от твердого тела (2D) )

1 Ответ

0 голосов
/ 20 мая 2019

Как указано в комментариях, я думаю, что основная проблема связана с этой строкой кода.

if (jump == true && grounded == true && jumptime > 0)

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

if (jump && grounded && jumptime > 0)

Вам не нужно == true для логических значений.

В любом случае, чтобы решить ваш вопрос более простым способом, я бы предложилвы должны использовать AddForce вместо move (потому что вы все равно используете rigibody2d).

rb2D.AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse);

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

rb2D.MovePosition(rb2D.position + Vector2.left * xspeed * Time.fixedDeltaTime);

Ваш код станет:

public class PlayerController2D : MonoBehaviour
{
    private Rigidbody2D rb2D;

    private Vector2 velocity;

    public float jumpForce = 5;
    bool grounded = true;

    void Start() { rb2D = GetComponent<Rigidbody2D>(); }

    void Update()
    {
        if (Input.GetButton("Jump") && grounded)
            rb2D.AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse);

        //calculate horizontal speed here
        xspeed = ...;

    }

    private void FixedUpdate()
    {
        rb2D.MovePosition(rb2D.position + Vector2.left * xspeed * Time.fixedDeltaTime);
    }

    void OnCollisionExit2D(Collision2D other)
    {
        Debug.Log("No longer in contact with " + other.transform.name);
        grounded = false;
    }

    void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.gameObject.tag == "Terrain")
        {
            Debug.Log("Landed");
            grounded = true;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...