Как проверить касания объекта до пола unity
Объект (персонаж) может делать прыжки в воздухе при нажатии пробела, а мне надо чтобы он мог это делать только находясь на земле. Мне нужна помощь. Там, где нужно сделать эту проверку я пометил восклицательными знаками.
void FixedUpdate()
{
rb.AddForce(0, 0, runSpeed * Time.deltaTime);
if (strafeLeft)
{
rb.AddForce(-strafeSpeed * Time.deltaTime, 0, 0, ForceMode.VelocityChange);
}
if (strafeRight)
{
rb.AddForce(strafeSpeed * Time.deltaTime, 0, 0, ForceMode.VelocityChange);
}
if (doJump)
{
if () // !!!!!
{
doJump = false; //Не делать прыжок
} else
{
rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse); //Если персонаж касается пола, сделать прыжок
doJump = false;
}
}
if (rb.velocity.magnitude > runSpeed) //Если скорость объекта превышает максимальную скорость
{
rb.velocity = rb.velocity.normalized * runSpeed; //Задать скорость на уровне максимальной
}
}
Ответы (1 шт):
Сразу дам две ссылки:
- Полное описание того, как правильно реализовывать физическое и нефизическое движение объектов: Правильная реализация передвижения персонажа
- Описание работы и применения функций OnCollisionEnter, OnCollisionExit и так далее: Функции событий столкновений: OnCollisionEnter, OnCollisionEnter2D, OnCollisionStay, OnTriggerEnter
Вам нужно реализовать простейшую систему:
- Земля имеет коллайдер и тег "Ground"
- Игрок имеет коллайдер
- Скрипт игрока имеет переменную isGrounded
- При начале коллизии с землей игрок становиться "приземленным": isGrounded=true
- При окончании коллизии с землей игрок становиться "летающим": isGrounded=false
- Игрок может прыгать, только если isGrounded==true
В класс игрока стоит добавить:
private bool isGrounded;
private void OnCollisionEnter (Collision collision) {
if (collision.gameObject.tag == "Ground") {
isGrounded = true;
}
private void OnCollisionExit (Collision collision) {
if (collision.gameObject.tag == "Ground") {
isGrounded = false;
}
}
На том месте, где у вас восклицательные знаки:
...
if (isGrounded) {
...
Однако, как уже сказал Andrew в комментариях у вас очень много ошибок. Например, вы реализовываете движение в FixedUpdate (подразумевая, что оно физическое), но при этом используете Time.deltaTime, хотя есть Time.fixedDeltaTime специально для FixedUpdate. Два условия (strafeRight), (strafeLeft) тоже выглядят как-то странно, к тому же у них в теле находится вызов одной и той же функции, только с противоположными параметрами strafeSpeed и -strafeSpeed. Да и вообще Time.deltaTime в AddForce выглядит странно (и еще странней, когда все это в FixedUpdate). В общем, читайте ссылочку, особенно первую.