Menu
CoddyTech

보드

Coddy의 Roblox 게임: 끝없는 타워 코스 레슨. 18개 중 11번째.

장애물 코스는 라운드제로 진행됩니다. 로비에서 잠시 기다린 다음 새로운 타워가 나타나고 꼭대기까지 달리기를 시작합니다. 플레이어가 상황을 볼 수 있도록 로비에는 스폰 지점을 향해 있는 평평한 파트인 Board가 있습니다.

파트 위의 텍스트는 SurfaceGui에 TextLabel을 넣어 표시합니다. UDim2.fromScale(1, 1)은 라벨이 면 전체를 채우게 하고, TextScaled는 텍스트 크기를 맞게 조정합니다:

local gui = Instance.new("SurfaceGui")
gui.Parent = workspace.Lobby.Board

local label = Instance.new("TextLabel")
label.Size = UDim2.fromScale(1, 1)
label.TextScaled = true
label.Text = "Endless Tower"
label.Parent = gui

카운트다운은 -1 간격으로 거꾸로 세며, 매번 1초씩 기다리는 for 루프입니다:

for i = 5, 1, -1 do
	setBoard("Next tower in " .. i)
	task.wait(1)
end
challenge icon

챌린지

중급
  1. workspace.Lobby.Board에 SurfaceGui를 넣고, 이를 채우며 TextScaled가 켜져 있고 어두운 배경에 흰색 텍스트가 표시되는 Status라는 이름의 TextLabel을 추가하세요.
  2. 레이블의 Text를 설정하는 setBoard(text)를 작성하세요.
  3. 타워를 만들기 전에 Settings.Intermission부터 1까지 카운트다운을 표시하세요. Next tower in 3, Next tower in 2 ...을 보여 주고, 매번 1초씩 기다립니다. 그런 다음 이전과 같이 타워를 만들고 용암을 시작하세요.

플레이를 누르고 게시판을 확인하세요. 그런 다음 확인을 누르세요.

직접 해보기

local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local CollectionService = game:GetService("CollectionService")
local RunService = game:GetService("RunService")
local TweenService = game:GetService("TweenService")
local Settings = require(game.ReplicatedStorage.Settings)

local stages = ServerStorage.Stages
local tower = nil
local lava = nil

print("Each tower has " .. Settings.StageCount .. " stages")

-- 모든 플레이어는 리더보드에 Wins를 받습니다
Players.PlayerAdded:Connect(function(player)
	local leaderstats = Instance.new("Folder")
	leaderstats.Name = "leaderstats"
	leaderstats.Parent = player

	local wins = Instance.new("IntValue")
	wins.Name = "Wins"
	wins.Parent = leaderstats
end)

-- Kill 태그가 붙은 것에 닿으면 생명을 잃습니다
local function killOnTouch(hit)
	local humanoid = hit.Parent:FindFirstChild("Humanoid")
	if humanoid then
		humanoid.Health = 0
	end
end

-- 사라지는 발판은 누군가 밟으면 잠시 후 희미해졌다가 다시 나타납니다
local function makeVanish(part)
	part.Touched:Connect(function(hit)
		if part:GetAttribute("Gone") or not hit.Parent:FindFirstChild("Humanoid") then
			return
		end
		part:SetAttribute("Gone", true)
		task.wait(Settings.VanishDelay)
		part.Transparency = 0.8
		part.CanCollide = false
		task.wait(Settings.VanishTime)
		part.Transparency = 0
		part.CanCollide = true
		part:SetAttribute("Gone", nil)
	end)
end

-- 레이저는 Slide 오프셋까지 미끄러졌다가 돌아오기를 계속 반복합니다
local function makeSlide(part)
	local info = TweenInfo.new(Settings.SlideTime, Enum.EasingStyle.Linear, Enum.EasingDirection.InOut, -1, true)
	local goal = { Position = part.Position + part:GetAttribute("Slide") }
	TweenService:Create(part, info, goal):Play()
end

-- 점프 패드는 밟은 사람을 공중으로 튕겨 올립니다
local function bounce(hit)
	local root = hit.Parent:FindFirstChild("HumanoidRootPart")
	if root then
		root.AssemblyLinearVelocity = Vector3.new(0, Settings.BouncePower, 0)
	end
end

-- 회전 장애물은 매 프레임 조금씩 회전합니다
RunService.Heartbeat:Connect(function(dt)
	for _, spinner in CollectionService:GetTagged("Spinner") do
		if spinner:IsDescendantOf(workspace) then
			spinner:PivotTo(spinner:GetPivot() * CFrame.Angles(0, math.rad(Settings.SpinSpeed) * dt, 0))
		end
	end
end)

-- 태그에 따라 스테이지의 모든 장애물을 활성화합니다
local function setupStage(stage)
	for _, part in stage:GetDescendants() do
		if part:HasTag("Kill") then
			part.Touched:Connect(killOnTouch)
		end
		if part:HasTag("Vanish") then
			makeVanish(part)
		end
		if part:HasTag("Conveyor") then
			part.AssemblyLinearVelocity = part.CFrame.LookVector * Settings.BeltSpeed
		end
		if part:HasTag("Slider") then
			makeSlide(part)
		end
		if part:HasTag("Bounce") then
			part.Touched:Connect(bounce)
		end
	end
end

-- 스테이지 하나를 무작위로 선택합니다
local function pickStage()
	local all = stages:GetChildren()
	return all[math.random(1, #all)]
end

-- 모델의 복사본을 탑 위에 놓고, 복사본과 새로운 꼭대기 높이를 반환합니다
local function stack(template, bottom)
	local copy = template:Clone()
	local box, size = copy:GetBoundingBox()
	local lift = bottom - (box.Position.Y - size.Y / 2)
	copy:PivotTo(copy:GetPivot() + Vector3.new(0, lift, 0))
	copy.Parent = tower
	return copy, bottom + size.Y
end

-- 새로운 무작위 탑을 아래부터 쌓아 올립니다
local function buildTower()
	tower = Instance.new("Model")
	tower.Name = "Tower"
	tower.Parent = workspace
	local top = 0
	for i = 1, Settings.StageCount do
		local stage, newTop = stack(pickStage(), top)
		top = newTop
		setupStage(stage)
	end
	stack(ServerStorage.Finish, top)
	return top
end

-- 용암은 지면에서 탑 꼭대기 바로 아래까지 상승합니다
local function startLava(top)
	lava = Instance.new("Part")
	lava.Name = "Lava"
	lava.Anchored = true
	lava.CanCollide = false
	lava.Size = Vector3.new(30, 2, 30)
	lava.Position = Vector3.new(0, -2, 0)
	lava.Color = Color3.fromRGB(255, 90, 20)
	lava.Material = Enum.Material.Neon
	lava.Parent = workspace
	lava.Touched:Connect(killOnTouch)
	local info = TweenInfo.new(top / Settings.LavaSpeed, Enum.EasingStyle.Linear, Enum.EasingDirection.InOut, 0, false, Settings.LavaDelay)
	TweenService:Create(lava, info, { Position = Vector3.new(0, top - 2, 0) }):Play()
end

local top = buildTower()
startLava(top)
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

Roblox 게임: 끝없는 타워의 모든 레슨