Перемещение за время в Unity
Очень частый вопрос, который я встречал на форумах — «Как переместить объект в Unity за время?»
Без какого-либо твинера, это можно сделать рассчитывая дельту для интерполяции по времени.
Например, вот так:
using System;
using System.Collections;
using UnityEngine;
public class MoveController : MonoBehaviour {
private RectTransform rectTransform;
// Use this for initialization
void Start () {
rectTransform = GetComponent<RectTransform>();
}
// Update is called once per frame
void Update () {
if (Input.GetKeyDown(KeyCode.Z))
{
StartCoroutine(DoMove(3f, Vector2.zero));
}
}
private IEnumerator DoMove(float time, Vector2 targetPosition)
{
Vector2 startPosition = rectTransform.anchoredPosition;
float startTime = Time.realtimeSinceStartup;
float fraction = 0f;
while(fraction < 1f)
{
fraction = Mathf.Clamp01((Time.realtimeSinceStartup - startTime) / time);
rectTransform.anchoredPosition = Vector2.Lerp(startPosition, targetPosition, fraction);
yield return null;
}
}
}
Скрипт перемещает объект в центр контейнера за 3 секунды. Легко можно адаптировать его, чтобы поворачивать за время, перемещать объект за время в 3d, и т.д.
Понравилась статья? Поделиться с друзьями:

А не проще yield return new WaitForSecond ?
Что значит проще? Двигать нужно каждый фрейм, зачем возвращать WaitForSeconds, если не нужно ждать нисколько?
Вы не правильно задачу, наверное поняли) подправлю в статье. Нужно не через 3 секунды передвинуть объект, а в течении 3 секунд линейно передвигать
если в Update написать это:
rectTransform.anchoredPosition = Vector2.Lerp(startPosition, targetPosition, delta/3);
разве это не даст такой же результат?
Смотря как вы считаете последний параметр, если от времени как я, то сработает, если от позиции движение будет неплавное из-за разных deltaTime. И для Update ещё флажок дополнительный нужен «двигаюсь/не двигаюсь», хотя можно 2 вектора сравнивать..
спасибо за ответ