Búsqueda del tesoro

El módulo de desarrolladores ScavengerHunt ofrece a los jugadores una forma inherentemente gamificada de explorar tu experiencia, presentándolos de forma orgánica a todo el lugar. El progreso de los jugadores es persistente, por lo que las búsquedas del tesoro pueden continuar entre sesiones.

Uso del módulo

Instalación

Para usar el módulo ScavengerHunt en una experiencia:

  1. En la pestaña Ver, abre la Caja de herramientas y selecciona la pestaña Mercado.

    Botón de activación de Caja de herramientas en Studio
  2. Asegúrate de que la clasificación de Modelos esté seleccionada y, a continuación, haz clic en el botón Ver todo para las Categorías.

  3. Busca y haz clic en el mosaico MÓDULOS DE DESARROLLADORES.

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

  5. En la ventana del Explorador, mueve todo el modelo de ScavengerHunt a ServerScriptService. Al ejecutar la experiencia, el módulo se distribuirá a varios servicios y comenzará a ejecutarse.

Uso de tokens

El módulo de Búsqueda del tesoro usa tokens como artículos que los jugadores buscan y recolectan. El módulo viene con un modelo de token que puedes posicionar en el mundo 3D.

  1. Localiza la malla Token1 dentro de la carpeta Workspace de la carpeta principal del módulo.

  2. Mueve Token1 a la jerarquía de Workspace de nivel superior y colócalo donde desees.

  3. Dale un nombre único al token; este nombre es la forma en que el módulo rastrea las fichas que cada jugador ha recolectado.

  4. Para añadir más tokens, duplica un token existente y dale un nombre único.

Si no deseas usar los tokens de malla en paquete, cualquier Model o BasePart funcionará, siempre y cuando cumpla con los siguientes criterios:

  • El objeto tiene una etiqueta CollectionService de ScavengerHuntPart. Si lo deseas, el nombre de la etiqueta que utiliza el módulo se puede cambiar al establecer un valor diferente para tokenTag en una llamada de configureServer.
  • El objeto contiene una instancia secundaria StringValue establecida en el "Texto de ambientación" a mostrar cuando se recopila el token.
BasePart
Model

Uso de regiones

Las regiones difieren ligeramente de los tokens, ya que las áreas grandes se marcan como "recopiladas" una vez que el jugador ingresa a ellas. Además, cuando un jugador abandona la región, el modal del texto de ambientación automáticamente se elimina y la región en sí misma se elimina del espacio de trabajo.

  1. Crea una parte anclada alrededor de la región, como un bloque o una 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.

  2. Dale un nombre único. Este nombre es cómo el módulo rastrea las regiones a las que cada jugador ha ingresado.

  3. Asigna a la parte una etiqueta CollectionService de ScavengerHuntPart. Si lo deseas, el nombre de la etiqueta que utiliza el módulo se puede cambiar al establecer un valor diferente para tokenTag en una llamada de configureServer.

  4. Incluye una instancia secundaria establecida de StringValue en el "texto de ambientación" que se mostrará cuando se ingrese a región.

Configuración

El módulo está preconfigurado para funcionar en la mayoría de los casos de uso, pero se puede personalizar fácilmente. Por ejemplo, para cambiar la velocidad de rotación del token y personalizar el mensaje de información modal:

  1. En StarterPlayerScripts, crea un nuevo LocalScript y cámbiale el nombre a ConfigureMerchBooth.

  2. Pega el siguiente código en el script nuevo.

    LocalScript - ConfigureScavengerHunt

    local ReplicatedStorage = game: GetService("ReplicatedStorage")
    local ScavengerHunt = require(ReplicatedStorage:WaitForChild("ScavengerHunt"))
    ScavengerHunt.configureClient({
    infoModalText = "Welcome to my Scavenger Hunt!",
    completeModalText = "Thanks for playing my Scavenger Hunt!",
    tokenRotationSpeed = 60,
    })

Eventos de colección

Cada vez que un jugador recoge un token o entra en una región, el evento recopilado se dispara. Puedes escuchar este evento desde un del lado del servidor Script y responder en consecuencia. La función conectada recibe el Player que colisionó con el token o ingresó en la región, y el token o el nombre de ese token o región.

Del mismo modo, cuando un jugador recoge todos los tokens o entra en todas las regiones etiquetadas, el evento allCollected se dispara y la función conectada recibe el valor asociadoPlayer. Esta función solo se dispara una vez por jugador y se puede usar para recompensar a ese jugador con una insignia, acceso a una área nueva, moneda en la experiencia, etc.

Script

local ReplicatedStorage = game: GetService("ReplicatedStorage")
local ScavengerHunt = require(ReplicatedStorage:WaitForChild("ScavengerHunt"))
ScavengerHunt.collected:Connect(function(player, itemName)
print(player.DisplayName, itemName)
end)
ScavengerHunt.allCollected:Connect(function(player)
print(player.DisplayName .. " completed the hunt!")
end)

GUI personalizada

Este módulo expone varias opciones para personalizar tu GUI predeterminada, pero puedes optar por mostrar elementos de GUI personalizada en su lugar.

Cuando useCustomModals se establece en true en la función configureClient, el evento showInfoModal se dispara cada vez que el jugador activa el rastreador de token. Del mismo modo, el evento showCompleteModal se dispara cuando el jugador ha recolectado todo en la búsqueda del tesoro. Ambos eventos se pueden escuchar en un LocalScript.

LocalScript

local Players = game: GetService("Players")
local ReplicatedStorage = game: GetService("ReplicatedStorage")
local ScavengerHunt = require(ReplicatedStorage:WaitForChild("ScavengerHunt"))
ScavengerHunt.showInfoModal:Connect(function()
-- Show a custom info modal
local infoModal = Players. LocalPlayer.PlayerGui.ScavengerInfoModal
infoModal. Enabled = true
end)
ScavengerHunt.showCompleteModal:Connect(function()
-- Show a custom complete modal
local completeModal = Players. LocalPlayer.PlayerGui.ScavengerCompleteModal
completeModal.Enabled = true
end)

Visibilidad de la GUI

De forma predeterminada, la búsqueda del tesoro oculta todo ScreenGuis y CoreGuis (excepto 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 cuáles GUI deberían permanecer visibles, incluye las retrollamadas 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:WaitForChild("ScavengerHunt"))
local player = Players. LocalPlayer
local playerGui = player:WaitForChild("PlayerGui")
local hiddenInstances = {}
-- Create a screen GUI that will not be hidden
local specialGuiInstance = Instance.new("ScreenGui")
-- Draw the screen GUI above the scavenger hunt GUI
specialGuiInstance. DisplayOrder = 1
specialGuiInstance. Parent = playerGui
-- Add text label to the GUI
local specialLabel = Instance.new("TextLabel")
specialLabel. Size = UDim2.fromScale(1, 0.1)
specialLabel. Text = "Remains visible when displaying modals"
specialLabel. Font = Enum. Font.GothamMedium
specialLabel. TextSize = 24
specialLabel. Parent = specialGuiInstance
ScavengerHunt.hideOtherGuis(function()
-- Hide all developer-defined screen GUIs
local instances = playerGui:GetChildren()
for _, instance in pairs(instances) do
if instance: IsA("ScreenGui") and not instance. Name == "ScavengerHunt" and instance. Enabled then
instance. Enabled = false
table.insert(hiddenInstances, instance)
end
end
-- Hide specific core GUIs
StarterGui: SetCoreGuiEnabled(Enum.CoreGuiType.PlayerList, false)
end)
ScavengerHunt.showOtherGuis(function()
-- Show all developer-defined screen GUIs that were hidden
for _, instance in pairs(hiddenInstances) do
instance. Enabled = true
end
hiddenInstances = {}
-- Show specific core GUIs that were hidden
StarterGui: SetCoreGuiEnabled(Enum.CoreGuiType.PlayerList, true)
end)

Referencia API

Funciones

configureClient

configureClient(config:table):nil

Invalida la configuración predeterminada del lado del cliente mediante los siguientes claves/valores de la configtabla. A esta función solo se puede acceder desde un LocalScript.

General

ClaveDescripciónPredeterminado
autoDismissTimeTiempo en segundos antes de que el modal se descarte automáticamente o navegue a la página siguiente, si hay una. Se establece en 0 para desactivar.20
closeModalGamepadBotón del controlador para juego que se usa para cerrar los modales (Enum.KeyCode).ButtonA
closeModalKeyboardTecla que se utiliza para cerrar los modales (Enum.KeyCode).E
completeModalTextTexto que se mostrará en el modal que aparece después de hacer clic en el rastreador de tokens cuando la búsqueda del tesoro se completa."Thanks for participating!"
infoModalTextTexto que se mostrará en el modal que aparece después de hacer clic en el rastreador de tokens."Find all the tokens to complete the hunt"
tokenRotationSpeedVelocidad a la que los tokens rotan, en grados por segundo. Se establece en 0 para evitar la rotación.20
nextArrowImageImagen que se usa para indicar que hay más páginas modales que se deben mostrar después de la página modal actual."rbxassetid://8167172095"
openTokenTrackerGamepadBotón del controlador del juego que se usa para mostrar los modales que aparecen después de activar el rastreador de tokens (Enum.KeyCode).ButtonY
openTokenTrackerKeyboardTecla que se utiliza para mostrar los modales que aparecen después de activar el rastreador de tokens (Enum.KeyCode).Y
openTokenTrackerGamepadButtonImageImagen para el botón del controlador del juego que se usa para activar el rastreador de tokens."rbxassetid://8025860488"
regionIconIcono que se mostrará junto al rastreador de tokens al ingresar regiones."rbxassetid://8073794624"
tokenIconIcono que se mostrará junto al rastreador de tokens al recolectar tokens."rbxassetid://8073794477"
tokenTrackerPositionSmallDevicePosición de la interfaz de usuario del rastreador de tokens en dispositivos pequeños, como teléfonos (UDim2).(1, 0, 0, 84)
tokenTrackerPositionLargeDevicePosición de la interfaz de usuario del rastreador de tokens en dispositivos más grandes, como tabletas y PC (UDim2).(1, 0, 1, -16)
useRegionsEn lugar de tokens, usa regiones.false

Modales

ClaveDescripciónPredeterminado
modal.backgroundColorColor del fondo de los modales (Color3).[0, 0, 0]
modal.fontFuente del texto que aparece en un modal (Enum.Font).GothamMedium
modal.textColorColor del texto que aparece en un modal (Color3).[255, 255, 255]
modal.textSizeTamaño del texto que aparece en un modal.16
useCustomModalsSi es "true", los modales predeterminados no se muestran. Esto te permite mostrar modales personalizados como se describe en la GUI personalizada.false
useCustomTokenTrackerSi es "true", el rastreador de tokens predeterminado no se muestra. Esto te permite mostrar una GUI de rastreador de tokens personalizada en su lugar.false

Baliza de navegación

ClaveDescripciónPredeterminado
showNavigationBeamSi es "true", se mostrará un Beam del jugador al token más cercano.true
navigationBeam.colorColorSequence define el color de la baliza en sus segmentos. Consulta Beam.Color para obtener más información.[255, 255, 255] → [255, 255, 255]
navigationBeam.curveSize0Posición del primer punto de control en la curva de Bézier de la baliza. Consulta Beam.CurveSize0 para obtener más información.0
navigationBeam.curveSize1Posición del segundo punto de control en la curva de Bézier de la baliza. Consulta Beam.CurveSize1 para obtener más información.0
navigationBeam.faceCameraLos segmentos de la baliza siempre estarán orientados hacia la cámara, independientemente de su orientación. Consulta Beam.FaceCamera para obtener más información.true
navigationBeam.lightEmissionGrado al que los colores de la baliza se mezclan con los colores detrás de ella. Consulta Beam.LightEmission para obtener más información.0
navigationBeam.lightInfluenceGrado en el que la baliza se ve influenciada por la iluminación del entorno. Consulta Beam.LightInfluence para obtener más información.0
navigationBeam.segmentsDe cuántos segmentos rectos está compuesta la baliza.10
navigationBeam.textureIdentificación del recurso de la textura que se mostrará en la baliza."rbxassetid://8081777495"
navigationBeam.textureLengthLongitud de la textura de la baliza, según la configuración de navigationBeam.textureMode. Consulta Beam.TextureLength para obtener más información.1
navigationBeam.textureModeForma en la que la textura de la baliza escala y se repite (Enum.TextureMode).Wrap
navigationBeam.textureSpeedVelocidad a la que la imagen de la textura se mueve a lo largo de la baliza.1
navigationBeam.transparencyNumberSequence define la transparencia de la baliza en sus segmentos. Consulta Beam.Transparency para obtener más información.(0, 0) → (0,15, 1) → (1, 1)
navigationBeam.width0Ancho de la baliza en su base, en studs.1
navigationBeam.width1Ancho de la baliza en su extremo, en studs.1
navigationBeam.zOffsetDistancia, en studs, a la que la pantalla de la baliza se desplaza, en relación con la cámara.0
LocalScript

local ReplicatedStorage = game: GetService("ReplicatedStorage")
local ScavengerHunt = require(ReplicatedStorage:WaitForChild("ScavengerHunt"))
ScavengerHunt.configureClient({
infoModalText = "Welcome to my Scavenger Hunt!",
completeModalText = "Thanks for playing my Scavenger Hunt!",
tokenRotationSpeed = 60,
navigationBeam = {
lightEmission = 1
},
modal = {
textSize = 14
},
})

configureServer

configureServer(config:table):nil

Reemplaza las opciones de configuración predeterminadas del lado del servidor a través de los siguientes claves/valores en la configtabla . A esta función solo se puede acceder desde un Script.

ClaveDescripciónPredeterminado
tokenTagEtiqueta usada por CollectionService para encontrar todos los tokens o regiones que se usan en la búsqueda del tesoro."ScavengerHuntPart"
datastoreNameNombre del DataStore utilizado por la búsqueda del tesoro para almacenar el progreso de la colección de cada jugador."ScavengerHuntTokens"
resetOnPlayerRemovingSi es "true", restablece el progreso del usuario cuando sale de la experiencia; conveniente para no guardar el progreso mientras prueba la búsqueda del tesoro.false
Script

local ReplicatedStorage = game: GetService("ReplicatedStorage")
local ScavengerHunt = require(ReplicatedStorage:WaitForChild("ScavengerHunt"))
ScavengerHunt.configureServer({
tokenTag = "GreenGem",
})

disable

disable():nil

Oculta toda la interfaz de usuario para la búsqueda del tesoro, desconecta a todos los oyentes de los eventos de entrada y evita que los jugadores recolecten tokens o interactúen con las regiones. A esta función solo se puede acceder desde un Script.

Script

local ReplicatedStorage = game: GetService("ReplicatedStorage")
local ScavengerHunt = require(ReplicatedStorage:WaitForChild("ScavengerHunt"))
ScavengerHunt.disable()

enable

enable():nil

Muestra toda la interfaz de usuario para la búsqueda del tesoro, conecta a todos los oyentes de los eventos de entrada y permite a los jugadores recolectar tokens e interactuar con las regiones. A esta función solo se puede acceder desde un Script.

Script

local ReplicatedStorage = game: GetService("ReplicatedStorage")
local ScavengerHunt = require(ReplicatedStorage:WaitForChild("ScavengerHunt"))
ScavengerHunt.enable()

Eventos

collected

collected(player:Player, itemName:string, totalCollected:number): RBXScriptSignal

Se dispara cuando un jugador colisiona con un token o entra en una región. La función conectada recibirá el Player que colisionó con el token o ingresó en la región y el nombre del token que colisionó o la región en la que se ingresó. Este evento solo se puede conectar en un Script.

Parámetros
player: PlayerUsuario que colisionó con un token o entró a una región.
itemName: string Nombre del token que fue colisionado o la región en la que se ingresó.
totalCollected: numberNúmero total de tokens recopilados por el usuario representado por player.
Script

local ReplicatedStorage = game: GetService("ReplicatedStorage")
local ScavengerHunt = require(ReplicatedStorage:WaitForChild("ScavengerHunt"))
ScavengerHunt.collected:Connect(function(player, itemName, totalCollected)
print(player.DisplayName, itemName, totalCollected)
end)

allCollected

allCollected(player:Player): RBXScriptSignal

Se dispara cuando un jugador recoge todos los tokens o entra en todas las regiones en la búsqueda del tesoro. La función conectada recibirá el Player que recopiló todos los tokens y solo se dispara una vez por jugador. Este evento solo se puede conectar en un Script.

Parámetros
player: PlayerJugador que recolectó todos los tokens o entró en todas las regiones.
Script

local ReplicatedStorage = game: GetService("ReplicatedStorage")
local ScavengerHunt = require(ReplicatedStorage:WaitForChild("ScavengerHunt"))
ScavengerHunt.allCollected:Connect(function(player)
print(player.DisplayName .. " completed the hunt!")
end)

showInfoModal

showInfoModal(): RBXScriptSignal

Se dispara cuando el jugador hace clic en el rastreador de tokens cuando la opciónuseCustomModals de configuración se establece en true. Este evento solo se puede conectar en un LocalScript.

LocalScript

local Players = game: GetService("Players")
local ReplicatedStorage = game: GetService("ReplicatedStorage")
local ScavengerHunt = require(ReplicatedStorage:WaitForChild("ScavengerHunt"))
ScavengerHunt.showInfoModal:Connect(function()
local infoModal = Players. LocalPlayer.PlayerGui.InfoModal
infoModal. Enabled = true
end)

showCompleteModal

showCompleteModal(): RBXScriptSignal

Se dispara cuando el jugador hace clic en el rastreador de tokens cuando la opción de configuración de useCustomModals 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:WaitForChild("ScavengerHunt"))
ScavengerHunt.showCompleteModal:Connect(function()
local completeModal = Players. LocalPlayer.PlayerGui.CompleteModal
completeModal.Enabled = true
end)

Callbacks

hideOtherGuis

hideOtherGuis(callback:function)

Esta retrollamada se ejecuta inmediatamente después de que un modal se ha descartado, lo que te permite activar ScreenGuis o elementos completos en ellos. Consulta Visibilidad de la GUI para obtener los detalles y el código de ejemplo.

showOtherGuis

showOtherGuis(callback:function)

Esta retrollamada se ejecuta inmediatamente antes de que la impresión se muestre, lo que te permite desactivar el ScreenGuis o los elementos completos dentro de ellos antes de que la impresión se muestre. Consulta Visibilidad de la GUI para obtener los detalles y el código de ejemplo.