Menu
CoddyTech

Hoạt ảnh xây dựng

Bài học 12 trên 22 trong khóa học Game Roblox: nhà máy tycoon của Coddy.

Vật phẩm đã mua sẽ bật vào vị trí. Một trò chơi tycoon sẽ hấp dẫn hơn khi vật phẩm rise lên khỏi mặt đất và dần hiện ra. Tween sẽ làm việc đó: ghi nhớ vị trí của bộ phận và độ trong suốt cần có, di chuyển bộ phận xuống 8 studs rồi làm nó vô hình, sau đó tween bộ phận trở lại:

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

Vật phẩm có thể là một bộ phận (dropper) hoặc một Model gồm nhiều bộ phận (các bức tường), vì vậy build nâng chính vật phẩm lên nếu đó là một bộ phận, còn nếu không thì nâng từng bộ phận bên trong nó.

Dropper bắt đầu hoạt động khi vẫn còn dưới lòng đất sẽ thả quặng đầu tiên xuống khoảng không, vì vậy dropper đã mua chỉ bắt đầu sau khi hạ cánh: task.delay(1, startDropper, item) chạy nó sau một giây.

challenge icon

Thử thách

Trung bình

Khiến các vật phẩm đã mua trồi lên khỏi mặt đất.

  1. Lấy TweenService và viết riseIn(part) như trong bài học.
  2. Trong build, sau khi chuyển vật phẩm vào nhà máy, hãy gọi riseIn cho vật phẩm nếu đó là BasePart, và cho mọi BasePart trong số các phần tử con của nó.
  3. Bắt đầu máy thả vật phẩm đã mua bằng task.delay(1, startDropper, item).

Nhấn "Chơi" và mua các bức tường: chúng sẽ trồi lên và hiện dần. 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 dưới máy thả
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)

-- Bộ thu gom chuyể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ộ nâng cấp nhân đôi giá trị của mỗi Ore đi qua, chỉ một lần
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)

-- Bài học 12: thêm hiệu ứng xây dựng vào đâ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

-- Mua hàng: bệ biến mất và vật phẩm tương ứng được xây dựng
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

-- Nhãn 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