18 Июля 2017
14

Управление временем на Unity.

Всем привет, сегодня я хотел бы поделиться тем, как я реализовал управление временем на Unity 3D. Думаю многие играли в Price of Percia: The sands of time. Мне показалось, что в этой игре не раскрыли весь потенциал, данной задумки. Что ж давайте подумаем, как можно это реализовать. В unity есть такая вещь, как Time. Вы можете его посмотреть настройки в Time Manager во вкладке Edit/ProjectSettings/Time

Управление временем на Unity. Unity3D, Gamedev, Управление временем, Программирование, Длиннопост

Как мы видим, здесь есть настройки Fixed Timestep - этот параметр определяет то, через какое время будет вызываться функция FixedUpdate. В этой функции выполняется обработка физики RigidBody и тому подобное. Maximum Allowed Time - Отвечает за независимый от частоты кадров отсчет времени, здесь он нам не понадобится. Time Scale - это скорость, с которой течет время, так установив этот параметр на 0 вы остановите движение времени в игре, а установив на значение больше или меньше 1 ускорите или замедлите время соответственно. Очень хорошо может применяться для создания SlowMotion или же для паузы в игре, заметим, что параметр Time Scale не может быть меньше 0, это значит, что мы не можем использовать его для наших целей, то есть можем, но не так просто.


Что же с теорией разобрались теперь давайте подумаем как нам реализовать обратную перемотку. На ум сразу же приходит идея записать позиции и поворот всех нужных нам объектов и присваивать их при нажатии на кнопку. Так и поступим.


Создадим C# скрипт и назовем его Time_.  Создадим массив GameObject и назовем его Objects, создадим также двумерный массив типа Vector3 и еще один двумерный массив типа Quaternion, назовем их Positions и Rotations соответственно.

Управление временем на Unity. Unity3D, Gamedev, Управление временем, Программирование, Длиннопост

Создадим сразу переменную Index типа integer, для того чтобы ориентироваться в массиве. Ведь когда мы будем записывать позиции и поворот, мы должны сохранить это в следующем элементе. Так же создадим переменную Scale типа int, которая будет регулировать размер массивов, а следовательно и длину записи, установим ей значение 1000.  


В Старте инициализируем переменные.

Objects мы будем искать все объекты на сцене по тегу "Time", давайте настроим этот тег.

Objects = GameObject.FindObjectsWithTag("Time"), далее инициализируем Positions и Rotations, устанавливая первый размер Objects.Length, а второй Scale.


Получим что-то вроде этого.

Управление временем на Unity. Unity3D, Gamedev, Управление временем, Программирование, Длиннопост

Давайте сразу пропишем в Update вычисления, если Index больше Scale, то обнуляем Index и записываем все по новой. Это будет значить, что мы возвращаем только последние несколько секунд времени, количество которых зависит от Scale. Тоже самое, только наоборот, делаем и с нулем,  таким образом ограничивая Index (0,Scale).

Управление временем на Unity. Unity3D, Gamedev, Управление временем, Программирование, Длиннопост

В начале мы не просто так затронули функцию FixedUpdate, она вызывается через определенное кол-во кадров, в зависимости от TimeScale, и в ней обрабатывается физика.

Нам нет смысла обновлять позиции каждый кадр, если они не меняются. Следовательно прописываем функцию FixedUpdate() и в ней уже пишем цикл for от 0 до Objects.Length, с переменной і и в этом цикле Positions и Rotations[i,Index] присваиваем текущие позиции и повороты. после цикла в функции прибавляем к Index 1.

Управление временем на Unity. Unity3D, Gamedev, Управление временем, Программирование, Длиннопост

Теперь осталось только присвоить эти значения к текущим позиции и повороту, для этого в Update прописываем условие If(Input.GetKey(KeyKode.R)) и в нем значение TimeScale устанавливаем на 0, так мы защищаем себя от воздействия физики на объекты и перестаем записывать позиции еще раз. Теперь используя функцию Lerp присваиваем позиции и поворот нашему трансформу.

Управление временем на Unity. Unity3D, Gamedev, Управление временем, Программирование, Длиннопост

Теперь осталось просто запускать время, когда отпустим клавишу R, для этого все  в том же Update пишем if(Input.GetKeyUp(KeyKode.R)) и в этом условии устанавливаем значение TimeScale на 1

Управление временем на Unity. Unity3D, Gamedev, Управление временем, Программирование, Длиннопост

Что ж, вот мы и написали небольшой код, для управления временем, он оказался довольно простым и наглядно показывает, как обновляется физика и как работает Lerp, так же практическое применение двумерных массивов в Unity. При настройке не забудьте добавить RigidBody на ваши кубики и установить тег.

Показать полностью 6
10

Вдогонку к "про необычные болезни". Будет нечего делать-почитаете) Мое.

Прочитал тут пост "про необычные болезни" и нашел как бы "коллегу". Может, давайте делиться тру стори о своем печальном опыте и опыте с хорошим концом?)

Можно? Вот мне, вроде, повезло-таких приступов с судорогами не было, но головные боли были адские...


Болел в школе простудой, потом подхватил пневмонию, которую не заметили. Болезни имеют свойство маскироваться. Врачи, если тут есть-поймут. С горечью. После неудачных попыток отлечиться дома в тяжелом состоянии попал в инфекционную на пару недель. Возможно, на побочные эффекты потом повлияла температура в 40 несколько ночей. Врачи суетились, кололи что-то, даже ледяные шарики потом клали в подмышки, в пах, у шеи, у ног. Это чтоб совсем не заколоть я так понял)


А потом воспаление оболочки мозга. Что-то типа вирусного менингита. Заметное ухудшение памяти и многих умственных процессов. Как тормоз какой-то. Заторможено все. Однажды вышел на учебу из дома, закрыл дверь, прошел пару шагов и меня кто-то каааак толкнет чуть ли не на дорогу. Упал на траву и продолжает тянуть вправо. Ничего не могу сделать. Страшное чувство было. Обернулся-нет никого. В общем, привет-это я-твой спазм в голове. МРТ, неврологи, тесты. Я понял, что водить мне машину нельзя. Если за рулем вот такое случится...ну вы понимаете. Если провести линию с головы до ног, то левая рука и нога стали то ли менее чувствительны к боли, то ли правая часть стала острее принимать боль. Уже не помню. Сейчас уже трудно понять. Болело на 80% только левое полушарие. Правого касалось иногда. Также однажды утром заметил, что правая нога как бы отстает от левой и не делает нормальный шаг, типа плетется. Страшно удивительно было то, что ты хозяин своего тела и ты не можешь заставить делать нормальное движение своей же части тела. Родителям такое узнать было конечно крайне неприятно. Жалко их было, ведь понятно было к чему все идет. Поражен мозговой центр и статистика по таким вещам совсем не радужная. Тогда я уже учился в городе по среднему специальному. А так как с головой я не дружил уже, то было тяжеловато. Кое-как все же закончил. Принимал я, кажется, глюкозу в больших количествах и что-то еще. Как я понял все это сушило голову и мешало вырасти моей проблеме. Так шло время с начала болезни (17 лет) до того момента, когда я понял, что мне повезло и что я стал для себя супер-героем, ибо как сказал мой невролог лекарства конечно помогли, но удивительно то, что произошла регенерация. То есть, организм смог сам себя вылечить, возможно, за счет молодого возраста. Я запомнил его мимику, удивление, когда он смотрел на последнее МРТ В настоящее время изредка бывают болезненные вспышки. Я сразу отключаюсь от всего, закрываю глаза и, как правило, через несколько секунд они проходят. Правая нога подтянулась. И когда на улице грязно, то одна штанина грязная, а вторая нет, из-за того, что кое-кто не так резво возвращается для следующего шага) При ходьбе это не ощущается. Ах, да, я сдал на вод.удостоверение и год езжу за рулем. Пришлось из-за работы. Боюсь того, что случилось в прошлом, но стараюсь об этом не думать. Могу сказать, что с болезнью покончено. Спустя 11 лет. Хотя бывают подлагивания и это мешает, и я злюсь. Еще мне сложно запоминать простые вещи-места, где был (номер дома), людей и прочее. Хотя раньше не было таких проблем. Предполагаю, что мозг не считает нужным для Себя запоминать такой мусор, ибо пока есть силы он справляется с более серьезными вещами, например, правильно ходить, помнить как Меня зовут и так далее. Боюсь, что ближе к старости он не сможет так справляться и все выйдет наружу. Это конечно мои домыслы, но… Но пока я не инвалид и живой.


А у своего невролога был 2 года назад-в 28.

Качаться в тренажерке тоже не могу, от напрягов голову начинает жутко ломить и ныть.

В армии конечно не был-не пустили. А отвечая на вопрос почему не служил, иногда со смехом говорю как есть-с головой не дружил) И пофиг, что подумают. Ведь не вру же)

Вдогонку к "про необычные болезни". Будет нечего делать-почитаете) Мое. Больница, Болезнь, Свое, Везение, Здоровье, Боль, Супергерои, Время
Показать полностью 1
Мои подписки
Подписывайтесь на интересные вам теги, сообщества, авторов, волны постов — и читайте свои любимые темы в этой ленте.
Чтобы добавить подписку, нужно авторизоваться.

Отличная работа, все прочитано! Выберите