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:
En la pestaña Ver, abre la Caja de herramientas y selecciona la pestaña Mercado.
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.
Busca y haz clic en el mosaico MÓDULOS DE DESARROLLADORES.
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 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.
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.
Dale un nombre único al token; este nombre es la forma en que el módulo rastrea las fichas que cada jugador ha recolectado.
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.
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.
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.
Dale un nombre único. Este nombre es cómo el módulo rastrea las regiones a las que cada jugador ha ingresado.
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.
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:
En StarterPlayerScripts, crea un nuevo LocalScript y cámbiale el nombre a ConfigureMerchBooth.
Pega el siguiente código en el script nuevo.
LocalScript - ConfigureScavengerHuntlocal 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
Clave | Descripción | Predeterminado |
---|---|---|
autoDismissTime | Tiempo 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 |
closeModalGamepad | Botón del controlador para juego que se usa para cerrar los modales (Enum.KeyCode). | ButtonA |
closeModalKeyboard | Tecla que se utiliza para cerrar los modales (Enum.KeyCode). | E |
completeModalText | Texto 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!" |
infoModalText | Texto 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" |
tokenRotationSpeed | Velocidad a la que los tokens rotan, en grados por segundo. Se establece en 0 para evitar la rotación. | 20 |
nextArrowImage | Imagen 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" |
openTokenTrackerGamepad | Botó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 |
openTokenTrackerKeyboard | Tecla que se utiliza para mostrar los modales que aparecen después de activar el rastreador de tokens (Enum.KeyCode). | Y |
openTokenTrackerGamepadButtonImage | Imagen para el botón del controlador del juego que se usa para activar el rastreador de tokens. | "rbxassetid://8025860488" |
regionIcon | Icono que se mostrará junto al rastreador de tokens al ingresar 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, usa regiones. | false |
Modales
Clave | Descripción | Predeterminado |
---|---|---|
modal.backgroundColor | Color del fondo de los modales (Color3). | [0, 0, 0] |
modal.font | Fuente del texto que aparece en un modal (Enum.Font). | GothamMedium |
modal.textColor | Color del texto que aparece en un modal (Color3). | [255, 255, 255] |
modal.textSize | Tamaño del texto que aparece en un modal. | 16 |
useCustomModals | Si es "true", los modales predeterminados no se muestran. Esto te permite mostrar modales personalizados como se describe en la GUI personalizada. | false |
useCustomTokenTracker | Si 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
Clave | Descripción | Predeterminado |
---|---|---|
showNavigationBeam | Si es "true", se mostrará un Beam del jugador al token más cercano. | true |
navigationBeam.color | ColorSequence 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.curveSize0 | Posició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.curveSize1 | Posició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.faceCamera | Los 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.lightEmission | Grado 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.lightInfluence | Grado 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.segments | De cuántos segmentos rectos está compuesta la baliza. | 10 |
navigationBeam.texture | Identificación del recurso de la textura que se mostrará en la baliza. | "rbxassetid://8081777495" |
navigationBeam.textureLength | Longitud 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.textureMode | Forma en la que la textura de la baliza escala y se repite (Enum.TextureMode). | Wrap |
navigationBeam.textureSpeed | Velocidad a la que la imagen de la textura se mueve a lo largo de la baliza. | 1 |
navigationBeam.transparency | NumberSequence 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.width0 | Ancho de la baliza en su base, en studs. | 1 |
navigationBeam.width1 | Ancho de la baliza en su extremo, en studs. | 1 |
navigationBeam.zOffset | Distancia, 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.
Clave | Descripción | Predeterminado |
---|---|---|
tokenTag | Etiqueta usada por CollectionService para encontrar todos los tokens o regiones que se usan en la búsqueda del tesoro. | "ScavengerHuntPart" |
datastoreName | Nombre del DataStore utilizado por la búsqueda del tesoro para almacenar el progreso de la colección de cada jugador. | "ScavengerHuntTokens" |
resetOnPlayerRemoving | Si 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: Player | Usuario 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: number | Nú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: Player | Jugador 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.