Перемещение за время в Unity

Перемещение за время в 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, и т.д.

Понравилась статья? Поделиться с друзьями:
Автор snezhok_13
Время от времени пишет статьи о разработке игр и проводит интервью с разработчиками. Сейчас работает engine-progremmer'ом в Larian Studios. Большой поклонник игр Naughty Dog.
  1. Sasha Domase :

    А не проще yield return new WaitForSecond ?

  2. иван иванов :

    если в Update написать это:
    rectTransform.anchoredPosition = Vector2.Lerp(startPosition, targetPosition, delta/3);
    разве это не даст такой же результат?

    • Смотря как вы считаете последний параметр, если от времени как я, то сработает, если от позиции движение будет неплавное из-за разных deltaTime. И для Update ещё флажок дополнительный нужен “двигаюсь/не двигаюсь”, хотя можно 2 вектора сравнивать..

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *