Понедельник, 25 Ноября 2024, 23:36

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Mathf.Lerp за 2 сек
robertonoДата: Среда, 25 Февраля 2015, 19:48 | Сообщение # 1
Чокнутый Кот
Сейчас нет на сайте
Мне нужно передвинуть объект посредством Vector3.Lerp с точки A до точки B ровно за 2 секунды.
Раньше использовал Vector3.Lerp(transform.position, Bpoint, Time.deltaTime * t);
Но тут нету привязанности ко времени.

Как выполнить интерполяцию за определенное время?
Заранее спасибо, очень жду ответа.
YellowAfterlifeДата: Среда, 25 Февраля 2015, 20:07 | Сообщение # 2
Сейчас нет на сайте
В момент начала движения:
Код
Moving = true; // :bool
APoint = transform.position; // отправная точка:Vector3
// [установка BPoint]
StartTime = Time.time; // время начала движения :float

На кадре:
Код

if (Moving) {
var t = (Time.time - StartTime) / 2;
transform.position = Vector3.Lerp(APoint, BPoint, t);
if (t >= 1) Moving = false;
}

Открывая документацию для перепроверки факта, что Lerp обрезает фактор до 0..1, мной был обнаружен аналогичный пример движения между точками по времени.


berilДата: Среда, 25 Февраля 2015, 20:30 | Сообщение # 3
Я не ленивый, я — энергосберегающий
Сейчас нет на сайте
robertono, ну как решил проблему? Верхний вариант подошел?
Не знаю как верхний вариант, но этот код точно сработает)

Код

using UnityEngine;
using System.Collections;

public class TestTime : MonoBehaviour {

     public Transform Obj;//обьект к которому будем двигаться
     
  void Start () {
         StartCoroutine(InputManager());
  }
   

  void Update () {
   
  }

     public IEnumerator InputManager()
     {
         while (true)
         {
             if (Input.GetKeyDown(KeyCode.E))
             {
                  yield return StartCoroutine(Move());
             }

             yield return null;
         }
     }

     public IEnumerator Move()
     {

         Vector3 StartPos = transform.position;

         Vector3 EndPos = Obj.transform.position;

         float timer = 0.0f;

         while (timer < 2f)
         {
             Vector3 FinalPos = Vector3.Lerp(StartPos , EndPos , timer/2f);

             transform.position = FinalPos;
       
             yield return null;

             timer += Time.deltaTime;

             print(timer);
         }
    
         transform.position = EndPos;

         yield break;
     }
}





Накодил? Убери за собой!
Инвентарь в Unity(UI)
Инвентарь в Unity(GUI)


Сообщение отредактировал beril - Среда, 25 Февраля 2015, 20:43
robertonoДата: Среда, 25 Февраля 2015, 21:01 | Сообщение # 4
Чокнутый Кот
Сейчас нет на сайте
beril, ещё не успел, там надо отредактировать пару классов (уже личные проблемы моего кода). Да и отвлекают постоянно, вот ужинать позвали biggrin
Думаю должно работать, хотя я ранее нашел ответ в гугле.
Сейчас у меня проблема в том, что за позицию A я беру текущую позицию, поэтому за точное время не получается сделать интерполяцию. Там надо чуть класс объекта переделать что бы первую позицию сохранять.

Но мне только не понятно зачем ты вместо Update загнал Input.getkeydown в IECoroutine ?
berilДата: Среда, 25 Февраля 2015, 21:25 | Сообщение # 5
Я не ленивый, я — энергосберегающий
Сейчас нет на сайте
Цитата robertono ()
Но мне только не понятно зачем ты вместо Update загнал Input.getkeydown в IECoroutine ?

Что бы точно переместить обьект за 2 секунды, без погрешностей) В Update такое не работает. Такой способ я исползую когда необходимо переместить обьект в точку за определенное время или же повернуть на определенные градусы(без погрешностей) за определенное время , в общем для точных вычислений biggrin Ну и плюс я щас работаю над проектом и у меня была такая же проблема, как и у тебя, я ее решил таким способом)




Накодил? Убери за собой!
Инвентарь в Unity(UI)
Инвентарь в Unity(GUI)
YellowAfterlifeДата: Среда, 25 Февраля 2015, 21:34 | Сообщение # 6
Сейчас нет на сайте
Цитата beril ()
Не знаю как верхний вариант, но этот код точно сработает)

Приведенный код делает то же самое но считает время вручную и занимается активным разведением coroutine'ов, что необязательно для простых действий вроде интерполяции векторов.


robertonoДата: Среда, 04 Марта 2015, 23:26 | Сообщение # 7
Чокнутый Кот
Сейчас нет на сайте
Вернулся к разработке игры.

YellowAfterlife, спасибо, я выбрал этот вариант, работает. Но вместо переменной Moving можно было просто проверять если
Код

if (t < 1f)
     { // while t below the end limit...
          t = (Time.time - AllCircles[i].StartTime) / transitionDuration;  
      }

Добавлено (28 февраля 2015, 23:45)
---------------------------------------------
beril, прости, твой вариант может и точнее, но слишком длинный smile

Добавлено (04 марта 2015, 23:26)
---------------------------------------------
beril, а вот и понадобился код в сопрограммном исполнении. Спасибо

  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг