как сделать так что бы при нажатии на кнопку персонаж прыгал?

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

скрипт: введите сюда описание изображения


Ответы (1 шт):

Автор решения: KOTlK

Если это код из какого-то урока, то я не советую его смотреть дальше, а найти замену. Официальный курс от Unity подойдет лучше, чем другие.

Во-первых, вы пытаетесь определить столкновение с объектом, вызывая метод OnJumpButton в Update. Но ведь OnJumpButton должен вызываться только, когда кнопка прыжка нажата.

Во-вторых, вы при передвижении персонажа двигаете его через transform, а при прыжке через Rigidbody. Так делать не следует, используйте что-то одно(Rigidbody).

В-третьих, про метод AddForce можете забыть, он не нужен для перемещения персонажа.

Далее покажу и расскажу как сделать все правильнее.

using UnityEngine;

[RequireComponent(typeof(Rigidbody2D))]
public class Hero : MonoBehaviour
{
    [SerializeField] private Vector2 _jumpVelocity; // Ускорение при прыжке
    [SerializeField] private float _runSpeed; // скорость персонажа
    private bool _isGrounded = false;
    private Rigidbody2D _rb;

    private void Awake()
    {
        _rb = GetComponent<Rigidbody2D>();
    }

    private void Update()
    {
        var horizontal = Input.GetAxis("Horizontal");
        Run(horizontal);
    }

    private void OnCollisionStay2D(Collision2D collision)
    {
        foreach(var i in collision.contacts)
        {
            if (i.normal.y > 0.8)
            {
                _isGrounded = true;
                break;
            }
        }
    }

    private void OnCollisionExit2D(Collision2D collision)
    {
        _isGrounded = false;
    }

    public void Jump()
    {
        if (_isGrounded)
        {
            _rb.velocity += _jumpVelocity;
        }
    }


    private void Run(float direction)
    {
        if (direction == 0) return;
        if (_isGrounded == false) return;

        var velocity = _rb.velocity;
        velocity.x = _runSpeed * direction;
        _rb.velocity = velocity;
    }

}

По-порядку:

[RequireComponent(typeof(Rigidbody2D))] нужно для того, чтобы на скрипте в любом случае был компонент Rigidbody2D. Если этого компонента не будет, то он автоматически добавится.

[SerializeField] Этот атрибут нужен для того, чтобы видеть приватные поля в инспекторе и иметь возможность их менять.

_rb = GetComponent<Rigidbody2D>(); Здесь получаем компонент RigidBody, который навешан на объект. Обязательно делайте [RequireComponent(typeof(ТипКомпонента))], если получаете его через GetComponent.

В апдейте мы получаем значения горизонтальной оси и вызываем метод Run().

OnCollisionStay2D вызывается, пока есть столкновение с каким-либо коллайдером. Здесь мы в цикле проходим все точки соприкосновения и, если нормаль этой точки проходит через ограничение, то присваиваем значение true полю _isGrounded. Что такое нормаль, можете загуглить.

OnCollisionExit2D вызывается, когда объекты перестают соприкосаться. Здесь просто меняет _isGrounded на false.

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

Run(float direction) здесь все тоже предельно просто. Не делаем ничего, если направление равно нулю и персонаж в воздухе. В ином случае берем то, что указано в поле _runSpeed и умножаем на направление движения (Если direction будет отрицательным, то движение будет в противоположную сторону), далее просто присваиваем это все ускорению персонажа по оси X.

Ну и, естественно, на персонаже должен висеть компонент Rigidbody2D и любой коллайдер, а на земле просто коллайдер.

Как поворачивать спрайт, думаю сами разберетесь.

→ Ссылка