El ScavengerHunt módulo de desarrollador brinda a los jugadores una forma inherentemente gamificada de explorar tu experiencia, introduciéndolos de manera orgánica a todo el lugar. El progreso del jugador es persistente, por lo que las búsquedas del tesoro pueden continuar a través de sesiones.
Uso del módulo
Instalación
Para usar el módulo ScavengerHunt en una experiencia:
Desde el menú Ventana de Studio o la barra de herramientas de la pestaña Inicio, abre la Caja de herramientas y selecciona la pestaña Tienda de Creadores.

Asegúrate de que esté seleccionada la clasificación Modelos, luego haz clic en el botón Ver Todos para Categorías.

Localiza y haz clic en el mosaico Paquetes.
Localiza el módulo Búsqueda del Tesoro y haz clic en él, o arrástralo y suéltalo en la vista 3D.

En la ventana Explorador, mueve todo el modelo ScavengerHunt a ReplicatedStorage. Al ejecutar la experiencia, el módulo comenzará a funcionar.
Usar tokens
El módulo de búsqueda del tesoro utiliza tokens como los elementos que los jugadores buscan y recolectan. El módulo viene con un modelo de token que puedes posicionar en el mundo 3D.
Localiza la malla Token1 dentro de la carpeta Workspace de la carpeta principal del módulo.

Mueve Token1 a la jerarquía de Workspace de nivel superior y colócalo donde desees.
Asigna al token un nombre único; este nombre es cómo el módulo rastrea qué tokens ha recolectado cada jugador.
Para agregar más tokens, duplica un token existente y dale un nombre único.
Si no deseas utilizar las mallas de tokens incluidas, cualquier Model o BasePart funcionará, siempre que cumpla con los siguientes criterios:
El objeto tiene una etiqueta de CollectionService llamada ScavengerHuntPart. Si lo deseas, el nombre de la etiqueta de CollectionService que utiliza el módulo se puede cambiar configurando un valor diferente para tokenTag en una llamada a configureServer.
El objeto contiene una instancia StringValue hijo configurada con el "texto de sabor" a mostrar cuando se recolecte el token.

Modelo 
MeshPart
Usar regiones
Las regiones son ligeramente diferentes a los tokens, ya que son áreas grandes que se marcan como "recolectadas" una vez que el jugador entra en ellas. Además, cuando un jugador sale de la región, el modal de texto de sabor se cierra automáticamente y la región misma se elimina del espacio de trabajo.
Crea una parte anclada alrededor de la región, como un bloque o esfera. El módulo desactivará automáticamente la propiedad CanCollide en tiempo de ejecución para que los jugadores no colisionen físicamente con la región.
Asigna un nombre único. Este nombre es cómo el módulo rastrea qué regiones ha entrado cada jugador.
Utilizando la sección Etiquetas de las propiedades de la parte, aplica la etiqueta ScavengerHuntPart a la parte para que CollectionService la detecte. Si lo deseas, el nombre de la etiqueta que utiliza el módulo se puede cambiar configurando un valor diferente para tokenTag en una llamada a configureServer.
Incluye una instancia StringValue hijo configurada con el "texto de sabor" a mostrar cuando se entre en la región.

Configuración
El módulo está preconfigurado para funcionar en la mayoría de los casos de uso, pero puede personalizarse fácilmente. Por ejemplo, para cambiar la velocidad de rotación de los tokens y personalizar el mensaje modal de información:
En StarterPlayerScripts, crea un nuevo LocalScript y renómbralo a ConfigureScavengerHunt.
Pega el siguiente código en el nuevo script.
LocalScript - ConfigureScavengerHuntlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local ScavengerHunt = require(ReplicatedStorage.ScavengerHunt)ScavengerHunt.configureClient({infoModalText = "¡Bienvenido a mi Búsqueda del Tesoro!",completeModalText = "¡Gracias por jugar mi Búsqueda del Tesoro!",tokenRotationSpeed = 60,})
Eventos de colección
Cada vez que un jugador recolecta un token o entra en una región, se activa el evento collected. Puedes escuchar este evento desde un Script del lado del servidor y responder en consecuencia. La función conectada recibe al Player que chocó con el token o ingresó a la región y el nombre de ese token o región.
De manera similar, cuando un jugador recolecta todos los tokens o entra en todas las regiones etiquetadas, se activa el evento allCollected y la función conectada recibe al Player asociado. Esta función solo se activa una vez por jugador y se puede utilizar para recompensar a ese jugador con una insignia, acceso a una nueva área, moneda dentro de la experiencia, etc.
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 .. " completó la búsqueda!")
end)
GUI personalizada
Este módulo expone varias opciones para personalizar su GUI predeterminada, pero puedes optar por mostrar elementos de GUI personalizados en su lugar.
Cuando useCustomModals se establece en true en la función configureClient, el evento showInfoModal se activa cada vez que el jugador activa el rastreador de tokens. De manera similar, el evento showCompleteModal se activa cuando el jugador ha recolectado todo en la búsqueda del tesoro. Ambos de estos eventos se pueden escuchar en un LocalScript.
LocalScript
local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local ScavengerHunt = require(ReplicatedStorage.ScavengerHunt)
ScavengerHunt.showInfoModal:Connect(function()
-- Mostrar un modal de información personalizado
local infoModal = Players.LocalPlayer.PlayerGui.ScavengerInfoModal
infoModal.Enabled = true
end)
ScavengerHunt.showCompleteModal:Connect(function()
-- Mostrar un modal de completado personalizado
local completeModal = Players.LocalPlayer.PlayerGui.ScavengerCompleteModal
completeModal.Enabled = true
end)
Visibilidad de GUI
Por defecto, la búsqueda del tesoro oculta todas las ScreenGuis y CoreGuis (excepto por la lista de jugadores) cuando aparece el modal de información o el modal de finalización. Si deseas anular este comportamiento de ocultación automática y decidir programáticamente qué GUIs deben permanecer visibles, incluye las devoluciones de llamada hideOtherGuis y showOtherGuis y responde con tu propia lógica personalizada.
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 = {}
-- Crear una Screen GUI que no se ocultará
local specialGuiInstance = Instance.new("ScreenGui")
-- Dibujar la screen GUI encima de la GUI de búsqueda del tesoro
specialGuiInstance.DisplayOrder = 1
specialGuiInstance.Parent = playerGui
-- Agregar etiqueta de texto a la GUI
local specialLabel = Instance.new("TextLabel")
specialLabel.Size = UDim2.fromScale(1, 0.1)
specialLabel.Text = "Permanece visible al mostrar modales"
specialLabel.Font = Enum.Font.GothamMedium
specialLabel.TextSize = 24
specialLabel.Parent = specialGuiInstance
ScavengerHunt.hideOtherGuis(function()
-- Ocultar todas las Screen GUIs definidas por el desarrollador
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
-- Ocultar GUI principales específicas
StarterGui:SetCoreGuiEnabled(Enum.CoreGuiType.PlayerList, false)
end)
ScavengerHunt.showOtherGuis(function()
-- Mostrar todas las Screen GUIs definidas por el desarrollador que fueron ocultadas
for _, instance in hiddenInstances do
instance.Enabled = true
end
hiddenInstances = {}
-- Mostrar GUI principales específicas que fueron ocultadas
StarterGui:SetCoreGuiEnabled(Enum.CoreGuiType.PlayerList, true)
end)
Referencia de API
Funciones
configureClient
configureClient(config: table)
Reemplaza las opciones de configuración predeterminadas del lado del cliente a través de las siguientes claves/valores en la tabla config. Esta función solo se puede llamar desde un LocalScript.
| Clave | Descripción | Predeterminado |
|---|---|---|
| autoDismissTime | Tiempo en segundos antes de que el modal se cierre automáticamente o navegue a la siguiente página si hay una. Establecer en 0 para desactivar. | 20 |
| closeModalGamepad | Boton de gamepad utilizado para cerrar modales (Enum.KeyCode). | ButtonA |
| closeModalKeyboard | Tecla de teclado utilizada para cerrar modales (Enum.KeyCode). | E |
| completeModalText | Texto que se muestra en el modal que aparece después de hacer clic en el rastreador de tokens cuando la búsqueda del tesoro está completa. | "¡Gracias por participar!" |
| infoModalText | Texto que se muestra en el modal que aparece después de hacer clic en el rastreador de tokens. | "Encuentra todos los tokens para completar la búsqueda" |
| tokenRotationSpeed | Velocidad a la que rotan los tokens, en grados por segundo. Establecer en 0 para evitar la rotación. | 20 |
| nextArrowImage | Imagen utilizada para indicar que hay más páginas de modales para mostrar después de la página modal actual. | "rbxassetid://8167172095" |
| openTokenTrackerGamepad | Boton de gamepad utilizado para mostrar los modales que aparecen después de activar el rastreador de tokens (Enum.KeyCode). | ButtonY |
| openTokenTrackerKeyboard | Tecla de teclado utilizada para mostrar los modales que aparecen después de activar el rastreador de tokens (Enum.KeyCode). | Y |
| openTokenTrackerGamepadButtonImage | Imagen del botón del gamepad que se utiliza para activar el rastreador de tokens. | "rbxassetid://8025860488" |
| regionIcon | Icono que se mostrará junto al rastreador de tokens al entrar en regiones. | "rbxassetid://8073794624" |
| tokenIcon | Icono que se mostrará junto al rastreador de tokens al recolectar tokens. | "rbxassetid://8073794477" |
| tokenTrackerPositionSmallDevice | Posición de la interfaz de usuario del rastreador de tokens en dispositivos pequeños como teléfonos (UDim2). | (1, 0, 0, 84) |
| tokenTrackerPositionLargeDevice | Posición de la interfaz de usuario del rastreador de tokens en dispositivos más grandes como tabletas y PC (UDim2). | (1, 0, 1, -16) |
| useRegions | En lugar de tokens, usar regiones. | false |
LocalScriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local ScavengerHunt = require(ReplicatedStorage.ScavengerHunt)ScavengerHunt.configureClient({infoModalText = "¡Bienvenido a mi Búsqueda del Tesoro!",completeModalText = "¡Gracias por jugar mi Búsqueda del Tesoro!",tokenRotationSpeed = 60,navigationBeam = {lightEmission = 1},modal = {textSize = 14},})
configureServer
configureServer(config: table)
Reemplaza las opciones de configuración predeterminadas del lado del servidor a través de las siguientes claves/valores en la tabla config. Esta función solo se puede llamar desde un Script.
| Clave | Descripción | Predeterminado |
|---|---|---|
| tokenTag | Etiqueta utilizada por CollectionService para encontrar todos los tokens o regiones utilizados en la búsqueda del tesoro. | "ScavengerHuntPart" |
| datastoreName | Nombre del DataStore utilizado por la búsqueda del tesoro para almacenar el progreso de colección de cada jugador. | "ScavengerHuntTokens" |
| resetOnPlayerRemoving | Si es verdadero, restablece el progreso del usuario cuando abandona la experiencia; conveniente para no guardar el progreso mientras se prueba la búsqueda del tesoro. | false |
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local ScavengerHunt = require(ReplicatedStorage.ScavengerHunt)ScavengerHunt.configureServer({tokenTag = "GreenGem",})
disable
disable()
Oculta toda la interfaz de usuario para la búsqueda del tesoro, desconecta todos los oyentes de eventos de entrada y evita que los jugadores recojan tokens o interactúen con regiones. Esta función solo se puede llamar desde un Script.
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local ScavengerHunt = require(ReplicatedStorage.ScavengerHunt)ScavengerHunt.disable()
enable
enable()
Muestra toda la interfaz de usuario para la búsqueda del tesoro, conecta todos los oyentes de eventos de entrada y permite que los jugadores recojan tokens e interactúen con regiones. Esta función solo se puede llamar desde un Script.
Scriptlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local ScavengerHunt = require(ReplicatedStorage.ScavengerHunt)ScavengerHunt.enable()
Eventos
collected
Se activa cuando un jugador choca con un token o entra en una región. La función conectada recibirá al Player que chocó con el token o entró en la región y el nombre del token con el que chocó o la región que se ingresó. Este evento solo se puede conectar en un Script.
| Parámetros | |
|---|---|
| player: Player | Usuario que chocó con un token o ingresó en una región. |
| itemName: string | Nombre del token con el que chocó o la región en la que ingresó. |
| totalCollected: number | Número total de tokens recolectados por el usuario representado por 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
Se activa cuando un jugador recolecta todos los tokens o ingresa todas las regiones en la búsqueda del tesoro. La función conectada recibirá al Player que recolectó todos los tokens, y solo se activa una vez por jugador. Este evento solo se puede conectar en un Script.
| Parámetros | |
|---|---|
| player: Player | Jugador que recolectó todos los tokens o ingresó todas las regiones. |
Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local ScavengerHunt = require(ReplicatedStorage.ScavengerHunt)
ScavengerHunt.allCollected:Connect(function(player)
print(player.DisplayName .. " completó la búsqueda!")
end)
showInfoModal
Se activa cuando el jugador hace clic en el rastreador de tokens cuando la opción de configuración useCustomModals configuración está establecida en verdadero. Este evento solo se puede conectar en un 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
Se activa cuando el jugador hace clic en el rastreador de tokens cuando la opción de configuración useCustomModals configuración está establecida en true y el jugador ha recolectado todos los tokens en la búsqueda del tesoro. Este evento solo se puede conectar en un 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)
Devoluciones de llamada
hideOtherGuis
hideOtherGuis(callback: function)
Esta devolución de llamada se ejecuta inmediatamente antes de que se muestre un modal, lo que te permite deshabilitar toda la ScreenGuis o elementos dentro de ellas antes de que se muestre el modal. Consulta Visibilidad de GUI para detalles y código de ejemplo.
showOtherGuis
showOtherGuis(callback: function)
Esta devolución de llamada se ejecuta inmediatamente después de que un modal se haya cerrado, lo que te permite habilitar toda la ScreenGuis o elementos dentro de ellas. Consulta Visibilidad de GUI para detalles y código de ejemplo.