SunRay Effect Studio Lite
Key RequiredUniversal

SunRay Effect Studio Lite

Universal ScriptProDev_ScripterProDev_Scripter 1.9K views 1.5K executesUpdated Oct 18, 2025
5.0/ 5(1 votes)
10100% Positive
Lua Script•121 lines (4291 chars)
local RAY_IMAGE = "rbxassetid://1084982817"
local SUN_IMAGE = "rbxassetid://277033149"
local RAY_COLOR = Color3.new(1, 1, 1)
local RAY_ROTATION = -25
local MIN_BRIGHT_TRANS = 0.5
local SUN_SIZE = Vector2.new(0.2, 0.2)
local SUN_OFFSET = Vector2.new(0.004, 0.004)
local TWEEN_SPEED = 0.5
local RAY_DIST = {1.7; 0.3; -0.3; -0.9;}
local RAY_SIZES = {0.7; 0.2; 1.2; 0.45;}
local RAY_TRANS = {0.8; 0.7; 0.9; 0.6;}
local SUN_RAY_SIZE = 20
local SUN_RAY_TRANS = 0
local SUN_RAY_COLOR = Color3.new(1, 1, 0.95)
local lighting = game:GetService("Lighting")
local runService = game:GetService("RunService")
local player = game.Players.LocalPlayer
local playerGui = player:WaitForChild("PlayerGui")
local camera = workspace.CurrentCamera
local realMod = 1

local function Clip(n, l, h)
	if n < l then return l end
	if n > h then return h end
	return n
end

local function GetSunPosition()
	local screenPoint = camera:WorldToScreenPoint(camera.CoordinateFrame.p + lighting:GetSunDirection())
	return Vector2.new(screenPoint.x, screenPoint.y), screenPoint.z > 0
end

local function ScreenCenter()
	return camera.ViewportSize / 2
end

local function IsObstructed(ignore)
	return workspace:FindPartOnRay(Ray.new(camera.CoordinateFrame.p, lighting:GetSunDirection() * 900), ignore) ~= nil
end

local function brightness(x)
	return Clip(1 - (1 - MIN_BRIGHT_TRANS) * x, 0, 1)
end

local function OnCharacterAdded(character)
	local root = character:WaitForChild("HumanoidRootPart")
	local rays = {}
	local screenGui

	for _, child in pairs(script.Parent:GetChildren()) do
		if child:IsA("ScreenGui") then
			screenGui = child
			break
		end
	end

	if not screenGui then screenGui = Instance.new("ScreenGui", playerGui) end

	local brightScreen = Instance.new("Frame", screenGui)
	brightScreen.Name = "RayWashout"
	brightScreen.Size = UDim2.new(2, 0, 2, 0)
	brightScreen.BackgroundColor3 = RAY_COLOR
	brightScreen.ZIndex = 10
	brightScreen.Transparency = 1
	brightScreen.AnchorPoint = Vector2.new(0.5, 0.5)
	brightScreen.Position = UDim2.new(0.5, 0, 0.5, 0)

	for i = 1, #RAY_DIST do
		local ray = Instance.new("ImageLabel", screenGui)
		ray.Name = "RayGhost"
		ray.SizeConstraint = Enum.SizeConstraint.RelativeYY
		ray.Size = UDim2.new(RAY_SIZES[i] * SUN_SIZE.x, 0, RAY_SIZES[i] * SUN_SIZE.y, 0)
		ray.Rotation = RAY_ROTATION
		ray.Image = RAY_IMAGE
		ray.ImageColor3 = RAY_COLOR
		ray.BackgroundTransparency = 1
		ray.ImageTransparency = RAY_TRANS[i]
		ray.ZIndex = 10
		rays[#rays + 1] = ray
	end

	local sunRay = Instance.new("ImageLabel", screenGui)
	sunRay.Name = "SunRay"
	sunRay.SizeConstraint = Enum.SizeConstraint.RelativeYY
	sunRay.Size = UDim2.new(SUN_RAY_SIZE * SUN_SIZE.x, 0, SUN_RAY_SIZE * SUN_SIZE.y, 0)
	sunRay.Image = SUN_IMAGE
	sunRay.ImageColor3 = SUN_RAY_COLOR
	sunRay.BackgroundTransparency = 1
	sunRay.ImageTransparency = SUN_RAY_TRANS
	sunRay.ZIndex = 10

	runService:UnbindFromRenderStep("SunRayReposition")
	runService:BindToRenderStep("SunRayReposition", Enum.RenderPriority.Last.Value, function()
		local sunPosition, isInFront = GetSunPosition()
		local isClear = not IsObstructed((root.Position + Vector3.new(0, 1.5, 0) - camera.CoordinateFrame.p).magnitude < 1.1 and character or nil)
		local targetMod = isClear and 1 or 0
		realMod = realMod * (1 - TWEEN_SPEED) + targetMod * TWEEN_SPEED
		local screenCenter = ScreenCenter()
		local vec = sunPosition - screenCenter

		for i = 1, #rays do
			rays[i].ImageTransparency = 1 - realMod + RAY_TRANS[i] * realMod
			local thisSize = rays[i].AbsoluteSize
			local thisPosition = screenCenter + vec * RAY_DIST[i]
			rays[i].Position = UDim2.new(SUN_OFFSET.x, thisPosition.x - thisSize.x / 2, SUN_OFFSET.y, thisPosition.y - thisSize.y / 2)
			rays[i].Visible = isInFront
		end

		sunRay.ImageTransparency = 1 - realMod + SUN_RAY_TRANS * realMod
		local sunRaySize = sunRay.AbsoluteSize
		sunRay.Position = UDim2.new(SUN_OFFSET.x, sunPosition.x - sunRaySize.x / 2, SUN_OFFSET.y, sunPosition.y - sunRaySize.y / 2)
		sunRay.Visible = isInFront

		local cosAngle = camera.CoordinateFrame.lookVector:Dot(lighting:GetSunDirection())
		brightScreen.Transparency = 1 - realMod + brightness(cosAngle) * realMod
	end)
end

repeat task.wait() until player.Character
OnCharacterAdded(player.Character)
player.CharacterAdded:Connect(OnCharacterAdded)

Features & Information

It makes SunRays. Looks cool.

Community Comments (0)

No comments yet for this script.

More Scripts for Universal Scripts