Переместите игрока, а затем измените сцену

У меня проблема. Я хочу, чтобы если игрок щелкнул StudyOutDoor, сначала объект двинулся к двери, а затем изменил сцену в Unity. вот мой код:

if (Physics.Raycast (clickPoint, out hitPoint)) {
                    if (hitPoint.collider.name == "StudyOutDoor") {
                        target.y = transform.position.y;
                        target.z = transform.position.z;
                        transform.position = Vector3.MoveTowards (transform.position, target, playerSpeed * Time.deltaTime);
                        sceneNumber = 3;
                        Application.LoadLevel("Corridor");
                    }

Но это просто смена сцены без продвижения к той позиции, о которой я сказал. Пожалуйста помоги.


person Ali Salehi    schedule 21.05.2015    source источник
comment
Да, вызов MoveTowards перемещает вашего игрока в данные в момент вызова. Но визуальные эффекты будут обновляться только после окончания текущего кадра. Этого никогда не происходит, потому что вы сразу же загружаете следующую сцену. Похоже, вы хотите плавно переместить игрока к цели. прямо сейчас ваш игрок движется к цели примерно за 0,016 секунды. Использование сопрограмм, вероятно, было бы наиболее эффективным решением.   -  person Noel Widmer    schedule 21.05.2015


Ответы (1)


объект движется к двери, просто вы его не видите, потому что загружаете новый уровень в том же кадре. что происходит подробно:

  1. начинается новый кадр
  2. луч брошен и попал
  3. вы назначаете целевую позицию
  4. вы меняете позицию преобразования в сторону целевой позиции
  5. уровень начинает загружаться
  6. начинается новый кадр

что ты хочешь делать:

  1. начинается новый кадр
  2. луч брошен и
  3. вы назначаете целевую позицию
  4. вы меняете позицию преобразования в сторону целевой позиции
  5. начинается новый кадр
  6. вы повторяете шаг 4. пока объект не достигнет целевого положения (это длится много кадров)
  7. когда объект достигает целевой позиции, вы загружаете новый уровень

для этого вы должны установить логический флаг, который перемещает объект только при попадании луча

псевдокод:

update()
{
    if( ray cast hit )
    {
        calculate target position
        set flag to true
    }
    if( flag )
    {
        move object to target position
        if( object reached target position )
        {
            load new level
        }
    }
}
person Jinjinov    schedule 21.05.2015