Четверг, 18 Апреля 2024, 12:57

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Делаем плавное смещение камеры
Делаем плавное смещение камеры
pixeyeДата: Суббота, 11 Июня 2011, 17:30 | Сообщение # 1
Red Winter Software
Сейчас нет на сайте
Данный пример рассчитан больше на 2д , однако ничего не мешает его доработать для 3д пространства. Можно использовать не только для смещения камер;-) Это просто как вариант.
Итак - у нас есть одна камера, мы хотим ее плавно перемещать. Камеру будем двигать по координатам X ( горизонтально ) и Y (вертикально), мы будем задавать начальное положение камеры, конечное положение и скорость перемещения. Так же поставим перед собой задачу удобно вызывать функцию плавного перемещения из любого скрипта/куска кода. Для выбора горизонтального/вертикального смещения будем использовать перечисление
(enum) Enum'ы делают код много более понятным и читабельным и убивают "магические" цифры, которые любят часто использовать совсем неискушенные скриптеры/программисты. Приведу пример

Code

static var gameMode: int = 0;

if (gameMode==0)
print("Это меню");
if (gameMode==1)
print("Это игра");


Это пример использования магических чисел, когда их становится много человек начинает путаться, так как не знает откуда берутся эти значения ( магия ).

Code

enum GAMEMODE
         {
            
           Options,
           Game

         }

var gameMode: GAMEMODE;

if (gameMode==GAMEMODE.Options)
print("Это меню");
if (gameMode==GAMEMODE.Game)
print("Это игра");


Этот же пример, но с использованием enum, согласитесь, намного читабельнее, а главное можно легко проследить что откуда идет. Это маленькая справка для тех кто незнаком с ENUM вообще - этих знаний хватит, чтобы понять что происходит в моем примере.

Назовем наш скрипт camSlider и приатачим его к объекту в сцене который будет выполнять роль контроллера/менеджера скриптов.

Code

#pragma strict

enum SIDE { None, HOR, VERT }   //объявляем стороны для смещения - none - нулевой параметр, HOR - горизонтальное смещение, VERT - вертикальное

static var use: camSlider; // наш скрипт
var MainCamTransform: Transform; // трансформ камеры

function Awake()   

    {
         MainCamTransform = camera.main.transform;  //находим трансформ камеры.
           
        //Проверка на работу скрипта - не позволяет смещать одновременно больше одного объекта.
         if(use) {
          return;
                   }

      use = this;

                  }
//Сопрограмма
function Slide(start: float, end: float, timer: float, side: SIDE){

var t: float = 0.0;
while (t<1.0){
t+= Time.deltaTime * (1.0/timer);
if (side == SIDE.VERT) //смещение вертикальное
MainCamTransform.position = Vector3(MainCamTransform.position.x,Mathf.Lerp(start,end,1.0 - Mathf.Cos(t * Mathf.PI * .5)),MainCamTransform.position.z);
else if (side==SIDE.HOR) //смещение горизонтальное   
MainCamTransform.position = Vector3(Mathf.Lerp(start,end,1.0 - Mathf.Cos(t * Mathf.PI * .5)),MainCamTransform.position.y,MainCamTransform.position.z);
yield;
}
}



Вот и все...ну и пример вызова функции.

В любом скрипте когда надо сместить камеру просто пишем

Code
camSlider.use.Slide(30.0,0.0,0.5,SIDE.VERT);

В данном примере камера смещается вниз с позиции y 30 до y 0.0 за пол секунды. Если мы подставим SIDE.HOR - то это будет смещение от x 30 до x 0.

Удачного дня и коддинга!


ACTORS - мой фреймворк на Unity
Until We Die - игра над которой работаю



Сообщение отредактировал pixeye - Суббота, 11 Июня 2011, 17:31
noTformaTДата: Суббота, 11 Июня 2011, 18:46 | Сообщение # 2
Ukrainian independent game developer
Сейчас нет на сайте
pixeye, вопрос, почему в Аwake? Не лучше выполнять в Start?
Как я понял, это обычный Твинер?


@noTformaT
pixeyeДата: Суббота, 11 Июня 2011, 19:25 | Сообщение # 3
Red Winter Software
Сейчас нет на сайте
Quote (noTformaT)
pixeye, вопрос, почему в Аwake? Не лучше выполнять в Start?
Как я понял, это обычный Твинер?


Да - это твинер.

любой Awake выполняется до функции Start, фактически Awake выполняется единожды за существование объекта перед любой другой функцией, awake в unity - аналог конструктора класса.
Рекомендуется параметры, объекты объявлять в Awake.

В принципе если очередность выполнения функций в скрипте не критична, то можно использовать и Start.
Я привык к Awake тк пишу на unity под айфон, а там желательно все параметры максимально возможно прописывать в начале работы с объектом ( особенно касается медленных GameObject.Find )


ACTORS - мой фреймворк на Unity
Until We Die - игра над которой работаю

AtomKriegДата: Суббота, 11 Июня 2011, 20:59 | Сообщение # 4
частый гость
Сейчас нет на сайте
А Slerp чем плох?
pixeyeДата: Суббота, 11 Июня 2011, 21:17 | Сообщение # 5
Red Winter Software
Сейчас нет на сайте
Quote (AtomKrieg)
А Slerp чем плох?


Slerp ничем не плох;-) Просто Lerp преобразовывает параметр линейно а Slerp по кривой ( сфере ). Я например использую Slerp для того чтобы у меня иногда враги отлетали от места взрыва по дуге


ACTORS - мой фреймворк на Unity
Until We Die - игра над которой работаю

seamanДата: Суббота, 11 Июня 2011, 21:48 | Сообщение # 6
старожил
Сейчас нет на сайте
В данном случае Lerp позволил сделать специфическое движение - сначала медленно, затем быстрее и в конце снова медленнее. С помощью Cos...
Я верно понял?
noTformaTДата: Суббота, 11 Июня 2011, 21:55 | Сообщение # 7
Ukrainian independent game developer
Сейчас нет на сайте
Quote (seaman)
В данном случае Lerp позволил сделать специфическое движение - сначала медленно, затем быстрее и в конце снова медленнее. С помощью Cos...
Я верно понял?

Лерп - это метод интерполяции, а любой твинер - это интерполяция двух точек. Про косинус, то тут да, в некотором смысле он и помогает "сделать этот эффект", ну а с другой стороны он нужен немного для другого.

Насчет Авейка, почему я спросил, просто Авейк стартует сразу как только "компонент" создан, а вот Старт - когда объект полностью инициализирован на сцене, по этому могут быть "проблемы", с доступом к объекту. Но я еще такие проблемы не встречал, но теоретически они могут быть smile


@noTformaT
pixeyeДата: Суббота, 11 Июня 2011, 22:19 | Сообщение # 8
Red Winter Software
Сейчас нет на сайте
Quote (noTformaT)
Насчет Авейка, почему я спросил, просто Авейк стартует сразу как только "компонент" создан, а вот Старт - когда объект полностью инициализирован на сцене, по этому могут быть "проблемы", с доступом к объекту. Но я еще такие проблемы не встречал, но теоретически они могут быть smile


В данном случае игровая камера УЖЕ находится в сцене - а поэтому авейк оправдан - ошибки не будет. Так же как правило такие функции ты применяешь к УЖЕ созданным объектам в сцене - вероятность ошибки сводится к нулю. Я понимаю о чем ты;-) В теории такая вероятность существует. На практике такого не разу не было.

Quote (seaman)
В данном случае Lerp позволил сделать специфическое движение - сначала медленно, затем быстрее и в конце снова медленнее. С помощью Cos...
Я верно понял?


Как правильно скзаал noTformat Лерп - это метод интерполяции. Cos дает более плавное смещение.


ACTORS - мой фреймворк на Unity
Until We Die - игра над которой работаю



Сообщение отредактировал pixeye - Суббота, 11 Июня 2011, 22:20
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Делаем плавное смещение камеры
  • Страница 1 из 1
  • 1
Поиск:

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