ブログ一覧へ

TweenServiceの応用テクニック|連続アニメーションとUI演出でゲームの完成度を上げる

TweenServiceの基本記事でパーツをなめらかに動かす方法を紹介しました。「単発のアニメーションは作れる」という方が次に直面するのは、どう組み合わせて演出を作るかという問題です。

この記事では、連続Tween・ループ・複数プロパティの同時アニメーション・UIへの応用といった応用パターンを実例とともに解説します。ゲームの「完成度の差」はこういった細部の積み重ねです。


連続アニメーション:Tweenを順番につなげる

アイテム獲得演出やステージクリア演出など、「動き1→動き2→動き3」と順番に実行したい場面は多くあります。これには Completed イベントを使います。

local TweenService = game:GetService("TweenService")
local part = workspace:WaitForChild("Chest")

local info = TweenInfo.new(0.5, Enum.EasingStyle.Back, Enum.EasingDirection.Out)

-- ① 上に跳ねる
local jumpUp = TweenService:Create(part, info, {
    Position = part.Position + Vector3.new(0, 3, 0)
})

-- ② 元の位置に戻る
local fallDown = TweenService:Create(part, info, {
    Position = part.Position
})

-- ③ 回転してフェードアウト
local infoSpin = TweenInfo.new(0.8, Enum.EasingStyle.Quad, Enum.EasingDirection.In)
local spinOut = TweenService:Create(part, infoSpin, {
    Transparency = 1,
    Size = part.Size * 1.5
})

-- 連続実行
jumpUp:Play()
jumpUp.Completed:Connect(function()
    fallDown:Play()
    fallDown.Completed:Connect(function()
        spinOut:Play()
    end)
end)

Completed イベントはTweenが最後まで再生されたときに発火します。これを入れ子にすることで、タイミングを正確に制御した演出シーケンスが作れます。


ループTween:常に動き続けるオブジェクトを作る

環境演出(漂う光・揺れる看板・浮遊するアイテム)では、アニメーションを繰り返し続ける必要があります。RepeatCount-1 に設定すると無限ループになります。

local TweenService = game:GetService("TweenService")
local lantern = workspace:WaitForChild("Lantern")

local floatInfo = TweenInfo.new(
    2,                              -- 2秒かけて
    Enum.EasingStyle.Sine,          -- なめらかな波形で
    Enum.EasingDirection.InOut,
    -1,                             -- 無限ループ
    true,                           -- 折り返して元の位置に戻る
    0
)

local floatTween = TweenService:Create(lantern, floatInfo, {
    Position = lantern.Position + Vector3.new(0, 1.5, 0)
})

floatTween:Play()

Reverses = true にすることで、上に動いたあと自動的に元の位置に戻ります。Sine + InOut の組み合わせは、呼吸するような自然なループ感が出るのでお祭りや和風の世界観にもよく合います。


複数プロパティの同時アニメーション

1つの TweenService:Create() のゴールテーブルには、複数のプロパティを同時に指定できます。位置・サイズ・色・透明度を1つのTweenでまとめて変化させることが可能です。

local TweenService = game:GetService("TweenService")
local gem = workspace:WaitForChild("Gem")

local info = TweenInfo.new(1.2, Enum.EasingStyle.Elastic, Enum.EasingDirection.Out)

local spawnTween = TweenService:Create(gem, info, {
    Position = gem.Position + Vector3.new(0, 5, 0),
    Size      = gem.Size * 1.8,
    Color     = Color3.fromRGB(255, 220, 0),
    Transparency = 0
})

-- 初期状態を透明にしてからTweenで現れさせる
gem.Transparency = 1
spawnTween:Play()

注意点: 同じパーツの同じプロパティを2つのTweenから同時に操作すると競合します。1パーツ・1プロパティに対してTweenは常に1つだけ動かすよう管理してください。


UIアニメーション:フェードインとスライドイン

TweenServiceはUIオブジェクト(FrameTextLabelImageLabelなど)にも同じ書き方で使えます。透明度やサイズ・位置をTweenすることで、洗練されたUI演出が作れます。

フェードイン

local TweenService = game:GetService("TweenService")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
local gui = player.PlayerGui:WaitForChild("ResultScreen")
local frame = gui:WaitForChild("Frame")

-- 初期状態:透明
frame.BackgroundTransparency = 1

local fadeIn = TweenService:Create(
    frame,
    TweenInfo.new(0.6, Enum.EasingStyle.Quad, Enum.EasingDirection.Out),
    { BackgroundTransparency = 0 }
)

fadeIn:Play()

スライドイン

UIをスライドさせるには Position プロパティをTweenします。UDim2 を使って画面外から画面内へ動かします。

-- 初期位置:画面右外
frame.Position = UDim2.new(1.2, 0, 0.3, 0)

local slideIn = TweenService:Create(
    frame,
    TweenInfo.new(0.5, Enum.EasingStyle.Back, Enum.EasingDirection.Out),
    { Position = UDim2.new(0.5, 0, 0.3, 0) }
)

slideIn:Play()

Back + Out を使うと、少し行き過ぎてから止まる弾力感が生まれ、UIがパキッと開く印象になります。


おわりに

TweenServiceの基本を覚えてから、次に悩んだのは「どう組み合わせるか」でした。単発のアニメーションはできても、連続した演出やUIのフェードインをどう実装するか、試行錯誤が続きました。この記事で紹介したパターンを知ることで、ゲームの完成度が一段階上がります。

EasingStyleの動きをコードを書く前に確かめたいときは、Roblox Tween Generator を活用してください。全パラメータをブラウザ上で設定してすぐ使えるコードをコピーできるので、試行錯誤の時間を大幅に短縮できます。


まとめ

テクニック 使いどころ
連続Tween(Completed アイテム獲得・ステージクリア演出
ループTween(RepeatCount = -1 浮遊・揺れなど環境演出
複数プロパティ同時 出現・消滅エフェクト
UIフェードイン リザルト画面・通知
UIスライドイン メニュー・パネルの開閉

TweenServiceはパーツもUIも同じAPIで扱えます。基本パターンをひとつ覚えれば、応用先は無限に広がります。