Напишите IEnumerator для движения - PullRequest
0 голосов
/ 07 мая 2020

Я хочу написать IEnumerator для перемещения на желаемое расстояние в указанное время. Я попытался написать код для этого, но он работает по-другому.

     float moveDistance=1f;
     float moveSpeed=5f;
     float elapsedDistance = 0f;

     while (elapsedDistance <= moveDistance)
     {
         elapsedDistance += Time.deltaTime * moveSpeed;

         Vector3 cubeLocalPosition = transform.localPosition;
         cubeLocalPosition.y += Time.deltaTime * moveDistance;
         transform.localPosition = cubeLocalPosition;
         yield return null;
     }

Благодаря этому коду объект не может пройти 1 единицу расстояния. Как исправить этот код?

Ответы [ 3 ]

0 голосов
/ 07 мая 2020

Ваше условие while l oop использует elapsedDistance, которое увеличивается с moveSpeed. Последний равен 5, поэтому он будет 1 из 1/5 секунды. Ваш объект, вероятно, перемещается только на 0,2 единицы.

вам следует использовать Mathf.Lerp или MoveTowards

float distance = 1f;
float time = 0f;
float period = 1f; // how long in second to do the whole movement
yield return new WaitUntil(()=>
{
    time += Time.deltaTime / period;
    float movement = Mathf.Lerp(0f, distance, time);
    Vector3 cubeLocalPosition = transform.localPosition;
    cubeLocalPosition.y += movement;
    transform.localPosition = cubeLocalPosition;
    return time >= 1f;
});
0 голосов
/ 07 мая 2020

Вам необходимо изменить возвращаемое значение IEnumerator, чтобы позволить сопрограмме ждать в течение времени, прошедшего с момента последнего кадра. Для этого вы можете использовать WaitForSeconds .

yield return new WaitForSeconds(Time.deltaTime);

Таким образом, вы «имитируете» поведение обратного вызова Update (обновите logi c в функции Time.deltaTime ).

0 голосов
/ 07 мая 2020

После вашего собственного вращения вы вычисляете конечную точку до go, а после вы можете использовать Vector3.Lerp или Vector.Slerp , чтобы переместиться за указанное время .. Итак скорость движения адаптируется к желаемому времени

var endpoint = transform.position + transform.forward.normalized * distance;
StartCoroutine(MoveToPosition(transform, endpoint, 3f)
:
:
public IEnumerator MoveToPosition(Transform transform, Vector3 positionToGO, float timeToMove)
{
  var currentPos = transform.position;
  var t = 0f;
  while (t < 1f)
  {
    t += Time.deltaTime / timeToMove;
    transform.position = Vector3.Lerp(currentPos, positionToGO, t);
    yield return null;
  }
  transform.position = positionToGO;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...