Thunder anim v4
Key RequiredUniversal

Thunder anim v4

Universal ScriptThunderyThundery 42.5K views 277 executesUpdated Aug 29, 2025
5.0/ 5(4 votes)
40100% Positive
Lua Script•432 lines (14687 chars)
repeat task.wait() until game:IsLoaded()

local Players      = game:GetService("Players")
local TweenService = game:GetService("TweenService")
local RunService   = game:GetService("RunService")
local Lighting     = game:GetService("Lighting")

local LocalPlayer = Players.LocalPlayer or Players.PlayerAdded:Wait()


local CFG = {
	size        = 270,
	thickness   = 18,
	corner      = 24,
	duration    = 7,    
	spinDeg     = 95,
	spinTime    = 0.85,
	breathMin   = 0.985,
	breathMax   = 1.02,
	bubbleCount = 4,
	bubbleScale = 2.7,
	bubbleGap   = 0.12,
	creditText  = "-- Thunder Hub --",
	rainbowSeconds = 1.0, 
	rainbowTurns   = 1.25 
}

local BLUE_LIGHT = Color3.fromRGB(120, 205, 255)
local BLUE_MAIN  = Color3.fromRGB( 64, 145, 255)
local BLUE_DEEP  = Color3.fromRGB( 28,  72, 165)
local CYAN_SOFT  = Color3.fromRGB(140, 245, 255)
local BG_COLOR   = Color3.fromRGB(  5,   9,  20)

local function getGuiParent()
	local ok, root = pcall(function() return (gethui and gethui()) end)
	if ok and root then return root end
	ok, root = pcall(function() return (get_hidden_gui and get_hidden_gui()) end)
	if ok and root then return root end
	ok, root = pcall(function() return (gethiddengui and gethiddengui()) end)
	if ok and root then return root end
	local pg = LocalPlayer:FindFirstChildOfClass("PlayerGui") or LocalPlayer:WaitForChild("PlayerGui", 5)
	return pg or game:GetService("CoreGui")
end

pcall(function()
	if _G.ThunderIntro_Stop then _G.ThunderIntro_Stop() end
end)

local parent  = getGuiParent()
local running = true

local blur = Instance.new("BlurEffect")
blur.Size = 8
blur.Name = "ThunderIntroBlur"
blur.Parent = Lighting

local sg = Instance.new("ScreenGui")
sg.Name = "ThunderIntroMAX"
sg.IgnoreGuiInset = true
sg.ResetOnSpawn = false
pcall(function() if syn and syn.protect_gui then syn.protect_gui(sg) end end)
sg.Parent = parent


local bg = Instance.new("Frame")
bg.Size = UDim2.fromScale(1,1)
bg.BackgroundColor3 = BG_COLOR
bg.BackgroundTransparency = 0.25
bg.Parent = sg

local main = Instance.new("Frame")
main.Size = UDim2.fromOffset(CFG.size, CFG.size)
main.AnchorPoint = Vector2.new(0.5,0.5)
main.Position = UDim2.fromScale(0.5,0.5)
main.BackgroundTransparency = 1
main.Parent = sg

local ring = Instance.new("Frame")
ring.Size = UDim2.fromScale(1,1)
ring.BackgroundTransparency = 1
ring.Parent = main
local rCorner = Instance.new("UICorner"); rCorner.CornerRadius = UDim.new(0, CFG.corner); rCorner.Parent = ring
local rStroke = Instance.new("UIStroke")
rStroke.Thickness = CFG.thickness
rStroke.Color = BLUE_MAIN
pcall(function() rStroke.ApplyStrokeMode = Enum.ApplyStrokeMode.Border end)
rStroke.Parent = ring

local glowRing = Instance.new("Frame")
glowRing.Size = UDim2.fromScale(1,1)
glowRing.BackgroundTransparency = 1
glowRing.ZIndex = -1
glowRing.Parent = main
local gCorner = Instance.new("UICorner"); gCorner.CornerRadius = UDim.new(0, CFG.corner); gCorner.Parent = glowRing
local gStroke = Instance.new("UIStroke")
gStroke.Thickness = CFG.thickness * 1.7
gStroke.Color = CYAN_SOFT
gStroke.Transparency = 0.7
pcall(function() gStroke.ApplyStrokeMode = Enum.ApplyStrokeMode.Border end)
gStroke.Parent = glowRing

local inner = Instance.new("Frame")
inner.Size = UDim2.fromOffset(CFG.size - CFG.thickness*2, CFG.size - CFG.thickness*2)
inner.AnchorPoint = Vector2.new(0.5,0.5)
inner.Position = UDim2.fromScale(0.5,0.5)
inner.BackgroundTransparency = 1
inner.Parent = main

local title = Instance.new("TextLabel")
title.Size = UDim2.fromScale(0.9,0.4)
title.AnchorPoint = Vector2.new(0.5,0.5)
title.Position = UDim2.fromScale(0.5,0.40)
title.BackgroundTransparency = 1
title.Text = "THUNDER"
title.TextScaled = true
title.Font = Enum.Font.GothamBlack
title.TextColor3 = BLUE_MAIN
title.TextTransparency = 1
title.Parent = inner
local grad = Instance.new("UIGradient")
grad.Color = ColorSequence.new{
	ColorSequenceKeypoint.new(0.00, BLUE_LIGHT),
	ColorSequenceKeypoint.new(0.50, BLUE_MAIN),
	ColorSequenceKeypoint.new(1.00, BLUE_DEEP)
}
grad.Rotation = 25
grad.Parent = title

local sub = Instance.new("TextLabel")
sub.Size = UDim2.fromScale(0.6,0.2)
sub.AnchorPoint = Vector2.new(0.5,0.5)
sub.Position = UDim2.fromScale(0.5,0.65)
sub.BackgroundTransparency = 1
sub.Text = "HUB"
sub.TextScaled = true
sub.Font = Enum.Font.GothamMedium
sub.TextColor3 = BLUE_LIGHT
sub.TextTransparency = 1
sub.Parent = inner

task.spawn(function()
	while running do
		grad.Rotation = (grad.Rotation + 1) % 360
		task.wait(0.02)
	end
end)


local orb = Instance.new("Frame")
orb.AnchorPoint = Vector2.new(0.5,0.5)
orb.Position = UDim2.fromScale(0.5,0.65)
orb.Size = UDim2.fromOffset(120,120)
orb.BackgroundColor3 = CYAN_SOFT
orb.BackgroundTransparency = 0.9
orb.ZIndex = -1
orb.Parent = inner
local orbCorner = Instance.new("UICorner"); orbCorner.CornerRadius = UDim.new(1,0); orbCorner.Parent = orb

local function Spark()
	local s = Instance.new("Frame")
	s.Size = UDim2.fromOffset(2,2)
	s.AnchorPoint = Vector2.new(0.5,0.5)
	s.Position = orb.Position
	s.BackgroundColor3 = Color3.fromRGB(255,255,255)
	s.BackgroundTransparency = 0
	s.ZIndex = 5
	s.Parent = inner

	local goalPos = orb.Position + UDim2.fromOffset(math.random(-60,60), math.random(-60,60))
	TweenService:Create(s, TweenInfo.new(0.25), {Position = goalPos, BackgroundTransparency = 1}):Play()
	game:GetService("Debris"):AddItem(s, 0.3)
end

for i=1,12 do task.delay(i*0.01, Spark) end

local function CameraShake(ui)
	local orig = ui.Position
	for i = 1, 4 do
		ui.Position = orig + UDim2.fromOffset(math.random(-4,4), math.random(-4,4))
		task.wait(0.04)
	end
	ui.Position = orig
end
CameraShake(main)


local credit = Instance.new("TextLabel")
credit.Size = UDim2.fromOffset(220,20)
credit.AnchorPoint = Vector2.new(1,1)
credit.Position = UDim2.fromScale(0.985,0.985)
credit.BackgroundTransparency = 1
credit.Text = CFG.creditText
credit.TextColor3 = Color3.fromRGB(190,205,235)
credit.Font = Enum.Font.Gotham
credit.TextSize = 12
credit.TextTransparency = 1
credit.Parent = sg

local sweep = Instance.new("Frame")
sweep.BackgroundTransparency = 1
sweep.Size = UDim2.fromScale(1.2,1.2)
sweep.AnchorPoint = Vector2.new(0.5,0.5)
sweep.Position = UDim2.fromScale(-0.2,0.5)
sweep.Rotation = -15
sweep.ZIndex = 8
sweep.Parent = inner
local sweepGrad = Instance.new("UIGradient")
sweepGrad.Color = ColorSequence.new{
	ColorSequenceKeypoint.new(0.00, Color3.new(1,1,1)),
	ColorSequenceKeypoint.new(0.50, Color3.new(1,1,1)),
	ColorSequenceKeypoint.new(1.00, Color3.new(1,1,1)),
}
sweepGrad.Transparency = NumberSequence.new{
	NumberSequenceKeypoint.new(0.00,1.0),
	NumberSequenceKeypoint.new(0.48,0.25),
	NumberSequenceKeypoint.new(0.52,0.00),
	NumberSequenceKeypoint.new(0.56,0.25),
	NumberSequenceKeypoint.new(1.00,1.0),
}
sweepGrad.Parent = sweep


local bubbleFolder = Instance.new("Folder")
bubbleFolder.Name = "Bubbles"
bubbleFolder.Parent = main

local function makeBubble()
	local b = Instance.new("Frame")
	b.AnchorPoint = Vector2.new(0.5,0.5)
	b.Position = UDim2.fromScale(0.5,0.5)
	b.Size = UDim2.fromOffset(1,1)
	b.BackgroundTransparency = 1
	b.ZIndex = -2
	b.Parent = bubbleFolder
	local s = Instance.new("UIStroke")
	s.Thickness = 3
	s.Color = CYAN_SOFT
	s.Transparency = 0.1
	s.Parent = b
	local c = Instance.new("UICorner"); c.CornerRadius = UDim.new(1,999); c.Parent = b
	return b, s
end


local ringScale = Instance.new("UIScale"); ringScale.Scale = 1; ringScale.Parent = ring
local mainScale = Instance.new("UIScale"); mainScale.Scale = 1; mainScale.Parent = main


_G.ThunderIntro_Stop = function()
	if not running then return end
	running = false
	if sg and sg.Parent then sg:Destroy() end
	if blur and blur.Parent then blur:Destroy() end
end

local ORIG = {
	rStroke = rStroke.Color,
	gStroke = gStroke.Color,
	titleGradient = grad.Color,
	sub = sub.TextColor3,
	orb = orb.BackgroundColor3
}

local function HSV(h, s, v) return Color3.fromHSV(h % 1, s, v) end

local function setTitleGradientFromHue(h)
	grad.Color = ColorSequence.new{
		ColorSequenceKeypoint.new(0.00, HSV(h,     1,1)),
		ColorSequenceKeypoint.new(0.50, HSV(h+0.15,1,1)),
		ColorSequenceKeypoint.new(1.00, HSV(h+0.30,1,1))
	}
end

local function RainbowBurst()
	local dur  = math.max(0.099, CFG.rainbowSeconds)
	local turns = CFG.rainbowTurns
	local start = os.clock()
	while running do
		local t = os.clock() - start
		if t > dur then break end
		local u = t / dur
		local h = u * turns
		rStroke.Color = HSV(h, 1, 1)
		gStroke.Color = HSV(h+0.08, 1, 1)
		setTitleGradientFromHue(h)
		sub.TextColor3 = HSV(h+0.22, 1, 1)
		orb.BackgroundColor3 = HSV(h+0.12, 0.85, 1)
		RunService.Heartbeat:Wait()
	end


	rStroke.Color = ORIG.rStroke
	gStroke.Color = ORIG.gStroke
	grad.Color    = ORIG.titleGradient
	sub.TextColor3 = ORIG.sub
	orb.BackgroundColor3 = ORIG.orb
end


task.spawn(RainbowBurst)


task.spawn(function()
	local flash = Instance.new("Frame")
	flash.Size = UDim2.fromScale(1,1)
	flash.BackgroundColor3 = Color3.new(1,1,1)
	flash.BackgroundTransparency = 1
	flash.ZIndex = 999
	flash.Parent = sg
	local fIn  = TweenService:Create(flash, TweenInfo.new(0.05), {BackgroundTransparency = 0.55})
	local fOut = TweenService:Create(flash, TweenInfo.new(0.12), {BackgroundTransparency = 1})
	fIn:Play(); fIn.Completed:Wait(); fOut:Play(); fOut.Completed:Wait()
	flash:Destroy()
end)

task.spawn(function()
	while running do
		local t1 = TweenService:Create(ring,     TweenInfo.new(CFG.spinTime, Enum.EasingStyle.Exponential, Enum.EasingDirection.InOut), {Rotation = ring.Rotation + CFG.spinDeg})
		local t2 = TweenService:Create(glowRing, TweenInfo.new(CFG.spinTime, Enum.EasingStyle.Exponential, Enum.EasingDirection.InOut), {Rotation = glowRing.Rotation + CFG.spinDeg})
		t1:Play(); t2:Play(); t1.Completed:Wait()
	end
end)

task.spawn(function()
	while running do
		TweenService:Create(ringScale, TweenInfo.new(1.2, Enum.EasingStyle.Sine, Enum.EasingDirection.Out), {Scale = CFG.breathMax}):Play()
		task.wait(1.2)
		TweenService:Create(ringScale, TweenInfo.new(1.2, Enum.EasingStyle.Sine, Enum.EasingDirection.In),  {Scale = CFG.breathMin}):Play()
		task.wait(1.2)
	end
end)

task.spawn(function()
	task.wait(0.3)
	TweenService:Create(title,  TweenInfo.new(0.8, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), {TextTransparency = 0}):Play()
	task.wait(0.25)
	TweenService:Create(sub,    TweenInfo.new(0.6, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), {TextTransparency = 0}):Play()
	TweenService:Create(credit, TweenInfo.new(0.6, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), {TextTransparency = 0.2}):Play()
end)

task.spawn(function()
	while running do
		local up = TweenService:Create(orb, TweenInfo.new(1.5, Enum.EasingStyle.Sine, Enum.EasingDirection.Out), {BackgroundTransparency = 0.8, Size = UDim2.fromOffset(140,140)})
		local dn = TweenService:Create(orb, TweenInfo.new(1.5, Enum.EasingStyle.Sine, Enum.EasingDirection.In),  {BackgroundTransparency = 0.9, Size = UDim2.fromOffset(120,120)})
		up:Play(); up.Completed:Wait(); dn:Play(); dn.Completed:Wait()
	end
end)


local function BubblePop()

	local baseT = bg.BackgroundTransparency
	local flashDown = TweenService:Create(bg, TweenInfo.new(0.08, Enum.EasingStyle.Sine, Enum.EasingDirection.Out), {BackgroundTransparency = math.max(0, baseT - 0.12)})
	local flashUp   = TweenService:Create(bg, TweenInfo.new(0.18, Enum.EasingStyle.Sine, Enum.EasingDirection.In),  {BackgroundTransparency = baseT})
	flashDown:Play(); flashDown.Completed:Wait(); flashUp:Play()

	local oldThick = rStroke.Thickness
	local oldColor = rStroke.Color
	local boostA = TweenService:Create(rStroke, TweenInfo.new(0.08, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {Thickness = oldThick * 1.35, Color = CYAN_SOFT})
	local boostB = TweenService:Create(rStroke, TweenInfo.new(0.22, Enum.EasingStyle.Quad,  Enum.EasingDirection.In),  {Thickness = oldThick,               Color = oldColor})
	boostA:Play(); boostA.Completed:Wait(); boostB:Play()

	local thumpUp = TweenService:Create(mainScale, TweenInfo.new(0.08, Enum.EasingStyle.Back, Enum.EasingDirection.Out), {Scale = 1.03})
	local thumpDn = TweenService:Create(mainScale, TweenInfo.new(0.20, Enum.EasingStyle.Quad,  Enum.EasingDirection.In),  {Scale = 1})
	thumpUp:Play(); thumpUp.Completed:Wait(); thumpDn:Play()

	for i = 1, CFG.bubbleCount do
		task.spawn(function()
			local b, s = makeBubble()
			local grow = TweenService:Create(b, TweenInfo.new(0.6, Enum.EasingStyle.Cubic, Enum.EasingDirection.Out), {Size = UDim2.fromOffset(CFG.size * CFG.bubbleScale, CFG.size * CFG.bubbleScale)})
			local fade = TweenService:Create(s, TweenInfo.new(0.6, Enum.EasingStyle.Sine,  Enum.EasingDirection.Out), {Transparency = 1})
			grow:Play(); fade:Play(); grow.Completed:Wait()
			b:Destroy()
		end)
		task.wait(CFG.bubbleGap)
	end
end

task.spawn(function()
	BubblePop()
end)

task.spawn(function()
	task.wait(0.25)
	local flash = Instance.new("Frame")
	flash.Size = UDim2.fromScale(1,1)
	flash.BackgroundColor3 = Color3.fromRGB(255,255,255)
	flash.BackgroundTransparency = 1
	flash.ZIndex = -5
	flash.Parent = sg
	local fIn  = TweenService:Create(flash, TweenInfo.new(0.08, Enum.EasingStyle.Sine,  Enum.EasingDirection.Out), {BackgroundTransparency = 0.6})
	local fOut = TweenService:Create(flash, TweenInfo.new(0.20, Enum.EasingStyle.Sine,  Enum.EasingDirection.In),  {BackgroundTransparency = 1})
	fIn:Play(); fIn.Completed:Wait(); fOut:Play(); fOut.Completed:Wait()
	flash:Destroy()
end)

task.spawn(function()
	task.wait(0.55)
	TweenService:Create(sweep, TweenInfo.new(1.1, Enum.EasingStyle.Sine, Enum.EasingDirection.Out), {Position = UDim2.fromScale(1.2, 0.5)}):Play()
end)

local function PulseRing()
	local ring = main:Clone()
	ring.Size = UDim2.fromOffset(0, 0)
	ring.BackgroundTransparency = 0.5
	ring.Parent = inner

	TweenService:Create(ring, TweenInfo.new(0.6, Enum.EasingStyle.Quart), {
		Size = UDim2.fromOffset(300, 300),
		BackgroundTransparency = 1
	}):Play()

	game:GetService("Debris"):AddItem(ring, 0.6)
end

if bubbleTween then bubbleTween.Completed:Connect(PulseRing) end
if popSound then popSound.Ended:Connect(PulseRing) end

if CFG.duration and CFG.duration > 0 then
	task.delay(CFG.duration, function()
		if not running then return end
		local fade = TweenInfo.new(0.55, Enum.EasingStyle.Quad, Enum.EasingDirection.InOut)
		TweenService:Create(rStroke,  fade, {Transparency = 1}):Play()
		TweenService:Create(gStroke,  fade, {Transparency = 1}):Play()
		TweenService:Create(title,    fade, {TextTransparency = 1}):Play()
		TweenService:Create(sub,      fade, {TextTransparency = 1}):Play()
		TweenService:Create(credit,   fade, {TextTransparency = 1}):Play()
		TweenService:Create(bg,       fade, {BackgroundTransparency = 1}):Play()
		task.wait(0.6)
		_G.ThunderIntro_Stop()
	end)
end

Features & Information

ts looks so gyat + uh anim
#anim#intro#cool#open source#os

Community Comments (5)

ThunderyThunderyAug 29, 2025

i added as much as i can like for effects but i ran out of effects tell me wad to add next so i can uh add more effects bc like idrk wad to add

ThunderyThunderyAug 29, 2025

btw ts is like open srs idrc if u steal it and put it in ur sh*y script js atleast say Thunder made ts or sm

UhrvnsUhrvnsAug 29, 2025

Lets gooo🔥

sutartthebaconsutartthebaconNov 9, 2025

i also made oe

sutartthebaconsutartthebaconNov 9, 2025

one*

More Scripts for Universal Scripts