ROBLOX — Tween Service — использование

Автор: | 22 апреля, 2023
Поделиться...

Если определить понятие Tween нормальным языком, то это служба плавного изменения значения во времени. Причём выполняется это параллельно с остальным выполнение кода. Именно оба этих нюанса придают шарма вашему коду.

Зачастую это применяется в эффектах GUI или имитирует анимации в играх. Например изменение размера или выезд меню, открывание дверей, передвижение препятствий.

Т.к. это применяется на цифровых значениях, то результатом стало то, что это можно применить к данным объектам (согласно инструкции)

По факту это можно применить и к обычным переменным, но об будет в конце.

Как же это работает? Почти как обычная сторонняя функция — нужны стартовые параметры, итоговые и конечно сам запуск на исполнение.

Так как это служба, то желательно сделать на неё ссылку:

local TweenService = game:GetService("TweenService")

Параметры

Далее нам нужны параметры исполнения «анимации» — а точнее преобразования числовых значений. Это задаётся в TweenInfo. Это обычный список, в котором кроме первого значения (если его опустить, то результат будет мгновенным) все остальные являются не обязательными:

new(time: number, easingStyle: EasingStyle, easingDirection: EasingDirection, repeatCount: number, reverses: boolean, delayTime: number)  

  • time — число — время в секундах на достижение конечного результата (обязательный параметр)
  • easingStyle — стиль анимации (подробней ниже)
  • easingDirection — In, Out, InOut (0, 1, 2)- направление расчётов прямой, обратный, оба направления
  • repeatCount — число — сколько всего раз повторить анимацию (по умолчанию 1)
  • reverses — логическое — будет ли анмация выполнятся и в обратном направлении (по умолчанию false)
  • delayTime — число — время в секундах до запуска анимации (по умолчанию 0)

easingStyle представляет собой массу различных вариантов:

Имя преобразователяЗначениеКраткое содержание
Linear0Двигается с постоянной скоростью.
Sine1Скорость определяется синусоидой.
Back2Немного пролетает мимо цели, затем возвращается на место.
Quad3Скорость определяется квадратичной интерполяцией.
Quart4Аналогичен Quad , но запускается с более высокой скоростью.
Quint5Аналогичен Quart , но запускается с более высокой скоростью.
Bounce6После достижения цели несколько раз отскакивает назад, прежде чем остановиться.
Elastic7Двигается как на резиновой ленте, несколько раз пролетая мимо цели.
Exponential8Скорость очень быстро снижается по мере приближения к цели.
Circular9Следует по дуге окружности, замедляясь по мере приближения к цели.
Cubic10Аналогичен Quad , но запускается с более низкой скоростью.

Довольно часто достаточно просто указать время, например:

local tweenInfo = TweenInfo.new(2)

Конечно можно использовать и полный вариант для более тонкой настройки и большей вариативности:

local tweenInfo = TweenInfo.new(
	2, -- Time
	Enum.EasingStyle.Linear, -- EasingStyle (стиль расчётов)
	Enum.EasingDirection.Out, -- EasingDirection (направление расчётов)
	-1, -- RepeatCount (отрицательное значение заставляет повторять бесконечно)
	true, -- Reverses (разрешаем менять направление по достижении цели - реверсия расчётов)
	0 -- DelayTime (время задержки)
)

Сразу предупрежу, порядок параметров важен.

После того, как определились с параметрами нужно создать сам твин. За это отвечает метод Create. Например:

local tween = TweenService:Create(object, tweenInfo, result)

Т.е. всё просто — указываем ему с каким объектом (object) производим действие, описание преобразования (tweenInfo) и собственно какого результата должны достичь (result) относительно начального.

Из всего выше мы не в курсе только параметра result. По факту всё просто, это любое числовое свойство объекта или иное из списка в самом начале. Например: Transparency.

local result = {Transparency = 1}

Вроде всё готово. Но так как это функция, её ещё надо запустить на исполнение. За это отвечает метод Play:

tween:Play()

С теорией вроде как разобрались. Перейдём к практике.

Примеры

Самое простое — сделаем исчезающий парт.

Для этого бросим парт на поле и создадим в нём скрипт.

local TweenService = game:GetService("TweenService")		-- подключение сервиса

local object = script.Parent								-- указываем объект взаимодействия

local tweenInfo = TweenInfo.new(20)							-- указываем параметры

local result = {Transparency = 1}							-- указываем нужный результат

local tween = TweenService:Create(object, tweenInfo, result)-- создаём собственно сам твин

tween:Play()												-- запускаем его на исполнение

Что у нас тут ожидается? В течении 10 секунд (от старта мира) наш парт должен стать не видимым.

Как видим это просто и.. это работает.

Усложним себе задачу. Заставим парт двигаться вперёд-назад и менять цвет. Ну и.. задействуем все настройки твина.

local TweenService = game:GetService("TweenService")		-- подключение сервиса

local object = script.Parent								-- указываем объект взаимодействия

local tweenInfo = TweenInfo.new(							-- указываем параметры
	5, 							-- Time
	Enum.EasingStyle.Quad, 		-- EasingStyle (стиль расчётов)
	Enum.EasingDirection.In, 	-- EasingDirection (направление расчётов)
	-1, 						-- RepeatCount (отрицательное значение заставляет повторять бесконечно)
	true, 						-- Reverses (разрешаем менять направление по достижении цели - реверсия расчётов)
	2 							-- DelayTime (время задержки)
)

local result = {}							-- указываем массив результатов
result.Position = Vector3.new(0, 2, -50)	-- перемещение в новую точку
result.Color = Color3.new(0, 1, 0)			-- смена цвета

local tween = TweenService:Create(object, tweenInfo, result)-- создаём собственно сам твин

tween:Play()												-- запускаем его на исполнение

Светится парт потому что ему назначен материал Neon.

Ах да. Что же делать, если нужно менять переменную, а не объект? Вообще у твинсервиса есть метод GetValue, который позволяет получить новое значение с любого этапа преобразования и не запуская самого твина. Но… Это не наш метод, мы же не ищем лёгких путей. Да и нам нужно чтобы оно само работало.

local varChange = 10	-- переменная которая должна меняться

-- создаём объект никуда не прикреплённый
local TweenService = game:GetService("TweenService")		-- подключение сервиса
local object = Instance.new("IntValue")						-- указываем объект взаимодействия
object.Value = varChange

object.Changed:Connect(function()
	varChange = object.Value
	print(varChange)
end)

local tweenInfo = TweenInfo.new(40)							-- указываем параметры
local result = {Value = 30}							-- указываем массив результатов
local tween = TweenService:Create(object, tweenInfo, result)-- создаём собственно сам твин
tween:Play()												-- запускаем его на исполнение

Получаем, то что хотели…

Итоги

В качестве итога хотелось бы отметить что использование Tween весьма приятная штука. И если её освоить, то зачастую жить станет легче.

Ещё есть пара методов:

  • Pause — приостановить расчёты — анимация замрёт (Play продолжит)
  • Cancel — прекратить расчёты — полностью остановит анимацию (Play начнёт с начала)

И ещё, можно использовать и несколько твинов на один объект. Главное чтобы они не меняли один и тот-же параметр. Иначе будет происходить между ними «борьба за власть».


Поделиться...

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *