現在您有3D世界,這個教學的第一個部分教您如何添加您的第一個脚本來定義一個硬幣收集機制。這個機制允許玩家收集硬幣,並且在最近收集硬幣的情況下禁用硬幣的收集。
創建金幣
在您可以腳本任何東西之前,您需要在世界上擁有預設對象作為您的硬幣。像海底堆平台您在上一個區域製作的,硬幣可以是單純的 Part 對象。
要創建金幣:
在 Explorer 窗口中,將新資料梳理到 World 資料梳理欄中,然後重新命名為 Coins 。
將 圓柱體 零件放入 金幣 資料盤,然後將零件重命名為 金幣 。
選擇零件,然後在 屬性 視窗中,
- 將 磚塊顏色 設為 金色 。
- 將 材料 設為 金屬 。
- 將 大小 設為 0.6、8、4 。
- 停用 可衝突 。這告訴引擎其他零件可以穿過金幣,因此玩家可以穿過金幣以收集它們。
- 啟用 錨定 。這告訴引擎永遠不要因任何物理相關模擬而變更硬幣位置,因此玩家可以碰觸硬幣,而不會影響硬幣位置。
再複製一些金幣,並將它們放置在地圖上以進行測試。
您的圓柱零件現在看起來像金幣,並且防止物理模擬,但您必須要在金幣上添加一些原理,以便玩家能夠收集它們。
建立指令碼
要讓金幣能夠被收集,你想要在玩家碰到它們時反應。 Roblox 引擎可以通知你,當有東西碰到金幣時,但你需要在指令碼中宣告這點。 要創建指令碼:
在 Explorer 窗口中,將鼠標擺動至 ServerScriptService 並點擊 ⊕ 按鈕。一個上下文菜單顯示。
從上下文菜單選擇 腳本 。新腳本會在 ServerScriptService 下顯示,並告訴引擎在伺服器上執行腳本,以防止客戶端檢索到代碼。
將指令碼重命名為 CoinService 。
將以下代碼替換為預設代碼:
-- 初始化服務和變數local Workspace = game:GetService("Workspace")local Players = game:GetService("Players")local coinsFolder = Workspace.World.Coinslocal coins = coinsFolder:GetChildren()local COOLDOWN = 10-- 定義事件處理器local function onCoinTouched(otherPart, coin)if coin:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal player = Players:GetPlayerFromCharacter(character)if player then-- 玩家碰到了硬幣coin.Transparency = 1coin:SetAttribute("Enabled", false)print("Player collected coin")task.wait(COOLDOWN)coin.Transparency = 0coin:SetAttribute("Enabled", true)endendend-- 設定事件聽取者for _, coin in coins docoin:SetAttribute("Enabled", true)coin.Touched:Connect(function(otherPart)onCoinTouched(otherPart, coin)end)end現在,每次玩家觸碰到金幣時,金幣會消失10秒,並且輸出記錄會列印 Player collected coin。
代碼說明下列部分說明腳本如何在更詳細的方式運行。
初始化服務和變數
與許多您寫在其他語言的代碼一樣,您可以在指令碼的頭部定義您需要的變量。我們的代碼做到以追蹤中:
獲取所有金幣的引用資料 - 此方法會先查詢 3D 工作區的所有金幣對象,並使用 GetChildren() 方法來返回這些對象的所有子元。這方法會返回包含所有與對象屬性相關的資料的子元陣列,這在此情況下是您創建
定義全球變數 - 變數 COOLDOWN 用於後來定義要在收集到硬幣後禁用的時間。
初始化服務和變數local Workspace = game:GetService("Workspace")local Players = game:GetService("Players")local coinsFolder = Workspace.World.Coinslocal coins = coinsFolder:GetChildren()local COOLDOWN = 10...
定義事件處理器
Roblox 引擎在 3D 世界上物理模擬,處理與渲染、物理和網路相關的事件。當您對這些事件興趣Script 時,您可以聆聽並處理這些事件,讓引擎完成剩下的工作。在此情況下,您可以聆聽處
檢查是否啟用金幣 - 每個 Instance 都有一個 Enabled Boolean 屬性,定義是否存在 3D 世界中的對象。您可以使用 0> Class.Instance:GetAttribute()|GetAttribute()0> 方法獲得對象屬性。
檢測玩家是否觸摸了金幣 - 如果金幣啟用,方法會使用玩家服務來檢查金幣對象是否為玩家。當發生觸摸事件時,Roblox 引擎會傳遞金幣對象作為 otherPart 參數傳給父級。otherPart
如果玩家碰到它,它就會關閉金幣;然後在 10 秒後重新啟用金幣 - 最後,如果玩家碰到金幣,方法會將金幣關閉,等待 10 秒,然後重新啟用金幣以收收藏。 task.wait() 使用
定義事件處理器local function onCoinTouched(otherPart, coin)if coin:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal player = Players:GetPlayerFromCharacter(character)if player then-- 玩家碰到了硬幣coin.Transparency = 1coin:SetAttribute("Enabled", false)print("Player collected coin")task.wait(COOLDOWN)coin.Transparency = 0coin:SetAttribute("Enabled", true)endendend
連接事件處理器
所有模擬 3D 對象都從 BasePart 継承,因此具有 Touched() 事件。下列循環連接 onTouchedEvent() 處理器到每個硬幣的觸摸事件,以進行以追蹤中操作:
在所有的金幣上循環 - 使用一般的重複來在每個金幣上循環。
連接處理器到事件 - 在每個循環的初始化過程中,金幣預設啟用,因此在 3D 世界中顯示。 onCoinTouched() 處理器方法也連接到金幣的 Touched
連接事件處理器for _, coin in coins docoin:SetAttribute("Enabled", true)coin.Touched:Connect(function(otherPart)onCoinTouched(otherPart, coin)end)end
測試機械師
是時候看看金幣收集機制是否如預期運作。若要測試您的體驗:
在菜單欄中,單擊 播放 按鈕。Studio 進入播放測試模式。
將您的角色移動觸摸硬幣。如果您的腳本正確運行,輸出 窗口會顯示 Player collected coin,硬幣會在 10 秒後重新顯示。