참여할 때 불러오기
Coddy의 Roblox 게임: 팩토리 타이쿤 코스 레슨. 22개 중 19번째.
저장한 데이터는 다시 읽어 와야만 가치가 있습니다. 플레이어가 참가하면, GetAsync에 해당 플레이어의 UserId를 전달해 이전에 저장한 테이블을 가져오며, 처음 플레이하는 경우에는 nil을 반환합니다:
local ok, saved = pcall(function()
return scoreStore:GetAsync(player.UserId)
end)
if ok and saved then
best.Value = saved.Best or 0
endpcall은 호출이 성공했는지 여부와 함수가 반환한 값을 차례로 반환합니다. 둘 다 확인하세요. 불러오기에 실패한 경우와 신규 플레이어인 경우 모두 통계값은 0으로 유지됩니다.
챌린지
어려움돌아온 플레이어에게 Cash와 Rebirths를 다시 지급하세요.
PlayerAdded에서 leaderstats 다음에pcall안에서factoryStore:GetAsync(player.UserId)를 호출하세요.- 호출이 성공하고 테이블을 찾았다면, Cash를
saved.Cash or 0으로, Rebirths를saved.Rebirths or 0으로 설정하세요.
‘플레이’를 눌러 Cash를 조금 얻고, 중지한 다음 다시 ‘플레이’를 누르세요. 가지고 있던 Cash로 시작합니다. 그런 다음 ‘확인’을 누르세요.
직접 해보기
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
-- Lesson 19: 접속 시 데이터 불러오기 코드를 여기에 넣습니다
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)
task.spawn(function()
while dropper:IsDescendantOf(workspace) do
dropOre(dropper)
task.wait(Settings.DropInterval)
end
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
-- 플레이어가 나갈 때 Cash와 Rebirths가 저장됩니다
Players.PlayerRemoving:Connect(function(player)
saveFactory(player)
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)
Roblox 게임: 팩토리 타이쿤의 모든 레슨
직접 연습해 보세요: Roblox 플레이그라운드