Делаем плавное смещение камеры
| |
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... Я верно понял? Лерп - это метод интерполяции, а любой твинер - это интерполяция двух точек. Про косинус, то тут да, в некотором смысле он и помогает "сделать этот эффект", ну а с другой стороны он нужен немного для другого.
Насчет Авейка, почему я спросил, просто Авейк стартует сразу как только "компонент" создан, а вот Старт - когда объект полностью инициализирован на сцене, по этому могут быть "проблемы", с доступом к объекту. Но я еще такие проблемы не встречал, но теоретически они могут быть
@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 |
|
| |
|