Menu
CoddyTech

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)
end

Má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.

challenge icon

Thử thách

Trung bình

Khi 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.

  1. Kết nối items.Upgrader.Touched; chỉ xử lý một bộ phận có tên Ore và không có thuộc tính Upgraded.
  2. Đặt Upgraded thành true, nhân đôi thuộc tính Value và tô màu bộ phận bằng Color3.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