Menu
CoddyTech

유성우

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

두 번째 재난은 라운드 내내 0.5초마다 불타는 운석을 떨어뜨립니다. 대기하는 루프는 라운드의 카운트다운을 지연시키므로, task.spawn을 사용해 카운트다운과 동시에 실행합니다:

task.spawn(function()
	while map.Parent do
		-- 유성을 떨어뜨린다
		task.wait(0.5)
	end
end)

while map.Parent do는 자체적으로 멈춥니다. 라운드에서 맵을 제거하면 맵의 Parent가 nil이 되기 때문입니다. 각 운석은 섬 중심에서 math.random(-15, 15) 스터드 떨어진 임의의 위치에 착륙하며, Debris:AddItem(meteor, 4)는 4초 후 운석을 제거해 운석이 쌓이지 않도록 합니다.

재난이 두 가지이므로 라운드에서 하나를 선택해야 합니다. 테이블에 있는 함수는 문자열 이름으로 조회할 수 있으므로 Disasters["Meteors"]처럼 사용할 수 있고, 라운드에서 어떤 Settings.Disaster 이름이 지정되었든 해당 재난을 실행할 수 있습니다. 이 레슨의 설정에서는 운석을 지정합니다.

challenge icon

챌린지

중급

유성우를 추가하세요:

  1. 맨 위에서 Debris 서비스를 가져오세요.
  2. Disasters.Meteors(map)를 작성하세요. task.spawn 안에서 맵이 게임에 있는 동안, map.Base에서 X와 Z가 각각 15 스터드 이내로 무작위인 위치에, 위로 40 스터드 떨어진 곳에 Meteor라는 이름의 구형 파트(3 x 3 x 3, 주황색, Neon)를 맵 안에 만드세요. 파트에 닿으면 플레이어가 패배합니다. Debris가 4초 후 파트를 제거합니다. 다음 파트를 만들기 전에 0.5초 기다리세요.
  3. Disasters.Flood(map)를 Disasters[Settings.Disaster](map)로 바꾸세요.

Play를 눌러 피한 다음 Check를 누르세요.

직접 해보기

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

local lobbySpawn = workspace.LobbySpawn

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

-- 모든 플레이어의 리더보드에 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)

-- 로비의 상태 표시판
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

-- 이름별 재난 목록
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

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

	local map = ServerStorage.Maps.Island:Clone()
	map.Name = "Map"
	map.Parent = workspace

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

	Disasters.Flood(map)
	for seconds = Settings.RoundLength, 1, -1 do
		setStatus("Time left: " .. seconds)
		task.wait(1)
	end

	local names = {}
	for player in survivors do
		player.leaderstats.Wins.Value += 1
		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 게임: 재난 생존의 모든 레슨