@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;
        }
    }
}
  • Вопрос задан
  • 146 просмотров
Решения вопроса 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...
правда нужно добавить проверку на двойной прыжок и возможно прибавлять вектор, а не приравнивать
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы