@Fjfgs

Как можно улучшить код этот прыжка?

Я прошу вас посмотреть этот код реализации прыжка для телефонов(пока что я не имею доступа к ПК). Можно ли улучшить код и если да, то как? Я тут вижу 1 проблему. Transform.position телепортирует объект, а этот подход в корне неправильный, ведь персонаж будет входить в колайдер другого объекта. Или я не прав?
using UnityEngine;

public class PhysicsJump : MonoBehaviour
{
    [SerializeField] private AnimationCurve YAnimation;
    
    [SerializeField] private PhysicsMovement Movement;
    
    private float ExpiredTime;
    private float Duration = 1;
    
    private float Height = 5;
    
    private bool IsJumping;
    
    private bool IsOnGrounded;
    
    private void Update()
    {
        if (IsJumping)
        {
            Movement.Speed = 40;
            
            ExpiredTime += Time.deltaTime;
            
            if (ExpiredTime > Duration)
            {
                ExpiredTime = 0;
            }
            
            float progress = ExpiredTime / Duration;
            
            transform.position = new Vector3(0, YAnimation.Evaluate(progress) * Height, 0);
        }
    }
    
    public void Jump()
    {
        if (IsOnGrounded)
        {
            IsJumping = true;
        }
    }
    
    private void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.tag == ("Ground"))
        {
            IsOnGrounded = true;
            
            IsJumping = false;
        }
    }
        
    private void OnCollisionExit()
    {
        if (collision.gameObject.tag == ("Ground"))
        {
            IsOnGrounded = false;
        }
    }
}
  • Вопрос задан
  • 138 просмотров
Решения вопроса 1
K0TlK
@K0TlK
Буллю людей.
Убери проверку по тэгу.
transform.position замени на Rigidbody.MovePosition.
Таймер из апдейта в корутину перемести и в Jump ее запускай. Чтобы остановить прыжок, закэшируй корутину и останавливай ее, когда нужно.
40 вынеси в отдельное поле.
Это у тебя не PhysicsJump, физики здесь никакой нет, это анимированный прыжок, переименуй. IsOnGrounded - "является на приземленный". grounded достаточно. У тебя IsOnGrounded всегда противоположно IsJumping. Зачем здесь два флага?
Это лишний монобех, перемести код отсюда в Movement свой. Если движение у тебя вдоль поверхности, то нормаль, которую ты получаешь при движении, можно использовать в качестве замены флагов grounded и jumping (если нормаль не нулевая, то можно прыгать, если нулевая, то прыжок происходит). Соответственно, теперь тебе не нужны тэги, т.к. землю ты проверяешь через нормаль, флаги, по той же причине, не нужен апдейт, т.к. анимация происходит в корутине, не нужен лишний монобех, чтобы не делать из объекта кучу монобехов. Остается только паблик метод Jump и корутина.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@NIKROTOS
Начинающий программист.
разрабы юнити предлагают такой вариант:
https://docs.unity3d.com/ru/530/ScriptReference/Ri...
правда нужно добавить проверку на двойной прыжок и возможно прибавлять вектор, а не приравнивать
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
SberDevices Санкт-Петербург
от 230 000 ₽
от 100 000 до 200 000 ₽
ЛАНИТ Москва
До 150 000 ₽
01 окт. 2022, в 12:40
1000 руб./за проект
01 окт. 2022, в 12:39
30000 руб./за проект
01 окт. 2022, в 12:17
100000 руб./за проект