Как я могу заставить gameObject прыгать сначала быстро, а через некоторое время начать замедляться? Этот код работает не так, как предполагалось

Как я могу заставить gameObject прыгать сначала быстро, а через некоторое время начать замедляться? Этот код работает не так, как предполагалось. Вот именно то, что я хочу: когда игра запускается, gameObject воспроизводит анимацию ожидания, затем "Приседание", когда пользователь нажимает пальцем (приседание - это анимация, которую я сделал) и прыжок (сначала быстро, затем замедляется через некоторое время, как гравитация на Луне, скажем), когда они отпускают палец. Это все! Чтобы вам было лучше видно, возьмем, к примеру, главного героя в Crossy Road: когда пользователь нажимает, курица «приседает», а когда пользователь отпускает палец, курица прыгает. Та же концепция, но прыжок будет другим.

public float startSpeed;
public float slowAmount;
float actualSpeed;
bool isJumping;

void Awake()
{
    gameObject.GetComponent<Animation>()["Idle"].wrapMode=WrapMode.Loop;
    gameObject.GetComponent<Animation>() ["TouchDown"].wrapMode = WrapMode.Once;
}

void Start()
{
    GetComponent<Animation>().Play("Idle");
}

void Update()
{
    if (Input.touchCount > 0) 
    {
        if (Input.GetTouch (0).phase == TouchPhase.Began) 
        {
            GetComponent<Animation> ().Play ("TouchDown");
        }
        if (Input.GetTouch (0).phase == TouchPhase.Ended) 
        {
            actualSpeed = startSpeed;
            isJumping = true;
        }
        if (isJumping) 
        {
            actualSpeed -= slowAmount * Time.deltaTime;
            transform.position += new Vector3 (0.5f, actualSpeed * Time.deltaTime, 0);
        } 

    }
}

person Community    schedule 24.08.2015    source источник


Ответы (1)


Добавьте еще одну переменную с именем startY типа float (private).

void Update(){
    if (Input.touchCount > 0) {
        if (Input.GetTouch (0).phase == TouchPhase.Began) 
            GetComponent<Animation> ().Play ("TouchDown");
        if (Input.GetTouch (0).phase == TouchPhase.Ended){
            actualSpeed = startSpeed;
            isJumping = true;
            startY = transform.position.y;
        }
    }
    if (isJumping) {
        actualSpeed -= slowAmount * Time.deltaTime;
        transform.position += new Vector3 (0, actualSpeed * Time.deltaTime, 0);
        if(startY > transform.position.y) isJumping = false;
    } 
}

И измените свою функцию обновления на это.

person Neven Ignjic    schedule 24.08.2015
comment
Это то, что я делал вначале. Он тоже не работал должным образом. Точно такая же проблема. - person ; 24.08.2015
comment
Не хотите объяснить проблему? - person Neven Ignjic; 24.08.2015
comment
Я выложу приватную ссылку на YouTube. - person ; 24.08.2015
comment
transform.position + = новый Vector3 (0, фактическая скорость * Time.deltaTime, 0); По какой-то причине вы добавили движение по оси X, установите его на ноль, как я сделал в ответе !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - person Neven Ignjic; 24.08.2015
comment
Видеть? На 0:06 он делает этот мини-прыжок. И кубик прыгает только при нажатии (долгое нажатие) после этого. - person ; 24.08.2015
comment
Проблема с мини-прыжком - это вы, я тестирую его в единстве, и он хорошо работает - person Neven Ignjic; 24.08.2015
comment
Я хочу, чтобы куб подпрыгивал при отпускании пальца, а не при долгом нажатии. - person ; 24.08.2015
comment
Меня не волнует, куда идет куб, поэтому я изменил значение x. - person ; 24.08.2015