Caça ao tesouro

O módulo de desenvolvedores ScavengerHunt dá aos jogadores uma maneira inerentemente jogabilizada de explorar sua experiência, apresentando-a organicamente para todo o local. O progresso do jogador é persistente, então as caçadas ao tesouro podem continuar entre as sessões.

Uso do módulo

Instalação

Para usar o módulo ScavengerHunt em uma experiência:

  1. Na aba Exibir, abra a Caixa de ferramentas e selecione a aba Mercado.

    Botão de ativação da Caixa de ferramentas no Studio.
  2. Verifique se a ordenação de Modelos está selecionada e, em seguida, clique no botão Exibir Tudo para Categorias.

  3. Encontre e clique no painel DEV MODULES

  4. Localize o módulo Caça ao tesouro e clique nele ou o arraste e solte na visualização 3D.

  5. Na janela do Explorador, mova todo o modelo ScavengerHunt para o ServerScriptService. Ao executar a experiência, o módulo será distribuído para vários serviços e começará a ser executado.

Usando tokens

O módulo de caça ao tesouro usa tokens como itens que os jogadores procuram e coletam. O módulo vem com um modelo de token que você pode posicionar no mundo 3D.

  1. Localize a malha Token1 dentro da pasta Espaço de trabalho da pasta principal do módulo.

  2. Mova o Token1 para a hierarquia mais alta do Espaço de trabalho e posicione-o onde desejar.

  3. Dê ao token um nome exclusivo; esse nome é como o módulo rastreia quais tokens cada jogador já coletou.

  4. Para adicionar mais tokens, duplique um token existente e dê a ele um nome exclusivo.

Se você não quiser usar os tokens de malha do pacote, qualquer Class. Model ou Class. BasePart funcionará, contanto que atenda aos seguintes critérios:

  • O objeto tem um marcador Class. CollectionService de ScavengerHuntPart. Se desejar, o nome do marcador que o módulo utiliza pode ser alterado através da configuração de um valor diferente para tokenTag em uma chamada configureServer.
  • O objeto contém uma instância filho Class. StringValue definida como o “texto identificador” a ser exibido quando o token é coletado.

BasePart

Model

Usando regiões

As regiões diferem ligeiramente dos tokens, como grandes áreas que são marcadas como “coletadas” assim que o jogador entra nelas. Além disso, quando um jogador deixa a região, o modal do texto identificador é automaticamente descartado e a própria região é removida do espaço de trabalho.

  1. Crie uma parte ancorada em torno da região, como um bloco ou esfera. O módulo desabilitará automaticamente a propriedade Class. BasePart. CanCollide|CanCollide no tempo de exposição para que os jogadores não colidam fisicamente com a região.

  2. Dê a ela um nome exclusivo. Esse nome é como o módulo rastreia em quais regiões cada jogador entrou.

  3. Atribua à parte um marcador Class. CollectionService de ScavengerHuntPart. Se desejar, o nome do marcador que o módulo utiliza pode ser alterado através da configuração de um valor diferente para tokenTag em uma chamada configureServer.

  4. Inclua uma instância filho Class. StringValue definida como o “texto identificador” a ser exibido quando a região é inserida.

Configuração

O módulo é pré-configurado para funcionar na maioria dos casos de uso, mas pode ser facilmente personalizado. Por exemplo, para alterar a velocidade de rotação do token e personalizar a mensagem de informação do modal:

  1. Em StarterPlayerScripts, crie um novo Class. LocalScript e renomeie-o para ConfigureScavengerHunt.

  2. Cole o seguinte código dentro do script novo.

    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 coleção

Toda vez que um jogador coleta um token ou entra em uma região, o evento collected é acionado. Você pode captar esse evento do Class. Script do lado do servidor e responder de acordo. A função conectada recebe o Class. Player que colidiu com o token ou entrou na região e o nome desse token ou dessa região.

Da mesma forma, quando um jogador coleta todos os tokens ou entra em todas as regiões marcadas, o evento allCollected é acionado e a função conectada recebe o Class. Player associado. Essa função só é acionada uma vez por jogador e pode ser usada para recompensar esse jogador com um emblema, acesso a uma nova área, moeda da experiência etc.

Script

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

Interface gráfica personalizada

Este módulo expõe várias opções para personalizar sua interface gráfica padrão, mas você também pode optar por exibir elementos personalizados de interface gráfica.

Quando useCustomModals é definido como true na função configureClient, o evento showInfoModal é acionado toda vez que o jogador ativa o rastreador de token. Da mesma forma, o evento showCompleteModal é acionado quando o jogador coletou tudo na caça ao tesouro. Ambos os eventos podem ser captados em um Class. LocalScript.

LocalScript

Visibilidade da interface gráfica

Por padrão, a caça ao tesouro esconde todos os Class. ScreenGui|ScreenGuis e Class. CoreGui|CoreGuis (exceto para a lista de jogadores) quando o modal de informação ou o modal de conclusão aparece. Se você quiser substituir esse comportamento de ocultação automática e decidir programaticamente quais interfaces gráficas devem permanecer visíveis, inclua os retornos de chamada hideOtherGuis e showOtherGuis e responda com sua própria 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.

Referência de API

Funções

configureClient

configureClient(config:table):nil

Substitui as opções de configuração padrão do cliente por meio das seguintes chaves-valores na tabela config. Esta função só poder ser chamada de um Class. LocalScript.

Geral

ChaveDescriçãoPadrão
autoDismissTimeTempo em segundos antes que o modal desapareça automaticamente ou navegue para a próxima página, se houver. Defina como 0 para desabilitar.20
closeModalGamepadBotão do controle usado para fechar modais (Enum. KeyCode).ButtonA
closeModalKeyboardTecla do teclado usada para fechar modais (Enum. KeyCode).E
completeModalTextTexto a ser exibido no modal que aparece depois de clicar no rastreador de token quando a caça ao tesouro é concluída."Obrigado por participar!"
infoModalTextTexto a ser exibido no modal que aparece depois de clicar no rastreador de token."Encontre todos os tokens para completar a caça"
tokenRotationSpeedVelocidade em que os tokens giram, em graus por segundo. Defina como 0 para evitar a rotação.20
nextArrowImageImagem usada para indicar que há mais páginas modais a serem exibidas após a página modal atual."rbxassetid://8167172095"
openTokenTrackerGamepadBotão do controle usado para mostrar os modais que aparecem depois de ativar o rastreador de tokens (Enum. KeyCode).ButtonY
openTokenTrackerKeyboardTecla do teclado usada para mostrar os modais que aparecem depois de ativar o rastreador de tokens (Enum. KeyCode).Y
openTokenTrackerGamepadButtonImageImagem para o botão do controle que é usado para ativar o rastreador de tokens."rbxassetid://8025860488"
regionIconÍcone a ser exibido ao lado do rastreador de tokens ao entrar em regiões."rbxassetid://8073794624"
tokenIconÍcone a ser exibido ao lado do rastreador de tokens ao coletar tokens."rbxassetid://8073794477"
tokenTrackerPositionSmallDevicePosição da IU do rastreador de tokens em dispositivos pequenos, como telefones (UDim2).(1, 0, 0, 84)
tokenTrackerPositionLargeDevicePosição da IU do rastreador de tokens em dispositivos maiores, como tablets e PC (UDim2).(1, 0, 1, -16)
useRegionsEm vez de tokens, use regiões.false

Modais

ChaveDescriçãoPadrão
modal.backgroundColorCor de fundo dos modais (Datatype. Color3).[0, 0, 0]
modal.fontFonte do texto que aparece em um modal (Enum. Font).GothamMedium
modal.textColorCor do texto que aparece em um modal (Datatype. Color3).[255, 255, 255]
modal.textSizeTamanho do texto que aparece em um modal.16
useCustomModalsQuando marcado como verdadeiro, os modais padrão não são exibidos. Isso permite que você mostre modais personalizados, conforme descrito em Interface gráfica personalizada.false
useCustomTokenTrackerQuando marcado como verdadeiro, o rastreador de tokens padrão não é exibido. Isso permite que você mostre uma interface gráfica de rastreador de tokens personalizada como alternativa.false

Feixe de navegação

ChaveDescriçãoPadrão
showNavigationBeamQuando marcado como verdadeiro, um Class. Beam do jogador para o token mais próximo será mostrado.true
navigationBeam.colorDatatype. ColorSequence definindo a cor do feixe em seus segmentos. Consulte Class. Beam. Color para obter detalhes.[255, 255, 255] → [255, 255, 255]
navigationBeam.curveSize0Posição do primeiro ponto de controle na forma de Bézier do feixe. Consulte Class. Beam. CurveSize0 para obter mais informações.0
navigationBeam.curveSize1Posição do segundo ponto de controle na forma de Bézier do feixe. Consulte Class. Beam. CurveSize1 para obter mais informações.0
navigationBeam.faceCameraSe os segmentos do feixe estarão ou não sempre voltados para a câmera, independentemente de sua orientação. Consulte Class. Beam. FaceCamera para obter detalhes.true
navigationBeam.lightEmissionGrau de mistura das cores do feixe com as cores por trás dele. Consulte Class. Beam. LightEmission para obter detalhes.0
navigationBeam.lightInfluenceGrau de influência da iluminação do ambiente no feixe. Consulte Class. Beam. LightInfluence para obter detalhes.0
navigationBeam.segmentsQuantos segmentos retos compõem o feixe.10
navigationBeam.textureID de ativo da textura a ser exibida no feixe."rbxassetid://8081777495"
navigationBeam.textureLengthComprimento da textura do feixe, dependendo da configuração para navigationBeam.textureMode. Consulte Class. Beam. TextureLength para obter detalhes.1
navigationBeam.textureModeManeira pela qual a textura do feixe é dimensionada e repetida (Enum.</td> <td>Wrap`
navigationBeam.textureSpeedVelocidade na qual a imagem da textura se move ao longo do feixe.1
navigationBeam.transparencyDatatype. NumberSequence definindo a transparência do feixe em seus segmentos. Consulte Class. Beam. Transparency para obter detalhes.(0, 0) → (0.15, 1) → (1, 1)
navigationBeam.width0Largura do feixe em sua base, em rebites.1
navigationBeam.width1Largura do feixe na sua extremidade, em rebites.1
navigationBeam.zOffsetDistância, em rebites, pela qual a exibição do feixe é deslocada em relação à câmera.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

Substitui as opções de configuração do servidor por meio das seguintes chaves-valor na tabela config. Esta função só poder ser chamada de um Class. Script.

ChaveDescriçãoPadrão
tokenTagMarcador usado por Class. CollectionService para encontrar todos os tokens ou regiões usadas na caça ao tesouro."ScavengerHuntPart"
datastoreNameNome do Class. DataStore usado pela caça ao tesouro para armazenar o progresso da coleção de cada jogador."ScavengerHuntTokens"
resetOnPlayerRemovingQuando marcado como verdadeiro, redefine o progresso do usuário quando ele sai da experiência; conveniente para não salvar o progresso enquanto a caça ao tesouro é testada.false
Script

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

disable

disable():nil

Esconde toda a IU da caça ao tesouro, desconecta todos os ouvintes de eventos de entrada e impede que os jogadores de coletem tokens ou interajam com regiões. Esta função só poder ser chamada de um Class. Script.

Script

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

enable

enable():nil

Mostra toda a IU da caça ao tesouro, conecta todos os ouvintes de eventos de entrada e permite que os jogadores coletem tokens e interajam com regiões. Esta função só poder ser chamada de um Class. Script.

Script

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

Eventos

collected

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

É acionado quando um jogador colide com um token ou entra em uma região. A função conectada receberá Player que colidiu com o token ou entrou na região e o nome do token que foi colidido ou a região que foi entrada. O evento só pode ser conectado a um Class. Script.

Parâmetros
jogador: Class. PlayerUsuário que colidiu com um token ou entrou em uma região.
itemName: string Nome do token que recebeu a colisão ou da região que foi acessada.
totalCollected: numberNúmero total de tokens coletados pelo usuário, representado por player.
Script

Caça ao tesouro

allCollected

allCollected(player:Class. Player): RBXScriptSignal

É acionado quando um jogador coleta todos os tokens ou entra em todas as regiões na caça ao tesouro. A função conectada receberá o Class. Player que coletou todos os tokens e só é acionada uma vez por jogador. O evento só pode ser conectado a um Class. Script.

Parâmetros
jogador: Class. PlayerJogador que coletou todos os tokens ou entrou em todas as regiões.
Script

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

showInfoModal

showInfoModal(): RBXScriptSignal

É acionado quando o jogador clica no rastreador de tokens enquanto a opção de configuração useCustomModals está definida como verdadeira. O evento só pode ser conectado a um Class. LocalScript.

LocalScript

showCompleteModal

showCompleteModal(): RBXScriptSignal

É acionado quando o jogador clica no rastreador de tokens enquanto a opção de configuração useCustomModals está definida como true e o jogador já coletou todos os tokens na caça ao tesouro. O evento só pode ser conectado a um Class. LocalScript.

LocalScript

Retornos de chamada

hideOtherGuis

hideOtherGuis(callback:function)

Esse retorno de chamada é executado imediatamente antes de um modal ser exibido, permitindo que você desabilite Class. ScreenGui|ScreenGuis por completo ou elementos de dentro antes que o modal seja mostrado. Consulte Visibilidade da interface gráfica para obter detalhes e códigos de exemplo.

showOtherGuis

showOtherGuis(callback:function)

Esse retorno de chamada é exibido imediatamente após um modal ser descartado, permitindo que você habilite Class. ScreenGui|ScreenGuis por completo ou elementos de dentro. Consulte Visibilidade da interface gráfica para obter detalhes e códigos de exemplo.