바닥은 용암
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 설계를 따르는 맵을 추가하고, 설정을 조정한 다음 프로젝트로 저장을 사용해 친구들이 플레이할 수 있는 링크를 공유해.
챌린지
어려움용암을 추가한 다음, 게임을 원하는 대로 꾸며 보세요:
Disasters.Lava(map)를 작성하세요.map.Base의 Color를Color3.fromRGB(255, 60, 20)으로 3초 동안 트윈하고, 3초 기다린 뒤 Neon으로 만들고, Touched를 defeat에 연결한 다음, 지금 닿아 있는 모든 파트를 defeat하세요.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
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.