Bây giờ bạn đã có một thế giới 3D, đã đến lúc thêm vào kịch bản đầu tiên của bạn. Trong phần này, bạn sẽ tạo một cơ chế thu thập xu cho phép người chơi thu thập xu và tạm thời vô hiệu hóa 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 kỳ đ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 ở phần trước, các đồng xu có thể là các đối tượng đơn giản Part.
Tạo các đồng xuTrong 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 Part hình trụ có tên là Coin với BrickColor đặt thành Vàng, Material đặt thành Kim loại, Kích thước 0.6, 8, 4, và Hướng 90, 0, 0.Vô hiệu hóa CanCollide và bật Anchored.Sau đó sao chép phần Coin vài lần và rải rác các bản sao xung quanh hòn đảo và trên các nền tảng để chúng có thể với tới từ các cấp độ biển.Giữ mỗi bản sao được đặt tên là Coin.
Tạo kịch bản
Tiếp theo, bạn sẽ làm cho các đồng xu phản hồi 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 kịch bản để định nghĩa cách mà đồng xu nên phản ứng.
Tạo CoinServiceTrong ServerScriptService, tạo một Kịch bản có tên CoinService với mã sau:```lua-- Khởi tạo dịch vụ và biếnlocal Workspace = game:GetService("Workspace")local Players = game:GetService("Players")local coinsFolder = Workspace.World.Coinslocal coins = coinsFolder:GetChildren()local COOLDOWN = 10-- Định nghĩa trình xử lý sự kiệnlocal function onCoinTouched(otherPart, coin)if coin:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal player = Players:GetPlayerFromCharacter(character)if player then-- Người chơi chạm vào một đồng xucoin.Transparency = 1coin:SetAttribute("Enabled", false)print("Người chơi đã thu thập đồng xu")task.wait(COOLDOWN)coin.Transparency = 0coin:SetAttribute("Enabled", true)endendend-- Thiết lập trình nghe sự kiệnfor _, coin in coins docoin:SetAttribute("Enabled", true)coin.Touched:Connect(function(otherPart)onCoinTouched(otherPart, coin)end)end```
Bây giờ, mỗi khi 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 Người chơi đã thu thập đồng xu.
Các phần sau mô tả cách mà kịch bản 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 bằng các ngôn ngữ khác, bạn định nghĩa các biến cần thiết ở đầu kịch bản. Mã của chúng tôi thực hiện các bước sau:
- Lấy tham chiếu đến tất cả các đồng xu - Kịch bản sau đó truy vấn không gian 3D để lấy tất 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 đặt trong đối tượng mà nó được kết nối, 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ếnlocal Workspace = game:GetService("Workspace")local Players = game:GetService("Players")local coinsFolder = Workspace.World.Coinslocal coins = coinsFolder:GetChildren()local COOLDOWN = 10...
Định nghĩa trình xử lý sự kiện
Engine Roblox mô phỏng vật lý trong thế giới 3D và xử lý rất nhiều logic để xử lý các sự kiện liên quan đến 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 bạn trong một số sự kiện này, bạn có thể lắng nghe và xử lý chúng, trong khi để engine xử lý 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. Kịch bản định nghĩa logic để xử lý sự kiện này trong phương thức onCoinTouched(), làm những điều sau:
- Phát hiện xem đồng xu có được bật không - Mỗi Instance có một thuộc tính boolean Enabled định nghĩa xem đối tượng có tồn tại trong thế giới 3D hay không. Bạn có thể lấy thuộc tính của đối tượng bằng phương thức GetAttribute().
- Phát hiện xem người chơi có chạm vào đồng xu không - Nếu một đồng xu được bậ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. Kịch bản 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 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 sẽ vô hiệu hóa đồng xu, chờ 10 giây và sau đó kích hoạt lại đồng xu cho việc 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ó một 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 từng đồng xu bằng cách làm những điều sau:
- Lặp qua tất cả các đồng xu - Lặp qua từng đồng xu bằng phương pháp lặp cơ bản.
- 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 bật theo mặc định, vì vậy nó hiển thị trong thế giới 3D trong quá trình khởi đầu trò chơi. Phương thức onCoinTouched() cũng được kết nối với sự kiện Touched của đồng xu để nó được thực thi 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
Kiểm tra cơ chế
Chọn Test từ trình đơn thả xuống và nhấn 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 Người chơi đã thu thập đồng xu, và đồng xu sẽ xuất hiện lại sau 10 giây.
