Поковырялся в справках и форумах, но так толком и не понял что конкретно такое и где применять Time.time и Time.deltaTime, а , так же, как с их помощью и Mathf.Lerp делать интерполяцию. Можете нормально разжевать эти темы или , хотя бы, скинуть ссылки на русском. Стал уже пробовать на самых примитивных примерах ... Есть объект, перемещаю его так
Параметр Time.time, он будет правильно работать только в одиночных интереполяциях при старте игры. Параметр Time.time - это время прошедшее с начала игры. Используй для повторяющихся интерполяций параметр - Time.deltaTime (время прошедшее с прошлого кадра).
Кроме того - интерполяция под условием GetKeyDown или GetKeyUp работать не будет, ей необходимо множество циклов Update. Используй условие GetKey X.cor.R (Prologue)
Ну, вот, в примере ilyakos-а , как Я уже пробовал, получается, что объект перемещается постоянно, пока нажата клавиша, а Мне нужно, чтобы это произошло однократно ... И что значит "время, прошедшее с прошлого кадра" ??? Я уже встречал это определение, но так и не понял ... Сколько может пройти времени с прошлого кадра ?
И что значит "время, прошедшее с прошлого кадра" ???
Я вот не понимаю - как это можно не понять? "Время, прошедшее с прошлого кадра" именно это и означает. Именно то, что написано! Может непонятно почему это нужно знать? А вот посмотрите - у каждого своя видеокарта. У каждого своя скорость отрисовки. Следовательно один кадр -вся сцена может рисоваться разное время! Чтобы не зависеть от железа пользователя и нужно знать - сколько времени прощло с отрисовки предыдущего кадра! А! блин! Я понял, я не тут писал! Вот почему нет моего поста! Цитирую:
function Update () { if(go)transform.position.y = Mathf.Lerp(transform.position.y,transform.position.y + 5, Time.deltaTime*speed); if (Input.GetKeyDown(KeyCode.V)) go =true; }
и объект, при нажатии клавиши, плавно, но без остановки, движется вверх ! ...
Именно это в твоем коде и написано... Позиция каждый кадр увеличивается и каждый кадр к ней плюсуется + 5... Конца процессу не будет. X.cor.R (Prologue)
Благодарю ! Пришлось , правда, привести твой скрипт в работоспособный вид
Код
var timeout: float; var speed = 0.5;
function Update(){
if(timeout>0){ go = true; timeout -= Time.deltaTime; } else if(timeout<=0) go = false; if(go) transform.position.y = Mathf.Lerp(transform.position.y,transform.position.y + 5, Time.deltaTime*speed); if (Input.GetKeyDown(KeyCode.V)) timeout = 2.0f; }
Но , в итоге, работает , как надо, жаль только , что так замудрённо, Я бы сам не додумался ... Сейчас попробую прилепить что-то подобное к своему скрипту приседания ...
Добавлено (07 Янв 2014, 20:41) --------------------------------------------- Странно только , что , когда увеличиваю speed - меняется не скорость, с которой объект поднимается от y до y+5, а само расстояние, т.е. он с той же скоростью поднимается выше ....
В справке написано "// Move the object 10 meters per second! var translation : float = Time.deltaTime * 10;" Т.е. скорость = 10метров в секунду ... Так ? Тогда, изменяя значение 10 можно изменить скорость, но не расстояние, которое нужно пройти с такой скоростью ... А расстояние - это дистанция от y до y+5... Я так понимаю ...
Сообщение отредактировал dostalition - Вт, 07 Янв 2014, 21:15
Жуть. Жалко тут нет смайлика "Полная Ж..." Вы почитали уроки от PoqXert? Я думал, что там не понять что такое Lerp просто невозможно. Оказывается возможно. Что делает Lerp? Он ПРОСТО выдает среднее между первым и вторым параметрами. Какое среднее - определяет третий параметр. ВСЕ. Формула расчета этого среднего a + (b-a) * t Никакой магии нет. Вам нужно постепенно из одного места перейти в другое. Как это сделать. Указать в Lerp первым параметром первое место, вторым параметром - второе место. И плавно менять третий параметр. Тогда Lerp будет выдавать нечто среднее между первой позицией и второй позицией. Как будет меняться это среднее положение зависит от того как Вы будете менять третий параметр. Ну и какой вывод? 1. При старте движения запоминаем позицию - это будет первый параметр. Тут же прибавляем к позиции необходимое смещение (+5) и запоминаем эту вторую позицию - это будет второй параметр Лерпа. Сохраняем время начала движения. Ставим флаг - начали движение. Для упрощения пересчитываем скорость во время за которое пройдем смещение при данной скорости.
Сложно? Это так нужно только если Вам нужно двигаться с постоянной скоростью. Если можно постепенно замедляться можно сделать проще. Можно в каждый момент времени в качестве начальной позиции брать текущее положение. Тогда не нужно ничего о старте запоминать, а в качестве третьего параметра использовать время, прошедшее с предыдущего кадра.
Код
Vector3 endPosition; bool moving;
public Vector3 shiftPosition; //Это устанавливаем в инспекторе - смещение public float speed; //Это устанавливаем в инспекторе - скорость движения
PS: Да, забыл написать, вдруг непонятно будет. Чтобы начать движение - нужно вызвать функцию StartMoving. Как и когда ее вызывать - Вам виднее. Например в том же Update по нажатию клавиши. Можно не выносить в отдельную функцию, а все делать в месте принятия решения о движении.