創建硬幣收集機制

*此內容是使用 AI(Beta 測試版)翻譯,可能含有錯誤。若要以英文檢視此頁面,請按一下這裡。

現在你已經擁有了一個 3D 世界,是時候添加你的第一個腳本。在這一部分中,你將創建一個硬幣收集機制,讓玩家可以收集硬幣,並在硬幣被收集後暫時禁用它們。

創建硬幣

在你可以編寫任何腳本之前,你需要在世界中擁有佔位符物件作為你的硬幣。就像你在上一部分中製作的海堆平台一樣,硬幣可以是簡單的 Part 物件。

創建硬幣
在 Workspace > World 中,創建一個名為 Coins 的新資料夾。
在 Coins 資料夾中,創建一個名為 Coin 的圓柱 Part,BrickColor 設置為 Gold,Material 設置為 Metal,Size 設置為 0.6, 8, 4,Orientation 設置為 90, 0, 0。
禁用 CanCollide 並啟用 Anchored。
然後複製 Coin 部件幾次,並將複製品散佈在島上和平台上,以便從海堆層級可以到達。
保持每個複製品的名稱為 Coin。

創建腳本

接下來,你將使硬幣對玩家做出反應。Roblox 引擎可以檢測到當某物觸碰到硬幣時,但你需要使用腳本來定義硬幣應該如何反應。

創建 CoinService
在 ServerScriptService 中,創建一個名為 CoinService 的腳本,並使用以下代碼:
```lua
-- 初始化服務和變數
local Workspace = game:GetService("Workspace")
local Players = game:GetService("Players")
local coinsFolder = Workspace.World.Coins
local coins = coinsFolder:GetChildren()
local COOLDOWN = 10
-- 定義事件處理程序
local function onCoinTouched(otherPart, coin)
if coin:GetAttribute("Enabled") then
local character = otherPart.Parent
local player = Players:GetPlayerFromCharacter(character)
if player then
-- 玩家觸碰了硬幣
coin.Transparency = 1
coin:SetAttribute("Enabled", false)
print("玩家收集了硬幣")
task.wait(COOLDOWN)
coin.Transparency = 0
coin:SetAttribute("Enabled", true)
end
end
end
-- 設置事件監聽器
for _, coin in coins do
coin:SetAttribute("Enabled", true)
coin.Touched:Connect(function(otherPart)
onCoinTouched(otherPart, coin)
end)
end
```

現在,每當玩家觸碰到硬幣時,硬幣會消失 10 秒,並且輸出日誌會打印 玩家收集了硬幣。

以下部分將更詳細地描述腳本的工作原理。

初始化服務和變數

就像你可能在其他語言中編寫的許多代碼一樣,你在腳本的頂部定義了稍後需要的變數。我們的代碼執行以下操作:

  • 獲取服務實例 - Roblox 服務提供了內置功能以支持常見功能。腳本首先獲取 Workspace 服務的實例,該服務包含 3D 世界中的每個物件,以及 Player 服務,該服務管理並包含所有連接到你的遊戲的玩家。
  • 獲取所有硬幣的引用 - 然後,腳本查詢 3D 工作區以獲取所有硬幣物件的引用,使用 GetChildren() 方法。此方法返回一個數組,包含所有父級為與之關聯的物件的物件,在這種情況下是你之前創建的 Workspace.World.Coins 資料夾。
  • 定義全局變數 - COOLDOWN 變數稍後用於定義收集硬幣後禁用硬幣的時間長度。
初始化服務和變數
local Workspace = game:GetService("Workspace")
local Players = game:GetService("Players")
local coinsFolder = Workspace.World.Coins
local coins = coinsFolder:GetChildren()
local COOLDOWN = 10
...

定義事件處理程序

Roblox 引擎物理模擬 3D 世界並處理許多與渲染、物理和網絡相關的事件邏輯。當你有興趣在這些事件中編寫自己的邏輯時,你可以監聽和處理它們,同時讓引擎處理其餘部分。在這種情況下,你監聽和處理與硬幣被觸碰相關的事件。腳本在 onCoinTouched() 方法中定義了處理此事件的邏輯,該方法執行以下操作:

  • 檢測硬幣是否啟用 - 每個 Instance 都有一個 Enabled 布林屬性,定義該物件是否存在於 3D 世界中。你可以使用 GetAttribute() 方法獲取實例屬性。
  • 檢測玩家是否觸碰了硬幣 - 如果硬幣啟用,該方法使用玩家服務檢查觸碰硬幣的物件是否確實是玩家。當觸碰事件發生時,Roblox 引擎將觸碰硬幣的物件作為 otherPart 參數傳遞。腳本檢查 otherPart 的父級是否屬於玩家。
  • 如果玩家觸碰了硬幣,則禁用硬幣,並在 10 秒後重新啟用 - 最後,如果玩家觸碰了硬幣,該方法禁用硬幣,等待 10 秒,然後重新啟用硬幣以供收集。使用 task.wait() 而不是 wait(),因為它提供了更好的性能,不會完全暫停代碼執行,允許其他線程中的任務同時運行。
定義事件處理程序
local function onCoinTouched(otherPart, coin)
if coin:GetAttribute("Enabled") then
local character = otherPart.Parent
local player = Players:GetPlayerFromCharacter(character)
if player then
-- 玩家觸碰了硬幣
coin.Transparency = 1
coin:SetAttribute("Enabled", false)
print("玩家收集了硬幣")
task.wait(COOLDOWN)
coin.Transparency = 0
coin:SetAttribute("Enabled", true)
end
end
end

連接事件處理程序

所有模擬的 3D 物件都繼承自 BasePart,因此都有一個 Touched() 事件。以下循環將 onTouchedEvent() 處理程序連接到每個硬幣的觸碰事件,具體步驟如下:

  • 遍歷所有硬幣 - 使用一般迭代遍歷每個硬幣。
  • 將處理程序連接到事件 - 在循環的每次迭代中,硬幣默認啟用,因此在遊戲初始啟動時在 3D 世界中可見。onCoinTouched() 處理程序方法也連接到硬幣的 Touched 事件,以便每次事件發生時都運行。當引擎檢測到觸碰時,它還會傳遞觸碰該物件的物件 otherPart。
連接事件處理程序
for _, coin in coins do
coin:SetAttribute("Enabled", true)
coin.Touched:Connect(function(otherPart)
onCoinTouched(otherPart, coin)
end)
end

測試機制

從下拉菜單中選擇 Test 並點擊 Play。移動你的角色以觸碰一個硬幣。如果一切正常,硬幣會消失,並且 Output 窗口會打印 玩家收集了硬幣,硬幣在 10 秒後重新出現。

Studio 的輸出窗口顯示確認玩家收集了硬幣。
©2026 Roblox Corporation、Roblox、Roblox 標誌及 Powering Imagination 是我們在美國及其他國家地區的部分註冊與未註冊商標。