Tạo cơ chế thu thập đồng xu

*Nội dung này được dịch bằng AI (Beta) và có thể có lỗi. Để xem trang này bằng tiếng Anh, hãy nhấp vào đây.


Bây giờ bạn đã có một thế giới 3D, đã đến lúc thêm script đầu tiên của bạn. Trong phần này, bạn sẽ tạo một cơ chế thu thập đồng xu cho phép người chơi thu thập đồng xu và tạm thời vô hiệu hóa đồng xu sau khi chúng đã được thu thập.

Tạo các đồng xu

Trước khi bạn có thể lập trình bất cứ điều gì, bạn cần có các đối tượng giữ chỗ trong thế giới để sử dụng làm đồng xu của bạn. Giống như các nền tảng đá biển mà bạn đã tạo trong phần trước, các đồng xu có thể là các đối tượng Part đơn giản.

Tạo các đồng xu
Trong Workspace > World, tạo một thư mục mới có tên là Coins.
Bên trong thư mục Coins, tạo một phần hình trụ có tên là Coin với BrickColor được đặt thành Gold, Material được đặt thành Metal, Size 0.6, 8, 4, và Orientation 90, 0, 0.
Vô hiệu hóa CanCollide và bật Anchored.
Sau đó, sao chép phần Coin nhiều lần và rải các bản sao xung quanh hòn đảo và trên các nền tảng để chúng có thể tiếp cận từ các cấp độ đá biển.
Giữ mỗi bản sao có tên là Coin.

Tạo script

Tiếp theo, bạn sẽ làm cho các đồng xu phản ứng với người chơi. Engine Roblox có thể phát hiện khi một thứ gì đó chạm vào một đồng xu, nhưng bạn cần sử dụng một script để xác định cách mà đồng xu nên phản ứng.

Tạo CoinService
Trong ServerScriptService, tạo một Script có tên là CoinService với mã sau:
```lua
-- Khởi tạo dịch vụ và biến
local Workspace = game:GetService("Workspace")
local Players = game:GetService("Players")
local coinsFolder = Workspace.World.Coins
local coins = coinsFolder:GetChildren()
local COOLDOWN = 10
-- Định nghĩa trình xử lý sự kiện
local function onCoinTouched(otherPart, coin)
if coin:GetAttribute("Enabled") then
local character = otherPart.Parent
local player = Players:GetPlayerFromCharacter(character)
if player then
-- Người chơi đã chạm vào một đồng xu
coin.Transparency = 1
coin:SetAttribute("Enabled", false)
print("Người chơi đã thu thập đồng xu")
task.wait(COOLDOWN)
coin.Transparency = 0
coin:SetAttribute("Enabled", true)
end
end
end
-- Thiết lập các trình lắng nghe sự kiện
for _, coin in coins do
coin:SetAttribute("Enabled", true)
coin.Touched:Connect(function(otherPart)
onCoinTouched(otherPart, coin)
end)
end
```

Bây giờ, bất cứ khi nào một người chơi chạm vào một đồng xu, đồng xu sẽ biến mất trong 10 giây, và nhật ký đầu ra sẽ in ra Người chơi đã thu thập đồng xu.

Các phần sau mô tả cách mà script hoạt động chi tiết hơn.

Khởi tạo dịch vụ và biến

Giống như với nhiều mã mà bạn có thể đã viết trong các ngôn ngữ khác, bạn định nghĩa các biến mà bạn cần sau này ở đầu script. Mã của chúng tôi thực hiện các bước sau:

  • Lấy các phiên bản dịch vụ - Các dịch vụ Roblox cung cấp chức năng tích hợp cho các tính năng phổ biến. Script đầu tiên lấy các phiên bản của dịch vụ Workspace, chứa mọi đối tượng trong thế giới 3D, và dịch vụ Player, quản lý và chứa tất cả người chơi kết nối với trò chơi của bạn.
  • Lấy tham chiếu đến tất cả các đồng xu - Script sau đó truy vấn không gian 3D để lấy tất cả các tham chiếu đến các đối tượng đồng xu bằng phương thức GetChildren(). Phương thức này trả về một mảng chứa mọi thứ được làm cha cho đối tượng mà nó liên kết, trong trường hợp này là thư mục Workspace.World.Coins mà bạn đã tạo trước đó.
  • Định nghĩa một biến toàn cục - Biến COOLDOWN được sử dụng sau này để xác định thời gian vô hiệu hóa một đồng xu sau khi nó được thu thập.
Khởi tạo Dịch vụ và Biến
local Workspace = game:GetService("Workspace")
local Players = game:GetService("Players")
local coinsFolder = Workspace.World.Coins
local coins = coinsFolder:GetChildren()
local COOLDOWN = 10
...

Định nghĩa trình xử lý sự kiện

Engine Roblox mô phỏng vật lý thế giới 3D và xử lý nhiều logic để xử lý các sự kiện liên quan đến việc kết xuất, vật lý và mạng. Khi bạn quan tâm đến việc lập trình logic của riêng mình trong một số sự kiện này, bạn có thể lắng nghe và xử lý chúng, trong khi để engine thực hiện phần còn lại. Trong trường hợp này, bạn lắng nghe và xử lý các sự kiện liên quan đến việc chạm vào đồng xu. Script định nghĩa logic để xử lý sự kiện này trong phương thức onCoinTouched(), thực hiện các bước sau:

  • Phát hiện xem đồng xu có được kích hoạt hay không - Mỗi Instance có một thuộc tính boolean Enabled xác định xem đối tượng có tồn tại trong thế giới 3D hay không. Bạn có thể lấy các thuộc tính của instance bằng phương thức GetAttribute().
  • Phát hiện xem một người chơi đã chạm vào đồng xu hay không - Nếu một đồng xu được kích hoạt, phương thức sử dụng dịch vụ người chơi để kiểm tra xem đối tượng đã chạm vào đồng xu có thực sự là một người chơi hay không. Khi một sự kiện chạm xảy ra, Engine Roblox truyền đối tượng đã chạm vào đồng xu dưới dạng tham số otherPart. Script kiểm tra xem cha của otherPart có thuộc về một người chơi hay không.
  • Vô hiệu hóa đồng xu nếu một người chơi chạm vào nó, và kích hoạt lại sau 10 giây - Cuối cùng, nếu một người chơi chạm vào đồng xu, phương thức vô hiệu hóa đồng xu, chờ 10 giây, và sau đó kích hoạt lại đồng xu để thu thập. task.wait() được sử dụng thay vì wait() vì nó cung cấp hiệu suất tốt hơn bằng cách không tạm dừng hoàn toàn việc thực thi mã, cho phép các tác vụ trong các luồng khác chạy đồng thời.
Định nghĩa Trình xử lý sự kiện
local function onCoinTouched(otherPart, coin)
if coin:GetAttribute("Enabled") then
local character = otherPart.Parent
local player = Players:GetPlayerFromCharacter(character)
if player then
-- Người chơi đã chạm vào một đồng xu
coin.Transparency = 1
coin:SetAttribute("Enabled", false)
print("Người chơi đã thu thập đồng xu")
task.wait(COOLDOWN)
coin.Transparency = 0
coin:SetAttribute("Enabled", true)
end
end
end

Kết nối trình xử lý sự kiện

Tất cả các đối tượng 3D được mô phỏng đều kế thừa từ BasePart và do đó có sự kiện Touched(). Vòng lặp sau kết nối trình xử lý onTouchedEvent() với sự kiện chạm của mỗi đồng xu bằng cách thực hiện các bước sau:

  • Lặp qua tất cả các đồng xu - Lặp qua từng đồng xu bằng cách sử dụng vòng lặp tổng quát.
  • Kết nối trình xử lý với sự kiện - Trong mỗi lần lặp của vòng lặp, đồng xu được kích hoạt theo mặc định, vì vậy nó hiển thị trong thế giới 3D trong giai đoạn khởi đầu của trò chơi. Phương thức trình xử lý onCoinTouched() cũng được kết nối với sự kiện Touched của đồng xu để nó chạy mỗi khi sự kiện xảy ra. Khi engine phát hiện một sự chạm, nó cũng truyền vào đối tượng đã chạm vào đối tượng, otherPart.
Kết nối Trình xử lý sự kiện
for _, coin in coins do
coin:SetAttribute("Enabled", true)
coin.Touched:Connect(function(otherPart)
onCoinTouched(otherPart, coin)
end)
end

Chơi thử cơ chế

Chọn Test từ menu thả xuống và nhấp vào Play. Di chuyển nhân vật của bạn để chạm vào một đồng xu. Nếu mọi thứ hoạt động, đồng xu sẽ biến mất, cửa sổ Output in ra Người chơi đã thu thập đồng xu, và đồng xu sẽ xuất hiện lại sau 10 giây.

Cửa sổ Output của Studio hiển thị xác nhận rằng người chơi đã thu thập một đồng xu.
©2026 Roblox Corporation. Roblox, logo Roblox và Powering Imagination là các nhãn hiệu đã đăng ký và chưa đăng ký của chúng tôi tại Hoa Kỳ và các quốc gia khác.