Menu
CoddyTech

바닥은 용암

Coddy의 Roblox 게임: 재난 생존 코스 레슨. 18개 중 18번째.

마지막 재난은 네가 완성할 차례야. 바닥이 용암으로 변해. 먼저 주의할 점이 있어. 3초 동안 원래 색에서 빨간색으로 빛난 다음, 치명적으로 변해. 맵의 Base만 변해. 바위와 지붕은 안전하게 남아 있으니, 플레이어에게는 올라갈 3초의 시간이 있어.

TweenService:Create(base, TweenInfo.new(3), { Color = Color3.fromRGB(255, 60, 20) }):Play()
task.wait(3)
base.Material = Enum.Material.Neon
base.Touched:Connect(defeat)

두 가지 세부 사항이 중요해. 섬 위에 이미 서 있는 플레이어는 훨씬 전에 섬에 닿았고, Touched는 접촉이 시작될 때만 실행되므로 base:GetTouchingParts()로 지금 섬 위에 있는 플레이어를 찾아낼 수 있어. 그리고 이 재난은 기다리는 동작을 포함하므로, 예전 방식으로 호출하면 라운드 카운트다운이 3초 동안 멈춰. 모든 재난을 task.spawn(Disasters[disaster], map)으로 시작해서 카운트다운과 함께 실행되게 해.

이것으로 Disaster Survival이 완성됐어. 이제 네 게임을 만들어 봐. 재난을 구상하고(회전하는 파트로 된 토네이도, 떨어지는 얼음, 움직이는 벽 등), Base와 Spawn 설계를 따르는 맵을 추가하고, 설정을 조정한 다음 프로젝트로 저장을 사용해 친구들이 플레이할 수 있는 링크를 공유해.

challenge icon

챌린지

어려움

용암을 추가한 다음, 게임을 원하는 대로 꾸며 보세요:

  1. Disasters.Lava(map)를 작성하세요. map.Base의 Color를 Color3.fromRGB(255, 60, 20)으로 3초 동안 트윈하고, 3초 기다린 뒤 Neon으로 만들고, Touched를 defeat에 연결한 다음, 지금 닿아 있는 모든 파트를 defeat하세요.
  2. task.spawn(Disasters[disaster], map)으로 라운드의 재난을 시작하세요.

이 레슨의 설정은 용암 재난을 실행합니다. Play를 누른 다음 Check를 누르세요. 그런 다음 자신만의 재난을 추가하고, 시험해 볼 수 있도록 Settings.Disaster를 해당 재난의 이름으로 설정하세요.

직접 해보기

local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local TweenService = game:GetService("TweenService")
local Debris = game:GetService("Debris")
local DataStoreService = game:GetService("DataStoreService")
local Settings = require(game.ReplicatedStorage.Settings)

local lobbySpawn = workspace.LobbySpawn
local winsStore = DataStoreService:GetDataStore("Wins")

print("Rounds last " .. Settings.RoundLength .. " seconds")

-- 모든 플레이어의 순위표에 Wins와 Streak가 표시됩니다
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

	local streak = Instance.new("IntValue")
	streak.Name = "Streak"
	streak.Parent = leaderstats

	-- 이 플레이어가 마지막으로 저장한 Wins
	local ok, saved = pcall(function()
		return winsStore:GetAsync(player.UserId)
	end)
	if ok and saved then
		wins.Value = saved
	end
end)

local function saveWins(player)
	pcall(function()
		winsStore:SetAsync(player.UserId, player.leaderstats.Wins.Value)
	end)
end

Players.PlayerRemoving:Connect(saveWins)

game:BindToClose(function()
	for _, player in Players:GetPlayers() do
		saveWins(player)
	end
end)

-- 로비의 상태 게시판
local gui = Instance.new("SurfaceGui")
gui.Parent = workspace.StatusBoard

local status = Instance.new("TextLabel")
status.Name = "Status"
status.Size = UDim2.fromScale(1, 1)
status.BackgroundColor3 = Color3.fromRGB(25, 25, 35)
status.TextColor3 = Color3.fromRGB(255, 255, 255)
status.TextScaled = true
status.Text = "Welcome to Disaster Survival!"
status.Parent = gui

local function setStatus(text)
	status.Text = text
end

local function teleport(player, target)
	local character = player.Character
	if character then
		character:PivotTo(target.CFrame + Vector3.new(0, 4, 0))
	end
end

local function defeat(hit)
	local humanoid = hit.Parent:FindFirstChild("Humanoid")
	if humanoid then
		humanoid.Health = 0
	end
end

-- 플레이어의 머리 위에 떠 있는 "Survivor" 태그
local function tagSurvivor(character)
	local tag = Instance.new("BillboardGui")
	tag.Name = "SurvivorTag"
	tag.Size = UDim2.fromOffset(120, 30)
	tag.StudsOffset = Vector3.new(0, 2.5, 0)
	tag.Parent = character.Head

	local label = Instance.new("TextLabel")
	label.Size = UDim2.fromScale(1, 1)
	label.BackgroundTransparency = 1
	label.Text = "Survivor"
	label.TextColor3 = Color3.fromRGB(80, 255, 120)
	label.TextScaled = true
	label.Parent = tag
end

-- 이름별 재난 목록
local Disasters = {}

function Disasters.Flood(map)
	local base = map.Base
	local water = Instance.new("Part")
	water.Name = "Water"
	water.Anchored = true
	water.CanCollide = false
	water.Transparency = 0.3
	water.Color = Color3.fromRGB(40, 120, 255)
	water.Size = Vector3.new(base.Size.X + 10, 1, base.Size.Z + 10)
	water.Position = base.Position - Vector3.new(0, 2, 0)
	water.Parent = map
	water.Touched:Connect(defeat)

	local rise = TweenInfo.new(Settings.RoundLength * 0.8, Enum.EasingStyle.Linear)
	TweenService:Create(water, rise, { Position = water.Position + Vector3.new(0, 8, 0) }):Play()
end

function Disasters.Meteors(map)
	local base = map.Base
	task.spawn(function()
		while map.Parent do
			local meteor = Instance.new("Part")
			meteor.Name = "Meteor"
			meteor.Shape = Enum.PartType.Ball
			meteor.Size = Vector3.new(3, 3, 3)
			meteor.Color = Color3.fromRGB(255, 120, 30)
			meteor.Material = Enum.Material.Neon
			local x = base.Position.X + math.random(-15, 15)
			local z = base.Position.Z + math.random(-15, 15)
			meteor.Position = Vector3.new(x, 40, z)
			meteor.Parent = map
			meteor.Touched:Connect(defeat)
			Debris:AddItem(meteor, 4)
			task.wait(0.5)
		end
	end)
end

function Disasters.Shrink(map)
	local base = map.Base
	local shrink = TweenInfo.new(Settings.RoundLength * 0.7, Enum.EasingStyle.Linear)
	TweenService:Create(base, shrink, { Size = Vector3.new(6, base.Size.Y, 6) }):Play()
end

local function pickDisaster()
	if Settings.Disaster then
		return Settings.Disaster
	end
	local names = {}
	for name in Disasters do
		table.insert(names, name)
	end
	table.sort(names)
	return names[math.random(1, #names)]
end

local function pickMap()
	local maps = ServerStorage.Maps
	if Settings.Map then
		return maps:FindFirstChild(Settings.Map)
	end
	local all = maps:GetChildren()
	return all[math.random(1, #all)]
end

-- 라운드 반복문
while true do
	for seconds = Settings.Intermission, 1, -1 do
		setStatus("Intermission: " .. seconds)
		task.wait(1)
	end

	local template = pickMap()
	local map = template:Clone()
	map.Name = "Map"
	map.Parent = workspace
	setStatus("Map: " .. template.Name)

	local survivors = {}
	for _, player in Players:GetPlayers() do
		local character = player.Character
		if character and character.Humanoid.Health > 0 then
			teleport(player, map.Spawn)
			tagSurvivor(character)
			survivors[player] = true
			character.Humanoid.Died:Connect(function()
				survivors[player] = nil
				player.leaderstats.Streak.Value = 0
			end)
		end
	end
	task.wait(2)

	local disaster = pickDisaster()
	Disasters[disaster](map)
	for seconds = Settings.RoundLength, 1, -1 do
		setStatus(disaster .. "! Time left: " .. seconds)
		task.wait(1)
	end

	local names = {}
	for player in survivors do
		player.leaderstats.Wins.Value += 1
		player.leaderstats.Streak.Value += 1
		local tag = player.Character and player.Character.Head:FindFirstChild("SurvivorTag")
		if tag then
			tag:Destroy()
		end
		teleport(player, lobbySpawn)
		table.insert(names, player.Name)
	end
	map:Destroy()
	if #names > 0 then
		setStatus("Winners: " .. table.concat(names, ", "))
	else
		setStatus("Nobody survived!")
	end
	task.wait(3)
end
quiz icon실력 점검

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

Roblox 게임: 재난 생존의 모든 레슨