как сделать так что бы при нажатии на кнопку персонаж прыгал?
написал код о самом прыжке и на проверку есть ли под ногами земля.
на сам спрайт повесил button кинул своего перса и метод на прыжок в спрайт, однако ничего неработает, я знаю что нужно написать функцию о том что при нажатии на кнопку перс должен прыгать, но незнаю как
сцена: 
Ответы (1 шт):
Если это код из какого-то урока, то я не советую его смотреть дальше, а найти замену. Официальный курс от 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 и любой коллайдер, а на земле просто коллайдер.
Как поворачивать спрайт, думаю сами разберетесь.
