Действие Mathf.Lerp в течении 10 секунд.

Программирование на Юнити.

Действие Mathf.Lerp в течении 10 секунд.

Сообщение 2dkot 10 июл 2010, 22:28

Вопрос думаю очень простой. Хотелось бы, чтобы движения затухали в не течение одной секунды, а хотя бы за 10 секунд.

Код: Выделить всё

var minimum = 10.0;
var maximum = 20.0;
// Fades from minimum to maximum in one second
function Update () {
transform.position.x = Mathf.Lerp(minimum, maximum, Time.deltaTime+10);
}



Спасибо
2dkot
UNец
 
Сообщения: 21
Зарегистрирован: 04 май 2010, 20:00

Re: Действие Mathf.Lerp в течении 10 секунд.

Сообщение Neodrop 10 июл 2010, 22:40

Хм... Я даже приличного эпитета к вашему коду не подберу...
Этот алгоритм (Mathf.Lerp) работает в диапазоне от 0 до 1 значит ваш код сразу его убивает.

Вроде должно работать. Но писал вслепую. :-?

Синтаксис:
Используется javascript
float currentTime = 0;
function Update () {

if (currentTime < 10.0)
{
   currentTime += Time.deltaTime;
}

transform.position.x = Mathf.Lerp(minimum, maximum, currentTime * 0.1);
}
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Действие Mathf.Lerp в течении 10 секунд.

Сообщение 2dkot 10 июл 2010, 22:55

Прошу прощения за код, щас нет доступа к родному, поэтому для примера взял из мануала. Я просто хочу понять суть.

Что Вы имели ввиду относительно диапазона?
2dkot
UNец
 
Сообщения: 21
Зарегистрирован: 04 май 2010, 20:00

Re: Действие Mathf.Lerp в течении 10 секунд.

Сообщение DbIMok 10 июл 2010, 23:24

он про то, что 3-ий параметр ф-ии должен быть от 0 до 1 (об этом написано в справке), поэтому прибавлять к нему 10 неразумно
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.8k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Действие Mathf.Lerp в течении 10 секунд.

Сообщение 2dkot 10 июл 2010, 23:47

А блин точно :(((((( не до смотрел :((((. Спасибо огромное буду побывать.
2dkot
UNец
 
Сообщения: 21
Зарегистрирован: 04 май 2010, 20:00

Re: Действие Mathf.Lerp в течении 10 секунд.

Сообщение 2dkot 12 июл 2010, 22:03

Попробовал все отлично работает.

Но в частном случае, к сожаление, я по не дознанию никак не могу прикрутить к FPSWalker. Задача следующая - когда кнопка W отпускается, объект пробегает и останавливается через 10 секунд.

Вот пример функции :

Синтаксис:
Используется javascript
var speed = 6.0;
var jumpSpeed = 8.0;
var gravity = 20.0;
private var moveDirection = Vector3.zero;
private var grounded : boolean = false;
private var move_ = 0;
private var lastInterval : double;
private var time_=0;
private var minimum = 10;
private var maximum = 50;

function FixedUpdate() {
        if (grounded) {
                // We are grounded, so recalculate movedirection directly from axes

                moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
                moveDirection = transform.TransformDirection(moveDirection);
                moveDirection *= speed;
                moveDirection.y = Random.Range(0, 1);

                if (Input.GetButton ("Jump")) {
                        moveDirection.y = jumpSpeed;
                }
        }


        // Apply gravity
        moveDirection.y -= gravity * Time.deltaTime;
       
        // Move the controller
        var controller : CharacterController = GetComponent(CharacterController);
        var flags = controller.Move(moveDirection * Time.deltaTime);
        grounded = (flags & CollisionFlags.CollidedBelow) != 0;

        if (Input.GetKeyUp ("w")) {    
        print ("space key was released");
        Move_();
        }

}

function Move_()
{

        if (time_ < 10.0)
        {
            time_ = time_ + Time.deltaTime;
            transform.position = new Vector3(transform.position.x, transform.position.y, Mathf.Lerp(minimum, maximum, time_ * 0.1));
        }

}
 


UPDATE выполняет один раз функцию Move_ и все, а как заставить выполнить ее до конца.

Спасибо заранее.
Последний раз редактировалось Neodrop 13 июл 2010, 00:46, всего редактировалось 1 раз.
Причина: Исправлен тег на syntax
2dkot
UNец
 
Сообщения: 21
Зарегистрирован: 04 май 2010, 20:00

Re: Действие Mathf.Lerp в течении 10 секунд.

Сообщение Zaicheg 12 июл 2010, 22:10

В функцию Move ставим флаг.

Код: Выделить всё
if (Input.GetKeyUp ("w"))
{
    while (!flag)
        Move_(); }

Move() {
...
if (time_ > 10) // или какое у вас условие окончания
    flag = true; }


И по-моему, Вы зря всю эту байду вызываете из FixedUpdate и зря инпут там считываете и зря вектор там считаете. Используйте Update по возможности.

И пользуйтесь тегом [syntax] когда куски кода размещаете на форуме. Я сейчас через [code] сделал, но у меня не реальный код и мало.
Дьяченко Роман
e-mail: _zaicheg.reg@gmail.com
skype: zaicheg12
vkontakte: _vk.com/zaichegq
Работа: _wie3.com _www.sanviz.com
Аватара пользователя
Zaicheg
Адепт
 
Сообщения: 3024
Зарегистрирован: 19 июн 2009, 15:12
Откуда: Череповец

Re: Действие Mathf.Lerp в течении 10 секунд.

Сообщение 2dkot 12 июл 2010, 22:47

Спасибо за совет. Учту в следующий раз.

Если честно я только начинаю, поэтому взял готовый скрипт из Юнити FPSwalker.
2dkot
UNец
 
Сообщения: 21
Зарегистрирован: 04 май 2010, 20:00

Re: Действие Mathf.Lerp в течении 10 секунд.

Сообщение 2dkot 12 июл 2010, 23:34

Zaicheg писал(а):В функцию Move ставим флаг.

Код: Выделить всё
if (Input.GetKeyUp ("w"))
{
    while (!flag)
        Move_(); }

Move() {
...
if (time_ > 10) // или какое у вас условие окончания
    flag = true; }


И по-моему, Вы зря всю эту байду вызываете из FixedUpdate и зря инпут там считываете и зря вектор там считаете. Используйте Update по возможности.

И пользуйтесь тегом [syntax] когда куски кода размещаете на форуме. Я сейчас через [code] сделал, но у меня не реальный код и мало.


К сожалению, та же картина :(( Move_ отрабатывает один только раз.
2dkot
UNец
 
Сообщения: 21
Зарегистрирован: 04 май 2010, 20:00

Re: Действие Mathf.Lerp в течении 10 секунд.

Сообщение Serge 13 июл 2010, 03:16

Вы забыли обнулить параметр time_. При последующих вызовах он у вас больше 1, а должен быть в пределах от 0 до 1. Еще раз внимательно прочитайте советы Зайчика, примените их, и посмотрите в документации, в чем отличие Update от FixedUpdate. Работать оно конечно будет, но глюкаво.
О, сколько нам открытий чудных Готовят просвещенья дух И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель.
Аватара пользователя
Serge
UNIверсал
 
Сообщения: 476
Зарегистрирован: 20 мар 2009, 15:53
Откуда: Сибирь г. Омск
  • Сайт
  • ICQ

Re: Действие Mathf.Lerp в течении 10 секунд.

Сообщение 2dkot 13 июл 2010, 19:07

Спасибо,

Я не совсем верно объяснил. Move_ выполняет условие один раз, то есть двигает объект всего одну секунду. Хотя по идее должен 10 секунд. ТО что он не обнуляется я знаю, первый то раз он должен отработать правильно.
2dkot
UNец
 
Сообщения: 21
Зарегистрирован: 04 май 2010, 20:00

Re: Действие Mathf.Lerp в течении 10 секунд.

Сообщение Serge 13 июл 2010, 19:37

Функция Lerp (Move_) должна вызываться в каждом кадре (Update). При нажатии кнопки устанавливайте флаг в true. В функции Move_ проверяйте значение флага. При достижении time_ значения >= 1 ставьте флаг на false.
Вот примерно так. Еще раз, читайте внимательно доки, смотрите примеры. :)
Например делаем глобальный поиск по скриптам, ищем все скрипты с функцией Lerp и смотрим как ею пользоваться. :)
О, сколько нам открытий чудных Готовят просвещенья дух И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель.
Аватара пользователя
Serge
UNIверсал
 
Сообщения: 476
Зарегистрирован: 20 мар 2009, 15:53
Откуда: Сибирь г. Омск
  • Сайт
  • ICQ

Re: Действие Mathf.Lerp в течении 10 секунд.

Сообщение 2dkot 19 июл 2010, 22:33

Ну хоть тресни, не работает.

Синтаксис:
Используется csharp

float speed;
float minimum;
float maximum;
bool flag;
float time_;

        void Start () {        
        minimum = 2.0f;
        maximum = 20.0f;
        }
        void Update () {
        if (Input.GetKeyDown ("w")){
        flag = false;
        time_ = 0;
        }
        if (Input.GetKeyUp ("w")){
        flag = true;
        }
        while (!flag){
        move_();
        }
        }
        void move_(){
                if (time_ <= 5.0f){
                flag = true;
                time_ = time_ + Time.deltaTime;
                transform.Translate(0, 0, Mathf.Lerp(minimum, maximum, time_*0.1f));   
        }
                else{
                flag = false;  
                }
                }
 


Вроде все делаю верно...
2dkot
UNец
 
Сообщения: 21
Зарегистрирован: 04 май 2010, 20:00

Re: Действие Mathf.Lerp в течении 10 секунд.

Сообщение sp00n 19 июл 2010, 22:45

не верно :)
Синтаксис:
Используется csharp
void move_(){
if (time_ <= 5.0f){
flag = true;
time_ = time_ + Time.deltaTime;
первый раз вы передаете в эту функцию время == 0, соответственно по условию имеете выход из цикла, кстати, очень опасного :) - например, если бы время было >5.0f - что бы получилось в Update()? правильно - бесконечный цикл :) Вам же посоветовали правильно, зачем вам эти циклы?
Удачи.
Ты молод, креативен, талантлив?
Амбициозен, уверен в себе, полон свежих идей?
А делать хоть что-нибудь умеешь?!
sp00n
UNITрон
 
Сообщения: 254
Зарегистрирован: 27 фев 2010, 20:43

Re: Действие Mathf.Lerp в течении 10 секунд.

Сообщение 2dkot 19 июл 2010, 23:31

Да таки работает. Глупый я, глупый. ОГРОМНОЕ СПАСИБО!!! ^:)^ ^:)^ ^:)^ ^:)^
2dkot
UNец
 
Сообщения: 21
Зарегистрирован: 04 май 2010, 20:00


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11