Người nâng cấp
Bài học 11 trên 22 trong khóa học Game Roblox: nhà máy tycoon của Coddy.
Cánh cổng màu tím phía trên băng chuyền là máy nâng cấp. Nó không chặn quặng (nó không có thuộc tính CanCollide), nhưng mỗi quặng đi qua đều có giá trị gấp đôi.
Sự kiện Touched có thể kích hoạt nhiều lần với cùng một quặng, chẳng hạn khi quặng dừng lại rồi chuyển động trở lại. Nếu nhân đôi hai lần thì sẽ tạo ra một bug mà người chơi thích nhưng chủ sở hữu lại ghét. Vì vậy, máy nâng cấp đánh dấu mỗi quặng đã được nhân đôi bằng một thuộc tính rồi bỏ qua những quặng đã được đánh dấu:
if hit.Name == "Ore" and not hit:GetAttribute("Upgraded") then
hit:SetAttribute("Upgraded", true)
hit:SetAttribute("Value", hit:GetAttribute("Value") * 2)
endMáy nâng cấp nằm trong ServerStorage cho đến khi được mua, nhưng bạn có thể kết nối sự kiện Touched ngay từ đầu: kết nối vẫn gắn với bộ phận dù bộ phận ở đâu, và Touched chỉ kích hoạt khi bộ phận ở trong thế giới.
Thử thách
Trung bìnhKhi quặng đi qua bộ nâng cấp màu tím, hãy nhân đôi giá trị của từng quặng.
- Kết nối
items.Upgrader.Touched; chỉ xử lý một bộ phận có tênOrevà không có thuộc tínhUpgraded. - Đặt
Upgradedthành true, nhân đôi thuộc tínhValuevà tô màu bộ phận bằngColor3.fromRGB(155, 89, 182).
Nhấn Chơi rồi mua bộ nâng cấp: quặng chuyển sang màu tím khi đi qua và trả 20. Sau đó nhấn Kiểm tra.
Tự làm thử
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local CollectionService = game:GetService("CollectionService")
local Debris = game:GetService("Debris")
local Settings = require(game.ReplicatedStorage.Settings)
local tycoon = workspace.Tycoon
local items = ServerStorage.TycoonItems
local owner = nil
print("Ore is worth " .. Settings.OreValue .. " Cash")
-- Mỗi người chơi có Cash trên bảng xếp hạng
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
end)
-- Biển hiệu phía trên nhà máy
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: một khối nhỏ có giá trị Cash, rơi xuống từ máy thả quặng
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
-- Băng chuyền vận chuyển mọi thứ nằm trên đó
tycoon.Conveyor.AssemblyLinearVelocity = Vector3.new(Settings.BeltSpeed, 0, 0)
-- Máy thu gom biến Ore thành Cash
tycoon.Collector.Touched:Connect(function(hit)
if hit.Name == "Ore" then
local value = hit:GetAttribute("Value")
hit:Destroy()
if owner then
owner.leaderstats.Cash.Value += value
end
end
end)
-- Bài học 11: Đặt Upgrader ở đây
-- Đặt vật phẩm đã mua vào nhà máy
local function build(item)
item.Parent = tycoon.Built
if item:HasTag("Dropper") then
startDropper(item)
end
end
-- Khi mua, bệ biến mất và vật phẩm tương ứng xuất hiện trong nhà máy
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 = ServerStorage
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
-- Thẻ giá hiện phía trên mỗi bệ
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
-- Nhận nhà máy: người chơi đầu tiên bước lên bệ sẽ sở hữu nhà máy
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
setSign(player.Name .. "'s Factory")
for _, dropper in CollectionService:GetTagged("Dropper") do
if dropper:IsDescendantOf(workspace) then
startDropper(dropper)
end
end
end
end)
Tất cả bài học trong Game Roblox: nhà máy tycoon
Tự luyện tập: Playground Roblox