...

пятница, 25 апреля 2014 г.

[Из песочницы] Базовая анимация с iTween

image

Вы когда-нибудь занимались созданием анимации в своей игре? Задавать подобный вопрос, наверное, глупо, практически в каждой игре есть какая-никакая, но анимация и вам приходилось иметь с ней дело. Напомню, что занятие это более чем утомительное, чаще всего приходиться придумывать свои наработки, чтобы хоть как-то облегчить себе жизнь. Но зачем заниматься лишней работой, делать это плохо, когда это уже сделано, и сделано хорошо!? Давайте познакомимся с инструментом под названием iTween.



Получить его можно на официальном сайте: http://ift.tt/1k0qg5i

iTween это класс, который предоставляет различные методы. С их помощью можно не только анимировать объекты сцены, но и менять их цвет, размер, положение, направление.


Давайте попробуем смоделировать небольшой полигон для наших испытаний.


Первым делом подключим iTween-package из Asset store: http://ift.tt/Wm74Uz В Unity мы должны увидеть подобное:


image


Создадим новую сцену с таким содержанием:


image


Куб — это тот объект, который мы и будем анимировать. Теперь переходим на iTween. Создаем новый компонент-скрипт типа C# у нашего объекта. Заполним метод Start:



void Start()
{
iTween.RotateFrom(gameObject, iTween.Hash("y", 90.0f, "time", 2.0f, "easetype", iTween.EaseType.easeInExpo));
iTween.MoveFrom(gameObject, iTween.Hash("y", 3.5f, "time", 2.0f, "easetype", iTween.EaseType.easeInExpo));
iTween.ShakePosition(Camera.main.gameObject, iTween.Hash("y", 0.3f, "time", 0.8f, "delay", 2.0f));
iTween.ColorTo(gameObject, iTween.Hash("r", 1.0f, "g", 0.5f, "b", 0.4f, "delay", 1.5f, "time", 0.3f));
iTween.ScaleTo(gameObject, iTween.Hash("y", 1.75f, "delay", 2.8f, "time", 2.0f));
iTween.RotateBy(gameObject, iTween.Hash("x", 0.5f, "delay", 4.4f));
iTween.MoveTo(gameObject, iTween.Hash("y", 1.5f, "delay", 5.8f));
iTween.MoveTo(gameObject, iTween.Hash("y", 0.5f, "delay", 7.0f, "easetype", iTween.EaseType.easeInExpo));
iTween.ScaleTo(gameObject, iTween.Hash("y", 1.0f, "delay", 7.0f));
iTween.ShakePosition(Camera.main.gameObject, iTween.Hash("y", 0.3f, "time", 0.8f, "delay", 8.0f));
iTween.ColorTo(gameObject, iTween.Hash("r", 0.165f, "g", 0.498f, "b", 0.729f, "delay", 8.5f, "time", 0.5f));

iTween.CameraFadeAdd();
iTween.CameraFadeTo(iTween.Hash("amount", 1.0f, "time", 2.0f, "delay", 10.0f));
}


Запустим и посмотрим на результат. Довольно неплохо, не правда ли?


image


Давайте построчно разберём скрипт.



iTween.RotateFrom(gameObject, iTween.Hash("y", 90.0f, "time", 2.0f, "easetype", iTween.EaseType.easeInExpo));

Метод RotateFrom используется для того, чтобы вращать объект. В отличии от RotateTo и RotateBy, RotateFrom используется для того, чтобы инициализировать вращение указанным углом и вращать в исходное состояние. Метод, как и большинство остальных, имеет перегрузку. Можно использовать короткий или подробный вариант:

RotateFrom(GameObject target, Vector3 rotation, float time);
RotateFrom(GameObject target, Hashtable args);




Мы передаём gameObject — обьект, у которого находится текущий скрипт. Для того, чтобы не писать что-то вроде:

Hashtable args = new Hashtable();
args.Add(“y”, 90.0f);
args.Add(“time”, 2.0f);
args.Add(“easetype”, iTween.EaseType.easeInExpo);




Мы используем iTween.Hash — экспресс вариант Hashtable. В аргументах мы указали y=90.0f, это эквивалент (если x и z равны нулю, конечно)

Quaternion.Euler( new Vector3(0f, 90.0f, 0f) )




Тот поворот, с которого начнётся наше вращение.

time=2.0f




Время, которое должно быть затрачено на анимацию. Есть еще аналогичный аргумент под названием “speed”, в его случае указывается не время, а скорость, с которой будет проходить анимация. Последний аргумент, который мы указали это easetype=iTween.EaseType.easeInExpo. easetype это форма кривой, которая используется для интерполяции. Вот кривые в графическом представлении:

image


Попробуйте поэкспериментировать, если вам не понятно как это работает.




iTween.MoveFrom(gameObject, iTween.Hash("y", 3.5f, "time", 2.0f, "easetype", iTween.EaseType.easeInExpo));


MoveFrom аналогичен предыдущему, все должно быть понятно, просто вместо вращения используется перемещение.

iTween.ShakePosition(Camera.main.gameObject, iTween.Hash("y", 0.3f, "time", 0.8f, "delay", 2.0f));


ShakePosition в данном случае используется для того, чтобы имплементировать “тряску” камеры. Этот метод заставляет двигаться объект по уменьшающейся амплитуде, не использует интерполяцию, объект будет появляться в случайных точках, в отведенных ему рамках. Здесь есть новый аргумент под названием “delay”, это достаточно важная опция анимации, используется для того, чтобы указать время в секундах, которое должно пройти перед началом анимации.

iTween.ColorTo(gameObject, iTween.Hash("r", 1.0f, "g", 0.5f, "b", 0.4f, "delay", 1.5f, "time", 0.3f));


ColorTo плавно меняет цвет обьекта с течением времени.

iTween.ScaleTo(gameObject, iTween.Hash("y", 1.75f, "delay", 2.8f, "time", 2.0f));


ScaleTo, как видно из имени метода, изменяет размер объекта.

iTween.RotateBy(gameObject, iTween.Hash("x", 0.5f, "delay", 4.4f));


RotateBy напоминает RotateFrom, необходим в тех случаях, когда нужно развернуть объект более чем на 360 градусов (хотя, в данном случае можно было бы обойтись методом RotateTo). Допустим, мы указали z=2.0f, это будет означать, что объект должен развернуться два раза вокруг оси Z за определенный интервал времени.

iTween.MoveTo(gameObject, iTween.Hash("y", 1.5f, "delay", 5.8f));
iTween.MoveTo(gameObject, iTween.Hash("y", 0.5f, "delay", 7.0f, "easetype", iTween.EaseType.easeInExpo));


MoveTo, наверное, основной метод всего класса iTween. Он перемещает объект в указанные координаты за отведённое время. Интерполяция основана на всё том же easetype, который вам уже знаком.

Следующие новые методы:



iTween.CameraFadeAdd();
iTween.CameraFadeTo(iTween.Hash("amount", 1.0f, "time", 2.0f, "delay", 10.0f));


CameraFadeAdd создаёт новый объект, который используется для имитации затемнения. Глубина меняется от текущего значения к указанному в аргументах. Существуют следующие перегрузки:

CameraFadeAdd()
CameraFadeAdd(Texture2D texture)
CameraFadeAdd(Texture2D texture, int depth)


Если не указана Texture2D, будет использоваться чёрный цвет.

Из того, что я не описал, есть ещё важные моменты. Например, в аргументах можно указать метод, который будет вызываться при наступлении какого-то события. Допустим:



public class iTweenController : MonoBehaviour
{
int clbkN = 0;
GUIStyle style;

void Awake()
{
style = new GUIStyle();
style.fontSize = 60;
}

void Start()
{
iTween.MoveTo(gameObject, iTween.Hash("position", new Vector3(5.0f, 1.0f, 0.0f), "oncomplete", "myClbk",
"loopType", iTween.LoopType.loop, "speed", 2.0f));
}

void myClbk()
{
clbkN++;
}

void OnGUI()
{
GUI.Label(new Rect(10, 10, 0, 0), "Callback # "+clbkN, style);
}
}





Результат будет таким:

image


Отмечу, что использовались новые аргументы метода MoveTo:



position = new Vector3(5.0f, 1.0f, 0.0f)


Это короткая запись, релевантная “x”, 5.0f, “y”, 1.0f, “z”, 0.0f

oncomplete = "myClbk"


По завершению анимации (либо итерации цикла анимации) вызывается метод с указанным именем.

loopType = iTween.LoopType.loop


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

На этом, пожалуй, закончу. Всем спасибо за внимание.


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Комментариев нет:

Отправить комментарий