Если определить понятие 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 представляет собой массу различных вариантов:

| Имя преобразователя | Значение | Краткое содержание |
|---|---|---|
| Linear | 0 | Двигается с постоянной скоростью. |
| Sine | 1 | Скорость определяется синусоидой. |
| Back | 2 | Немного пролетает мимо цели, затем возвращается на место. |
| Quad | 3 | Скорость определяется квадратичной интерполяцией. |
| Quart | 4 | Аналогичен Quad , но запускается с более высокой скоростью. |
| Quint | 5 | Аналогичен Quart , но запускается с более высокой скоростью. |
| Bounce | 6 | После достижения цели несколько раз отскакивает назад, прежде чем остановиться. |
| Elastic | 7 | Двигается как на резиновой ленте, несколько раз пролетая мимо цели. |
| Exponential | 8 | Скорость очень быстро снижается по мере приближения к цели. |
| Circular | 9 | Следует по дуге окружности, замедляясь по мере приближения к цели. |
| Cubic | 10 | Аналогичен 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 начнёт с начала)
И ещё, можно использовать и несколько твинов на один объект. Главное чтобы они не меняли один и тот-же параметр. Иначе будет происходить между ними «борьба за власть».