Elf-Cat
@Elf-Cat

Unity, 2D: как сделать прыжок?

Короче, делаю 2D игру в Unity.
Должно быть, чтобы игрок не мог "лететь" в воздухе при нажатии на "вверх", а мог только подпрыгнуть один раз. Конечно, когда отпускаю клавишу "вверх", игрок резко падает. Rigidbody2D на игроке висит… И так голову ломаю, и сяк - не понимаю, где косяк. Код:

using UnityEngine;

public class PlayController : MonoBehaviour 
{

    public Vector2 speed = new Vector2(50, 50);
    private Vector2 movement;
    Rigidbody2D rigidbody2D;
    public Vector2 jumpHeight;

        void Awake()
    {
        rigidbody2D = GetComponent<Rigidbody2D>();
        GetComponent<Rigidbody2D>().AddForce(jumpHeight, ForceMode2D.Impulse);
    }

	void Update () 
    {
        float inputX = Input.GetAxis("Horizontal");
        float inputY = Input.GetAxis("Vertical");

        movement = new Vector2
            (speed.x * inputX,
             speed.y * inputY);
	}

    void FixedUpdate()
    {
        rigidbody2D.velocity = movement;
    }

}
  • Вопрос задан
  • 27114 просмотров
Решения вопроса 1
@youkerni
Unity3D developer
Что нужно что бы все заработало:
1) Скопировать код.
2) Объект на котором висит Rigidbody должен иметь этот скрипт и коллайдер (обязательно 2д, не триггер)
3) Пол (то, с чем соприкасается объект игрока) должен иметь Layer "Ground" и коллайдер2д (не триггер)

Суть в том, что при вводе вы должны запоминать факт ввода клавиши прыжка и игнорировать его до приземления (для этого использован метод OnCollisionEnter2D)

Исходя из этого дополните Ваш пример как Вам угодно.

public class PlayerController : MonoBehaviour
{
    Rigidbody2D m_Rigidbody;
    readonly Vector2 force = new Vector2(50, 50);
    bool inAir;

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

    void Update()
    {
        if (Input.GetKey(KeyCode.Space) && !inAir)
        {
            inAir = true;
            m_Rigidbody.AddForce(force);
        }
    }

    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.gameObject.layer == LayerMask.NameToLayer("Ground"))
            inAir = false;
    }
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@spaceatmoon
Пробовали это?

Тык
Ответ написан
@Eugeny1987
Работаю с HostCMS
Перед прыжком делайте проверку на то что персонаж стоит на какой-либо поверхности
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы