Scripting HelpersARCHIVE
A little piece of Roblox history. Preserved for everyone, one question at a time.Read about the archive →
✓ ANSWER ACCEPTED

having problems with changing skyboxes in lighing?

Hi everyone,

So i was asked as a suggestion in my game to make a button that can be clicked to change skyboxes, however i tried many pieces of code but to no avail. My skyboxes are: sunset, mountains, City and sky.

Here is 1 piece of code that i used:

local button = script.Parent
local lighting = game:GetService("Lighting")

local function onButtonClick()
	if button.Text == "Sunset" then
		lighting.Sunset.Parent = script.Parent.skyboxes
		script.Parent.skyboxes.Mountain = lighting
		button.Text = "Mountains"
	if button.Text == "Mountains" then
		lighting.Mountain.Parent = script.Parent.skyboxes
		script.Parent.skyboxes.City.Parent = lighting
		button.Text = "City"
	if button.Text == "City" then
		lighting.City.Parent = script.Parent.skyboxes
		button.Text = "Sky"
	end
end
	end
	end

button.MouseButton1Click:connect(onButtonClick)

After investigation, i quickly realised that the code would only work the 1st time i pressed the button and after i pressed it the second time it said that sunset isnt a member of lighting, i hadnt realised that even if the if statement hadnt applied roblox would still go through it, i i found a way around it that still doesnt work.

New code:

local button = script.Parent
local sky_val = script.Parent.Value
local lighting = game:GetService("Lighting")

local function onButtonClick()
	if button.Text == "Sunset" then
		for i = 1,#lighting:GetChildren() do
			if lighting[i].ClassName == "Sky" then
				lighting[i].Parent = script.Parent.skyboxes
				script.Parent.skyboxes.Mountain.Parent = lighting
			end
		end
	end
end

button.MouseButton1Click:connect(onButtonClick)

i tested the code before i did the rest for the other skyboxes but i got an error message saying that

1 isnt a valid member of lighting

and i dont understand why...

I would greately appreciate any help, sne_123456

2 answers

✓ Accepted answer

The problem here is you need to index lighting with the name of the skybox. You're indexing it like lighting[i] where i is 1, but the actual name of it is "Sunset" or "Mountain" I would change it to:

local function onButtonClick()
	for i,v in pairs(lighting:GetChildren()) do
		if v.Name == button.Text then
			script.Parent.skyboxes:ClearAllChildren()
			v:Clone().Parent = script.Parent.skyboxes
		end
	end
end

1 comment

0

i found another way: look below but thanks!

Thanks a lot for helping everyone, i have already found a solution to this. Instead if using methods of identifying the skybox through the name, i tried to identify though its class name and for anyone else facing the same issue heres the code:

btw, i used a number value to identify which skybox is on, but you can also use the buttons name!

local button = script.Parent
local sky_val = script.Parent.Value
local lighting = game:GetService("Lighting")

local function onButtonClick()
	if sky_val.Value == 1 then
		lighting:FindFirstChildWhichIsA("Sky").Parent = script.Parent.skyboxes
		script.Parent.skyboxes.Mountain.Parent = lighting
		sky_val.Value = 2
		button.Text = "Mountains"
		wait(1)
	elseif sky_val.Value == 2 then
		lighting:FindFirstChildWhichIsA("Sky").Parent = script.Parent.skyboxes
		script.Parent.skyboxes.City.Parent = lighting
		sky_val.Value = 3
		button.Text = "City"
		end
	end

button.MouseButton1Click:connect(onButtonClick)

This discussion is preserved as it was. New answers, comments, and votes are closed.