공장을 지키세요
Coddy의 Roblox 게임: 공장 타이쿤 코스 레슨. 18개 중 18번째.
마지막 부분입니다. 공장 전체를 지은 뒤 빈 부지로 돌아오면 속상하겠죠. 소유자의 저장 데이터에는 무엇을 지었는지도 이름별로, 지은 순서대로 기록됩니다.
data.Built = {}
for _, item in tycoon.Built:GetChildren() do
table.insert(data.Built, item.Name)
end공장을 다시 차지하면 저장된 아이템이 모두 한 번에 재건되고(올라가는 애니메이션은 없습니다. 이미 본 적이 있으니까요), 해당 패드는 BoughtPads에 추가됩니다. 저장된 순서대로 재건하면 그 과정에서 올바른 패드가 잠금 해제됩니다. build가 이미 그렇게 처리하기 때문입니다.
이제 Factory Tycoon이 완성되었습니다. 나만의 공장으로 꾸며 보세요. 아이템(ServerStorage.TycoonItems에 있는 모델과 Item, Label, Price, After가 설정된 패드)을 추가하고, 패드와 설정의 가격을 조정한 다음, 프로젝트로 저장을 사용해 공장을 공유하세요.
챌린지
어려움건물을 저장하세요:
saveFactory에서 소유자에 대해Built를 추가하세요.tycoon.Built에 있는 모든 항목의 이름을 순서대로 저장합니다.build에 두 번째 매개변수instant를 추가하세요. true이면 올라오는 애니메이션을 건너뛰고 드로퍼를 즉시 시작합니다.findPad(itemName)를 작성하세요.tycoon.Buttons또는waiting에서 Item이 해당 이름인 패드를 찾습니다.- 플레이어가 공장을 차지하면 저장된 데이터를 불러오세요.
Built의 각 이름에 대해 해당 아이템의 패드를bought로 옮기고 아이템을 즉시 빌드합니다.
Play를 눌러 빌드하고, Stop을 누른 다음 다시 Play를 눌러 공장을 다시 차지하세요. 공장이 복구됩니다. 그런 다음 Check를 누르세요.
직접 해보기
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local CollectionService = game:GetService("CollectionService")
local TweenService = game:GetService("TweenService")
local Debris = game:GetService("Debris")
local DataStoreService = game:GetService("DataStoreService")
local Settings = require(game.ReplicatedStorage.Settings)
local tycoon = workspace.Tycoon
local items = ServerStorage.TycoonItems
local rebirthPad = ServerStorage.RebirthPad
local factoryStore = DataStoreService:GetDataStore("Factory")
local owner = nil
local headline = "Step on the green pad to claim this factory"
local earned = 0
print("Ore is worth " .. Settings.OreValue .. " Cash")
-- 모든 플레이어는 리더보드에 Cash와 Rebirths를 받습니다
Players.PlayerAdded:Connect(function(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local cash = Instance.new("IntValue")
cash.Name = "Cash"
cash.Parent = leaderstats
local rebirths = Instance.new("IntValue")
rebirths.Name = "Rebirths"
rebirths.Parent = leaderstats
-- 이 플레이어가 지난번에 가지고 있던 것
local ok, saved = pcall(function()
return factoryStore:GetAsync(player.UserId)
end)
if ok and saved then
cash.Value = saved.Cash or 0
rebirths.Value = saved.Rebirths or 0
end
end)
-- 공장 위의 표지판
local gui = Instance.new("SurfaceGui")
gui.Parent = tycoon.Sign
local signLabel = Instance.new("TextLabel")
signLabel.Name = "Status"
signLabel.Size = UDim2.fromScale(1, 1)
signLabel.BackgroundColor3 = Color3.fromRGB(25, 25, 35)
signLabel.TextColor3 = Color3.fromRGB(255, 255, 255)
signLabel.TextScaled = true
signLabel.Text = "Step on the green pad to claim this factory"
signLabel.Parent = gui
local function setSign(text)
signLabel.Text = text
end
-- Ore: 드로퍼 아래에 떨어지는, Cash 가치가 있는 작은 파트
local function dropOre(dropper)
local ore = Instance.new("Part")
ore.Name = "Ore"
ore.Size = Vector3.new(1, 1, 1)
ore.Color = Color3.fromRGB(150, 150, 160)
ore.Position = dropper.Position - Vector3.new(0, 2.5, 0)
ore:SetAttribute("Value", Settings.OreValue)
if math.random() < Settings.GoldChance then
ore.Color = Color3.fromRGB(255, 200, 40)
ore.Material = Enum.Material.Neon
ore:SetAttribute("Value", Settings.OreValue * 5)
end
ore.Parent = workspace
Debris:AddItem(ore, 20)
end
-- 드로퍼는 몇 번 시작되든 루프 하나만 실행합니다
local function startDropper(dropper)
if dropper:GetAttribute("Running") then
return
end
dropper:SetAttribute("Running", true)
task.spawn(function()
while dropper:IsDescendantOf(workspace) do
dropOre(dropper)
task.wait(Settings.DropInterval)
end
dropper:SetAttribute("Running", nil)
end)
end
-- 컨베이어는 그 위에 놓인 것은 무엇이든 운반합니다
tycoon.Conveyor.AssemblyLinearVelocity = Vector3.new(Settings.BeltSpeed, 0, 0)
-- 수집기는 광석을 Cash로 바꿉니다
tycoon.Collector.Touched:Connect(function(hit)
if hit.Name == "Ore" then
local value = hit:GetAttribute("Value")
hit:Destroy()
if owner then
value = math.floor(value * (1 + owner.leaderstats.Rebirths.Value * Settings.RebirthBonus))
owner.leaderstats.Cash.Value += value
earned += value
end
end
end)
-- 업그레이더는 통과하는 각 광석의 가치를 한 번씩 두 배로 만듭니다
items.Upgrader.Touched:Connect(function(hit)
if hit.Name == "Ore" and not hit:GetAttribute("Upgraded") then
hit:SetAttribute("Upgraded", true)
hit:SetAttribute("Value", hit:GetAttribute("Value") * 2)
hit.Color = Color3.fromRGB(155, 89, 182)
end
end)
-- 먼저 아이템이 건설되기를 기다리는 패드
local waiting = Instance.new("Folder")
waiting.Name = "WaitingPads"
waiting.Parent = ServerStorage
-- 이미 구매했으며 다음 환생을 위해 보관하는 패드
local bought = Instance.new("Folder")
bought.Name = "BoughtPads"
bought.Parent = ServerStorage
-- 새 파트가 제자리로 솟아오릅니다
local function riseIn(part)
local goal = part.Position
local transparency = part.Transparency
part.Position = goal - Vector3.new(0, 8, 0)
part.Transparency = 1
TweenService:Create(part, TweenInfo.new(1), { Position = goal, Transparency = transparency }):Play()
end
local function checkComplete()
if #tycoon.Buttons:GetChildren() == 0 and #waiting:GetChildren() == 0 then
headline = "Factory complete! Step on the purple pad to rebirth"
setSign(headline)
rebirthPad.Parent = tycoon
end
end
-- 구매한 아이템을 공장에 배치합니다
local function build(item)
item.Parent = tycoon.Built
if item:IsA("BasePart") then
riseIn(item)
end
for _, part in item:GetDescendants() do
if part:IsA("BasePart") then
riseIn(part)
end
end
if item:HasTag("Dropper") then
-- 제자리에 놓이면 떨어뜨리기 시작
task.delay(1, startDropper, item)
end
for _, pad in waiting:GetChildren() do
if pad:GetAttribute("After") == item.Name then
pad.Parent = tycoon.Buttons
end
end
checkComplete()
end
-- 구매: 패드가 사라지고 해당 아이템이 설치됨
local function buy(pad, player)
if player ~= owner or pad.Parent ~= tycoon.Buttons then
return
end
local cash = player.leaderstats.Cash
local price = pad:GetAttribute("Price")
if cash.Value < price then
return
end
cash.Value -= price
pad.Parent = bought
build(items:FindFirstChild(pad:GetAttribute("Item")))
end
for _, pad in tycoon.Buttons:GetChildren() do
pad.Touched:Connect(function(hit)
local player = Players:GetPlayerFromCharacter(hit.Parent)
if player then
buy(pad, player)
end
end)
end
-- 모든 패드 위에 가격표가 떠 있음
for _, pad in tycoon.Buttons:GetChildren() do
local tag = Instance.new("BillboardGui")
tag.Name = "PriceTag"
tag.Size = UDim2.fromOffset(160, 40)
tag.StudsOffset = Vector3.new(0, 3, 0)
tag.Parent = pad
local label = Instance.new("TextLabel")
label.Size = UDim2.fromScale(1, 1)
label.BackgroundColor3 = Color3.fromRGB(25, 25, 35)
label.BackgroundTransparency = 0.2
label.TextColor3 = Color3.fromRGB(255, 255, 255)
label.TextScaled = true
label.Text = pad:GetAttribute("Label") .. ": $" .. pad:GetAttribute("Price")
label.Parent = tag
end
-- 처음에는 첫 번째 패드들만 표시됨
for _, pad in tycoon.Buttons:GetChildren() do
if pad:GetAttribute("After") then
pad.Parent = waiting
end
end
-- 빈 공장으로 되돌리기: 아이템은 보관소로, 패드는 원래 위치로
local function resetFactory()
rebirthPad.Parent = ServerStorage
for _, item in tycoon.Built:GetChildren() do
item.Parent = items
end
for _, pad in bought:GetChildren() do
if pad:GetAttribute("After") then
pad.Parent = waiting
else
pad.Parent = tycoon.Buttons
end
end
end
rebirthPad.Touched:Connect(function(hit)
local player = Players:GetPlayerFromCharacter(hit.Parent)
if player and player == owner and rebirthPad.Parent == tycoon then
resetFactory()
player.leaderstats.Rebirths.Value += 1
player.leaderstats.Cash.Value = 0
headline = player.Name .. "'s Factory"
setSign(headline)
end
end)
-- 저장: Cash와 Rebirths
local function saveFactory(player)
local data = {
Cash = player.leaderstats.Cash.Value,
Rebirths = player.leaderstats.Rebirths.Value,
}
pcall(function()
factoryStore:SetAsync(player.UserId, data)
end)
end
-- 소유자가 떠나면 공장이 저장되고 다른 플레이어가 다시 차지할 수 있게 됨
Players.PlayerRemoving:Connect(function(player)
saveFactory(player)
if player == owner then
owner = nil
resetFactory()
tycoon.ClaimPad.Color = Color3.fromRGB(46, 204, 113)
tycoon.ClaimPad.Material = Enum.Material.Neon
headline = "Step on the green pad to claim this factory"
setSign(headline)
end
end)
game:BindToClose(function()
for _, player in Players:GetPlayers() do
saveFactory(player)
end
end)
-- 표지판에 소유자의 수입이 5초마다 표시됨
task.spawn(function()
while true do
task.wait(5)
if owner then
setSign(headline .. "\n$" .. math.floor(earned / 5) .. " a second")
end
earned = 0
end
end)
-- 차지하기: 패드를 처음 밟은 플레이어가 공장의 소유자가 됨
local claimPad = tycoon.ClaimPad
claimPad.Touched:Connect(function(hit)
local player = Players:GetPlayerFromCharacter(hit.Parent)
if player and not owner then
owner = player
claimPad.Color = Color3.fromRGB(120, 120, 120)
claimPad.Material = Enum.Material.SmoothPlastic
headline = player.Name .. "'s Factory"
setSign(headline)
for _, dropper in CollectionService:GetTagged("Dropper") do
if dropper:IsDescendantOf(workspace) then
startDropper(dropper)
end
end
end
end)
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.