ScavengerHunt 開發者模組 為玩家提供了一種固有的遊戲化方式以探索你的體驗,自然地將他們引入整個場所。玩家的進度是持久的,因此尋寶遊戲可以跨會話進行。
模組使用
安裝
要在體驗中使用ScavengerHunt模組:
從Studio的窗口菜單或首頁選項卡工具欄,打開 工具箱 並選擇創作者商店標籤。

確保選擇了模型排序,然後單擊查看所有按鈕以顯示類別。

找到並單擊包圖塊。
找到尋寶遊戲模組,然後單擊它,或將其拖放到3D視圖中。

在資源管理器窗口中,將整個ScavengerHunt模型移至ReplicatedStorage。在運行體驗時,模組將開始運行。
使用代幣
尋寶遊戲模組使用代幣作為玩家搜尋和收集的物品。該模組附帶一個可以放置在3D世界中的代幣模型。
在模組主文件夾的工作區文件夾中找到Token1網格。

將Token1移至頂層工作區層次結構,並將其放置在所需位置。
給代幣一個唯一名稱;這名稱是模組追蹤每個玩家已收集代幣的方式。
若要添加更多代幣,請複製現有代幣並給它一個唯一名稱。
如果你不想使用捆綁的網格代幣,任何Model或BasePart都可以使用,只要它滿足以下標準:
物件具有CollectionService標籤ScavengerHuntPart。如果需要,可以通過在configureServer調用中為tokenTag設置不同的值來更改模組使用的CollectionService標籤名稱。
物件包含一個子StringValue實例,設置為收集代幣時顯示的“風味 文本”。

模型 
MeshPart
使用區域
區域與代幣有所不同,它們是標記為“已收集”的大區域,當玩家進入時會標記。此外,當玩家離開該區域時,風味文本模態將自動關閉,該區域本身將從工作區中移除。
在區域周圍創建一個固定的部分,例如區塊或球體。該模組將在運行時自動禁用該區域的CanCollide屬性,以便玩家不會與該區域物理碰撞。
給它一個唯一名稱。這名稱是模組追蹤每個玩家進入的區域的方式。
使用該部分屬性的標籤部分,將標籤ScavengerHuntPart應用於該部分,以便CollectionService檢測到它。如果需要,可以通過在configureServer調用中為tokenTag設置不同的值來更改模組使用的標籤名稱。
包含一個子StringValue實例,設置為進入該區域時顯示的“風味 文本”。

配置
該模組預配置以適用於大多數使用案例,但可以輕鬆自定義。例如,若要更改代幣的旋轉速度並自定義模態信息消息:
在StarterPlayerScripts中,創建一個新的LocalScript並將其重命名為ConfigureScavengerHunt。
將以下代碼粘貼到新腳本中。
LocalScript - ConfigureScavengerHuntlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local ScavengerHunt = require(ReplicatedStorage.ScavengerHunt)ScavengerHunt.configureClient({infoModalText = "歡迎來到我的尋寶遊戲!",completeModalText = "謝謝你參加我的尋寶遊戲!",tokenRotationSpeed = 60,})
收集事件
每次玩家收集一個代幣或進入一個區域時,collected事件就會觸發。你可以在伺服器端的Script中監聽此事件並作出相應的響應。連接的函數將接收與代幣相撞或進入區域的Player,以及該代幣或區域的名稱。
類似地,當玩家收集所有代幣或進入所有標記的區域時,allCollected事件就會觸發,並且連接的函數將接收相關的Player。該函數每位玩家僅觸發一次,可以用來向該玩家頒發徽章、獲得進入新地區的權限、體驗內幣等。
Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local ScavengerHunt = require(ReplicatedStorage.ScavengerHunt)
ScavengerHunt.collected:Connect(function(player, itemName)
print(player.DisplayName, itemName)
end)
ScavengerHunt.allCollected:Connect(function(player)
print(player.DisplayName .. " 完成了尋寶遊戲!")
end)
自定義GUI
此模組提供了幾個選項以自定義其默認GUI,但你可以選擇顯示自定義GUI元素。
當在configureClient函數中將useCustomModals設置為true時,當玩家啟用代幣跟蹤器時,showInfoModal事件就會觸發。類似地,當玩家在尋寶遊戲中收集了所有代幣時,showCompleteModal事件就會觸發。這兩個事件都可以在LocalScript中進行監聽。
LocalScript
local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local ScavengerHunt = require(ReplicatedStorage.ScavengerHunt)
ScavengerHunt.showInfoModal:Connect(function()
-- 顯示自定義信息模態
local infoModal = Players.LocalPlayer.PlayerGui.ScavengerInfoModal
infoModal.Enabled = true
end)
ScavengerHunt.showCompleteModal:Connect(function()
-- 顯示自定義完成模態
local completeModal = Players.LocalPlayer.PlayerGui.ScavengerCompleteModal
completeModal.Enabled = true
end)
GUI可見性
默認情況下,當信息模態或完成模態出現時,尋寶遊戲將隱藏所有ScreenGuis和CoreGuis(玩家列表除外)。如果你想覆蓋此自動隱藏行為並以程式的方式決定哪些GUI應保持可見,可以包括hideOtherGuis和showOtherGuis回調,並按照自己的自定義邏輯做出響應。
LocalScript
local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local StarterGui = game:GetService("StarterGui")
local ScavengerHunt = require(ReplicatedStorage.ScavengerHunt)
local player = Players.LocalPlayer
local playerGui = player:WaitForChild("PlayerGui")
local hiddenInstances = {}
-- 創建一個將不會被隱藏的屏幕GUI
local specialGuiInstance = Instance.new("ScreenGui")
-- 將屏幕GUI繪製在尋寶遊戲GUI之上
specialGuiInstance.DisplayOrder = 1
specialGuiInstance.Parent = playerGui
-- 向GUI添加文本標籤
local specialLabel = Instance.new("TextLabel")
specialLabel.Size = UDim2.fromScale(1, 0.1)
specialLabel.Text = "顯示模態時保持可見"
specialLabel.Font = Enum.Font.GothamMedium
specialLabel.TextSize = 24
specialLabel.Parent = specialGuiInstance
ScavengerHunt.hideOtherGuis(function()
-- 隱藏所有開發者定義的屏幕GUI
local instances = playerGui:GetChildren()
for _, instance in instances do
if instance:IsA("ScreenGui") and not instance.Name == "ScavengerHunt" and instance.Enabled then
instance.Enabled = false
table.insert(hiddenInstances, instance)
end
end
-- 隱藏特定核心GUI
StarterGui:SetCoreGuiEnabled(Enum.CoreGuiType.PlayerList, false)
end)
ScavengerHunt.showOtherGuis(function()
-- 顯示所有被隱藏的開發者定義的屏幕GUI
for _, instance in hiddenInstances do
instance.Enabled = true
end
hiddenInstances = {}
-- 顯示所有被隱藏的特定核心GUI
StarterGui:SetCoreGuiEnabled(Enum.CoreGuiType.PlayerList, true)
end)
API 參考
函數
configureClient
configureClient(config: table)
通過config表中的以下鍵/值覆蓋默認的客戶端配置選項。這個函數只能從LocalScript中調用。
| 鍵 | 描述 | 默認 |
|---|---|---|
| autoDismissTime | 在模態自動關閉或導航到下一頁之前的時間(以秒為單位)。設置為0以禁用。 | 20 |
| closeModalGamepad | 用於關閉模態的遊戲手柄按鈕(Enum.KeyCode)。 | ButtonA |
| closeModalKeyboard | 用於關閉模態的鍵盤按鍵(Enum.KeyCode)。 | E |
| completeModalText | 在收集到尋寶的代幣後顯示的模態文本。 | "謝謝你參加!" |
| infoModalText | 在點擊代幣跟蹤器後顯示的模態文本。 | "找到所有代幣以完成尋寶" |
| tokenRotationSpeed | 代幣的旋轉速度,以每秒度數計算。設置為0以防止旋轉。 | 20 |
| nextArrowImage | 用於指示有更多模態頁面顯示在當前模態頁面後的圖像。 | "rbxassetid://8167172095" |
| openTokenTrackerGamepad | 用於顯示在激活代幣跟蹤器後出現的模態的遊戲手柄按鈕(Enum.KeyCode)。 | ButtonY |
| openTokenTrackerKeyboard | 用於顯示在激活代幣跟蹤器後出現的模態的鍵盤按鍵(Enum.KeyCode)。 | Y |
| openTokenTrackerGamepadButtonImage | 用於激活代幣跟蹤器的遊戲手柄按鈕的圖像。 | "rbxassetid://8025860488" |
| regionIcon | 在進入區域時顯示的圖標。 | "rbxassetid://8073794624" |
| tokenIcon | 在收集代幣時顯示的圖標。 | "rbxassetid://8073794477" |
| tokenTrackerPositionSmallDevice | 在小型設備(如手機)上代幣跟蹤器UI的位置(UDim2)。 | (1, 0, 0, 84) |
| tokenTrackerPositionLargeDevice | 在大型設備(如平板和電腦)上代幣跟蹤器UI的位置(UDim2)。 | (1, 0, 1, -16) |
| useRegions | 而不是使用代幣,使用區域。 | false |
LocalScriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local ScavengerHunt = require(ReplicatedStorage.ScavengerHunt)ScavengerHunt.configureClient({infoModalText = "歡迎來到我的尋寶遊戲!",completeModalText = "謝謝你參加我的尋寶遊戲!",tokenRotationSpeed = 60,navigationBeam = {lightEmission = 1},modal = {textSize = 14},})
configureServer
configureServer(config: table)
通過config表中的以下鍵/值覆蓋默認的伺服器端配置選項。這個函數只能從Script中調用。
| 鍵 | 描述 | 默認 |
|---|---|---|
| tokenTag | 由CollectionService使用的標籤,以查找在尋寶遊戲中使用的所有代幣或區域。 | "ScavengerHuntPart" |
| datastoreName | DataStore的名稱,尋寶遊戲用來存儲每個玩家的收集進度。 | "ScavengerHuntTokens" |
| resetOnPlayerRemoving | 如果設置為true,當玩家離開體驗時重置其進度;這對於在測試尋寶遊戲時不保存進度很方便。 | false |
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local ScavengerHunt = require(ReplicatedStorage.ScavengerHunt)ScavengerHunt.configureServer({tokenTag = "GreenGem",})
disable
disable()
隱藏所有尋寶遊戲的UI,斷開所有輸入事件監聽器,並禁止玩家收集代幣或與區域互動。這個函數只能從Script中調用。
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local ScavengerHunt = require(ReplicatedStorage.ScavengerHunt)ScavengerHunt.disable()
enable
enable()
顯示所有尋寶遊戲的UI,連接所有輸入事件監聽器,並允許玩家收集代幣和與區域互動。這個函數只能從Script中調用。
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local ScavengerHunt = require(ReplicatedStorage.ScavengerHunt)ScavengerHunt.enable()
事件
collected
當玩家與代幣相撞或進入一個區域時觸發。連接的函數將接收與代幣相撞或進入區域的Player,以及代幣的名稱或進入的區域名稱。這個事件只能在Script中連接。
| 參數 | |
|---|---|
| player: Player | 與代幣相撞或進入區域的用戶。 |
| itemName: string | 代幣的名稱或進入的區域名稱。 |
| totalCollected: number | 用戶收集的總代幣數量,由player表示。 |
Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local ScavengerHunt = require(ReplicatedStorage.ScavengerHunt)
ScavengerHunt.collected:Connect(function(player, itemName, totalCollected)
print(player.DisplayName, itemName, totalCollected)
end)
allCollected
當玩家收集所有代幣或進入尋寶遊戲中的所有區域時觸發。連接的函數將接收收集所有代幣的Player,並且它每位玩家僅觸發一次。這個事件只能在Script中連接。
| 參數 | |
|---|---|
| player: Player | 收集所有代幣或進入所有區域的玩家。 |
Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local ScavengerHunt = require(ReplicatedStorage.ScavengerHunt)
ScavengerHunt.allCollected:Connect(function(player)
print(player.DisplayName .. " 完成了尋寶遊戲!")
end)
showInfoModal
當玩家點擊代幣跟蹤器並且useCustomModals 配置選項設置為true時觸發。這個事件只能在LocalScript中連接。
LocalScript
local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local ScavengerHunt = require(ReplicatedStorage.ScavengerHunt)
ScavengerHunt.showInfoModal:Connect(function()
local infoModal = Players.LocalPlayer.PlayerGui.InfoModal
infoModal.Enabled = true
end)
showCompleteModal
當玩家點擊代幣跟蹤器並且useCustomModals 配置選項設置為true並且玩家已在尋寶遊戲中收集所有代幣時觸發。這個事件只能在LocalScript中連接。
LocalScript
local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local ScavengerHunt = require(ReplicatedStorage.ScavengerHunt)
ScavengerHunt.showCompleteModal:Connect(function()
local completeModal = Players.LocalPlayer.PlayerGui.CompleteModal
completeModal.Enabled = true
end)
回調
hideOtherGuis
hideOtherGuis(callback: function)
此回調在顯示模態之前立即運行,讓你在模態顯示之前禁用整個ScreenGuis或其中的元素。詳情和示例代碼請參見GUI可見性。
showOtherGuis
showOtherGuis(callback: function)
此回調在模態被關閉後立即運行,讓你啟用整個ScreenGuis或其中的元素。詳情和示例代碼請參見GUI可見性。