Moduł ScavengerHunt dewelopera daje graczom wbudowany w grę sposób eksploracji Twojego doświadczenia, organicznie wprowadzając ich do całego miejsca. Postęp gracza jest trwały, więc polowania na skarby mogą trwać przez wiele sesji.
Użycie modułu
Instalacja
Aby użyć modułu ScavengerHunt w doświadczeniu:
Z menu Okno w Studio lub pasku narzędzi zakładki Strona główna, otwórz Toolbox i wybierz zakładkę Sklep twórcy.

Upewnij się, że jest wybrane sortowanie Modele, a następnie kliknij przycisk Zobacz wszystkie dla Kategorii.

Zlokalizuj i kliknij kafelek Pakiety.
Zlokalizuj moduł Polowanie na skarby i kliknij go, lub przeciągnij i upuść go w widoku 3D.

W oknie Eksploratora przenieś cały model ScavengerHunt do ReplicatedStorage. Po uruchomieniu doświadczenia, moduł zacznie działać.
Użycie tokenów
Moduł polowania na skarby używa tokenów jako przedmiotów, których gracze poszukują i zbierają. Moduł zawiera jeden model tokena, który możesz umieścić w trójwymiarowym świecie.
Zlokalizuj siatkę Token1 w folderze Workspace głównego folderu modułu.

Przenieś Token1 do najwyższego poziomu hierarchii Workspace i umieść go w pożądanym miejscu.
Nadaj tokenowi unikalną nazwę; ta nazwa służy modułowi do śledzenia, które tokeny każdy gracz zebrał.
Aby dodać więcej tokenów, skopiuj istniejący token i nadaj mu unikalną nazwę.
Jeśli nie chcesz używać dołączonych modeli tokenów, każde Model lub BasePart będzie działać, o ile spełnia następujące kryteria:
Obiekt ma etykietę CollectionService o nazwie ScavengerHuntPart. W razie potrzeby nazwę etykiety CollectionService, której używa moduł, można zmienić, ustawiając inną wartość dla tokenTag w wywołaniu configureServer.
Obiekt zawiera instancję podrzędną StringValue ustawioną na "smak tekstu", który ma być wyświetlany po zebraniu tokena.

Model 
MeshPart
Użycie regionów
Regiony różnią się nieco od tokenów, ponieważ są to duże obszary, które są oznaczane jako "zebrane" po wejściu przez gracza. Dodatkowo, gdy gracz opuszcza region, modale z tekstem smakowym automatycznie się zamykają, a sam region jest usuwany z workspace.
Utwórz zakotwiconą część wokół regionu, taką jak blok lub kula. Moduł automatycznie wyłączy właściwość CanCollide w czasie rzeczywistym, aby gracze nie kolidowali z regionem fizycznie.
Nadaj mu unikalną nazwę. Ta nazwa służy modułowi do śledzenia, które regiony każdy gracz wszedł.
Używając sekcji Tagi właściwości części, zastosuj etykietę ScavengerHuntPart do części, aby CollectionService ją wykryło. W razie potrzeby nazwę etykiety, którą używa moduł, można zmienić, ustawiając inną wartość dla tokenTag w wywołaniu configureServer.
Dołącz instancję podrzędną StringValue ustawioną na "smak tekstu", który ma być wyświetlany po wejściu do regionu.

Konfiguracja
Moduł jest wstępnie skonfigurowany do działania w większości przypadków użycia, ale można go łatwo dostosować. Na przykład, aby zmienić prędkość rotacji tokenów i spersonalizować informację modalną:
W StarterPlayerScripts utwórz nowy LocalScript i zmień jego nazwę na ConfigureScavengerHunt.
Wklej następujący kod do nowego skryptu.
LocalScript - ConfigureScavengerHuntlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local ScavengerHunt = require(ReplicatedStorage.ScavengerHunt)ScavengerHunt.configureClient({infoModalText = "Witaj w moim Polowaniu na skarby!",completeModalText = "Dziękuję za udział w moim Polowaniu na skarby!",tokenRotationSpeed = 60,})
Wydarzenia zebrań
Za każdym razem, gdy gracz zbiera token lub wchodzi do regionu, wyzwolone zostaje wydarzenie collected. Możesz nasłuchiwać tego wydarzenia z poziomu serwera Script i odpowiednio na nie reagować. Podłączona funkcja odbiera Player, który zderzył się z tokenem lub wszedł do regionu oraz nazwę tego tokena lub regionu.
Podobnie, gdy gracz zbiera wszystkie tokeny lub wchodzi do wszystkich oznaczonych regionów, wyzwolone zostaje wydarzenie allCollected i podłączona funkcja odbiera powiązanego Player. Ta funkcja jest wywoływana tylko raz na gracza i może być użyta do nagrodzenia tego gracza odznaką, dostępem do nowego obszaru, walutą w doświadczeniu itp.
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 .. " ukończył polowanie!")
end)
Niestandardowe GUI
Ten moduł oferuje kilka opcji do dostosowania domyślnego GUI, ale możesz zdecydować się na wyświetlenie zamiast tego elementów GUI niestandardowych.
Gdy useCustomModals jest ustawione na true w funkcji configureClient, wyzwolone zostaje wydarzenie showInfoModal za każdym razem, gdy gracz aktywuje tracker tokenów. Podobnie, wydarzenie showCompleteModal wyzwala się, gdy gracz zebrał wszystko w polowaniu na skarby. Oba te wydarzenia można nasłuchiwać w LocalScript.
LocalScript
local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local ScavengerHunt = require(ReplicatedStorage.ScavengerHunt)
ScavengerHunt.showInfoModal:Connect(function()
-- Pokaż niestandardowe info modal
local infoModal = Players.LocalPlayer.PlayerGui.ScavengerInfoModal
infoModal.Enabled = true
end)
ScavengerHunt.showCompleteModal:Connect(function()
-- Pokaż niestandardowe complete modal
local completeModal = Players.LocalPlayer.PlayerGui.ScavengerCompleteModal
completeModal.Enabled = true
end)
Widoczność GUI
Domyślnie polowanie na skarby ukrywa wszystkie ScreenGuis i CoreGuis (z wyjątkiem listy graczy), gdy modal z informacją lub skończeniem się pojawia. Jeśli chcesz nadpisać to automatyczne ukrywanie i programowo zdecydować, które GUI powinny pozostać widoczne, dołącz wywołania zwrotne hideOtherGuis i showOtherGuis i zareaguj swoją własną logiką.
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 = {}
-- Utwórz ekranowe GUI, które nie zostanie ukryte
local specialGuiInstance = Instance.new("ScreenGui")
-- Narysuj ekranowe GUI nad GUI polowania na skarby
specialGuiInstance.DisplayOrder = 1
specialGuiInstance.Parent = playerGui
-- Dodaj etykietę tekstową do GUI
local specialLabel = Instance.new("TextLabel")
specialLabel.Size = UDim2.fromScale(1, 0.1)
specialLabel.Text = "Pozostaje widoczne podczas wyświetlania modalów"
specialLabel.Font = Enum.Font.GothamMedium
specialLabel.TextSize = 24
specialLabel.Parent = specialGuiInstance
ScavengerHunt.hideOtherGuis(function()
-- Ukryj wszystkie ekranowe GUI zdefiniowane przez dewelopera
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
-- Ukryj określone core GUI
StarterGui:SetCoreGuiEnabled(Enum.CoreGuiType.PlayerList, false)
end)
ScavengerHunt.showOtherGuis(function()
-- Pokaż wszystkie ekranowe GUI zdefiniowane przez dewelopera, które były ukryte
for _, instance in hiddenInstances do
instance.Enabled = true
end
hiddenInstances = {}
-- Pokaż określone core GUI, które były ukryte
StarterGui:SetCoreGuiEnabled(Enum.CoreGuiType.PlayerList, true)
end)
Odnośnik do API
Funkcje
configureClient
configureClient(config: table)
Nadpisuje domyślne opcje konfiguracji po stronie klienta poprzez następujące klucze/wartości w tabeli config. Ta funkcja może być wywołana tylko z LocalScript.
| Klucz | Opis | Domyślnie |
|---|---|---|
| autoDismissTime | Czas w sekundach, przed automatycznym zamknięciem modalu lub przejściem do następnej strony, jeśli taka istnieje. Ustaw na 0, aby wyłączyć. | 20 |
| closeModalGamepad | Przycisk na kontrolerze używany do zamykania modalów (Enum.KeyCode). | ButtonA |
| closeModalKeyboard | Klucz na klawiaturze używany do zamykania modalów (Enum.KeyCode). | E |
| completeModalText | Tekst do wyświetlenia na modal, który pojawia się po kliknięciu trackera tokenów, gdy polowanie na skarby jest zakończone. | "Dziękuję za udział!" |
| infoModalText | Tekst do wyświetlenia na modal, który pojawia się po kliknięciu trackera tokenów. | "Znajdź wszystkie tokeny, aby ukończyć polowanie" |
| tokenRotationSpeed | Prędkość, z jaką tokeny się obracają, w stopniach na sekundę. Ustaw na 0, aby zapobiec rotacji. | 20 |
| nextArrowImage | Obrazek używany do wskazania, że są dostępne kolejne strony modalów po bieżącej stronie. | "rbxassetid://8167172095" |
| openTokenTrackerGamepad | Przycisk na kontrolerze używany do wyświetlenia modalów, które pojawiają się po aktywacji trackera tokenów (Enum.KeyCode). | ButtonY |
| openTokenTrackerKeyboard | Klucz na klawiaturze używany do wyświetlenia modalów, które pojawiają się po aktywacji trackera tokenów (Enum.KeyCode). | Y |
| openTokenTrackerGamepadButtonImage | Obrazek przycisku kontrolera, który jest używany do aktywacji trackera tokenów. | "rbxassetid://8025860488" |
| regionIcon | Ikona wyświetlana obok trackera tokenów przy wchodzeniu do regionów. | "rbxassetid://8073794624" |
| tokenIcon | Ikona wyświetlana obok trackera tokenów podczas zbierania tokenów. | "rbxassetid://8073794477" |
| tokenTrackerPositionSmallDevice | Pozycja interfejsu użytkownika trackera tokenów na małych urządzeniach, takich jak telefony (UDim2). | (1, 0, 0, 84) |
| tokenTrackerPositionLargeDevice | Pozycja interfejsu użytkownika trackera tokenów na większych urządzeniach, takich jak tablety i PC (UDim2). | (1, 0, 1, -16) |
| useRegions | Zamiast tokenów, użyj regionów. | false |
LocalScriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local ScavengerHunt = require(ReplicatedStorage.ScavengerHunt)ScavengerHunt.configureClient({infoModalText = "Witaj w moim Polowaniu na skarby!",completeModalText = "Dziękuję za udział w moim Polowaniu na skarby!",tokenRotationSpeed = 60,navigationBeam = {lightEmission = 1},modal = {textSize = 14},})
configureServer
configureServer(config: table)
Nadpisuje domyślne opcje konfiguracji po stronie serwera poprzez następujące klucze/wartości w tabeli config. Ta funkcja może być wywołana tylko z Script.
| Klucz | Opis | Domyślnie |
|---|---|---|
| tokenTag | Tag używany przez CollectionService do znajdowania wszystkich tokenów lub regionów używanych w polowaniu na skarby. | "ScavengerHuntPart" |
| datastoreName | Nazwa DataStore używanego przez polowanie na skarby do przechowywania postępów zbierania każdego gracza. | "ScavengerHuntTokens" |
| resetOnPlayerRemoving | Jeśli prawda, resetuje postęp użytkownika, gdy opuszcza doświadczenie; wygodne do niezapisywania postępów podczas testowania polowania na skarby. | false |
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local ScavengerHunt = require(ReplicatedStorage.ScavengerHunt)ScavengerHunt.configureServer({tokenTag = "GreenGem",})
disable
disable()
Ukrywa wszystkie UI dla polowania na skarby, odłącza wszystkie słuchacze wydarzeń wejściowych i uniemożliwia graczom zbieranie tokenów lub interakcję z regionami. Ta funkcja może być wywołana tylko z Script.
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local ScavengerHunt = require(ReplicatedStorage.ScavengerHunt)ScavengerHunt.disable()
enable
enable()
Wyświetla wszystkie UI dla polowania na skarby, łączy wszystkie słuchacze wydarzeń wejściowych i pozwala graczom zbierać tokeny i interagować z regionami. Ta funkcja może być wywołana tylko z Script.
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local ScavengerHunt = require(ReplicatedStorage.ScavengerHunt)ScavengerHunt.enable()
Wydarzenia
collected
Wyzwala się, gdy gracz zderza się z tokenem lub wchodzi do regionu. Podłączona funkcja otrzyma Player, który zderzył się z tokenem lub wszedł do regionu oraz nazwę tokena, w który zderzył się lub regionu, do którego wszedł. To wydarzenie może być podłączone tylko w Script.
| Parametry | |
|---|---|
| player: Player | Użytkownik, który zderzył się z tokenem lub wszedł do regionu. |
| itemName: string | Nazwa tokena, w który zderzył się lub regionu, do którego wszedł. |
| totalCollected: number | Łączna liczba tokenów zebranych przez użytkownika reprezentowanego przez 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
Wyzwala się, gdy gracz zbiera wszystkie tokeny lub wchodzi do wszystkich regionów w polowaniu na skarby. Podłączona funkcja otrzyma Player, który zebrał wszystkie tokeny, i jest wywoływana tylko raz na gracza. To wydarzenie może być podłączone tylko w Script.
| Parametry | |
|---|---|
| player: Player | Gracz, który zebrał wszystkie tokeny lub wszedł do wszystkich regionów. |
Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local ScavengerHunt = require(ReplicatedStorage.ScavengerHunt)
ScavengerHunt.allCollected:Connect(function(player)
print(player.DisplayName .. " ukończył polowanie!")
end)
showInfoModal
Wyzwala się, gdy gracz klika na tracker tokenów, gdy opcja konfiguracji useCustomModals configuracja jest ustawiona na prawda. To wydarzenie może być podłączone tylko w 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
Wyzwala się, gdy gracz klika na tracker tokenów, gdy opcja konfiguracji useCustomModals configuracja jest ustawiona na prawda, a gracz zebrał wszystkie tokeny w polowaniu na skarby. To wydarzenie może być podłączone tylko w 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)
Wywołania zwrotne
hideOtherGuis
hideOtherGuis(callback: function)
To wywołanie zwrotne działa natychmiast przed wyświetleniem modalu, pozwalając Ci dezaktywować całe ScreenGuis lub elementy w ich obrębie przed wyświetleniem modalu. Zobacz Widoczność GUI po szczegóły i przykładowy kod.
showOtherGuis
showOtherGuis(callback: function)
To wywołanie zwrotne działa natychmiast po zamknięciu modalu, pozwalając Ci aktywować całe ScreenGuis lub elementy w ich obrębie. Zobacz Widoczność GUI po szczegóły i przykładowy kod.