Hora de reunir todo esse trabalho! Agora que você criou os componentes de feixe e de partícula, você adicionará três scripts pré-feitos.Esses scripts gerenciam o tutorial dizendo aos componentes quando fazer o que.Por exemplo, os scripts criarão feixes para novos jogadores e emitirão partículas sempre que interagirem com os golos.
Armazenar feixe e partículas
Antes de adicionar os scripts, o feixe e as partículas precisam ser movidos para onde os scripts poderão fazer cópias deles conforme necessário.
Em ReplicatedStorage , crie uma nova pasta chamada PlayerTutorial . Remova o TutorialBeam do TestPlayer e mova-o para a nova pasta.
Em Armazenamento do Servidor , crie uma pasta chamada Partículas de Tutorial .Mova a partícula Explosão para fora do TestPlayer para esse diretório.
Uma vez que o emissor de feixe e partículas é movido, você não precisa mais do TestPlayer. Excluir TestPlayer já que o script funcionará com jogadores reais quando terminado.
Criar eventos
Cada vez que os jogadores interagem com um gol, o script de tutorial precisará saber para que possa atualizar o progresso desse jogador e emitir o efeito de partículas.Para informar scripts, sinais podem ser enviados usando eventos .
No ReplicatedStorage > PlayerTutorial, crie dois objetos Evento Remoto . Chame-os de Próximo Objetivo e Fim do Tutorial .
Adicione os scripts
Os três scripts abaixo procurarão o emissor de partículas e os objetos de feixe criados anteriormente e gerenciarão o sistema de tutorial.
No ReplicatedStorage > PlayerTutorial > crie um novo ModuleScript chamado TutorialManager .
Substitua o código padrão copiando e colando todo o código abaixo.
local TutorialManager = {}local ReplicatedStorage = game:GetService("ReplicatedStorage")local tutorialFolder = ReplicatedStorage:WaitForChild("PlayerTutorial")local TutorialEndEvent = tutorialFolder:WaitForChild("TutorialEnd")local NextGoalEvent = tutorialFolder:WaitForChild("NextGoal")-- As partes do objetivo devem ser solicitadas na tabela, caso contrário, a ordem do objetivo pode ser diferente no jogolocal goalParts = {workspace.TutorialGoals.GoalPart1,workspace.TutorialGoals.GoalPart2}local function checkTutorialEnd(player, goalParts)local currentIndex = player:WaitForChild("GoalProgress")return currentIndex.Value >= #goalPartsendlocal function finishTutorial(player)local playerBeam = player.Character.HumanoidRootPart:FindFirstChildOfClass("Beam")playerBeam:Destroy()print(player.Name .. " finished the tutorial")-- Espaço reservado para mais código. E.g. se você quiser enviar mensagens para o servidor para fazer outras tarefasendfunction TutorialManager.interactGoal(player)NextGoalEvent:FireServer()endfunction TutorialManager.getTutorialGoals()return goalPartsendfunction TutorialManager.nextGoal(player, goalParts)if checkTutorialEnd(player, goalParts) thenfinishTutorial(player)else-- Incrementar o rastreador de objetivos do jogadorlocal currentGoalIndex = player:WaitForChild("GoalProgress")currentGoalIndex.Value += 1endend-- Cria um valor de int para rastrear localmente o progresso do jogador através dos Objetivos do tutorialfunction TutorialManager.setupPlayerProgress(player)local currentGoalProgress = Instance.new("IntValue")currentGoalProgress.Name = "GoalProgress"currentGoalProgress.Value = 1currentGoalProgress.Parent = playerendreturn TutorialManagerEste script executa código para gerenciar o progresso de um jogador no Tutorial.Isso inclui tarefas como executar código para interagir com metas ou o que acontece quando o tutorial termina.
Em Serviço de Script de Servidor , crie um novo Script chamado Partículas de Tutorial .
Cole o código abaixo.
local Players = game:GetService("Players")local ReplicatedStorage = game:GetService("ReplicatedStorage")local ServerStorage = game:GetService("ServerStorage")local tutorialFolder = ReplicatedStorage:WaitForChild("PlayerTutorial")local NextGoalEvent = tutorialFolder:WaitForChild("NextGoal")local EMIT_RATE = 50local function playParticleBurst(player)local character = player.Character or player.CharacterAdded:Wait()local humanoidRootPart = character:WaitForChild("HumanoidRootPart")local particleAttachment = humanoidRootPart:WaitForChild("ParticleAttachment")-- Passe pelas partículas no anexo e toque-as de acordo com o tipo de partículafor _, particle in particleAttachment:GetChildren() doif particle:IsA("ParticleEmitter") thenparticle:Emit(EMIT_RATE)endendendlocal function setupPlayerParticles(player)player.CharacterAdded:Connect(function(character)local humanoidRootPart = character:WaitForChild("HumanoidRootPart")local playerParticleAttachment = Instance.new("Attachment")playerParticleAttachment.Name = "ParticleAttachment"playerParticleAttachment.Parent = humanoidRootPart-- Clone particulas na pasta, mesmo que haja mais de uma e anexe ao jogadorfor _, emitter in ServerStorage.TutorialParticles:GetChildren() doemitter:Clone().Parent = playerParticleAttachmentendend)endPlayers.PlayerAdded:Connect(setupPlayerParticles)NextGoalEvent.OnServerEvent:Connect(playParticleBurst)Este script joga a partícula de explosão sempre que os jogadores interagem com os golos.Há também uma variável chamada EMIT_RATE que determina quantos particípulos aparecem durante uma interação.
No StarterPlayer > StarterPlayerScripts, crie um novo LocalScript chamado TutorialScript .
Então, cole o script abaixo. Este script cria e gerencia o feixe usado para guiar os jogadores.
local Players = game:GetService("Players")local ReplicatedStorage = game:GetService("ReplicatedStorage")local tutorialFolder = ReplicatedStorage:WaitForChild("PlayerTutorial")local TutorialManager = require(tutorialFolder:WaitForChild("TutorialManager"))local TutorialEndEvent = tutorialFolder:WaitForChild("TutorialEnd")local player = Players.LocalPlayerlocal goalParts = TutorialManager.getTutorialGoals()local playerBeam = nillocal goalIndex = nillocal function getTargetAttachment()local currentTarget = goalParts[goalIndex.Value]local interactionPart = currentTarget:FindFirstChild("InteractionPart")local attachment = interactionPart and interactionPart:FindFirstChildOfClass("Attachment")if not attachment thenattachment = Instance.new("Attachment")attachment.Name = "BeamAttachment"attachment.Parent = currentTargetendreturn attachmentendlocal function updateBeamTarget()playerBeam = player.Character.HumanoidRootPart:FindFirstChildOfClass("Beam")local targetBeamAttachment = getTargetAttachment()if targetBeamAttachment thenplayerBeam.Attachment1 = targetBeamAttachmentelsewarn("Attachment not found in a goal. Check that goals have attachments or they're included under the InteractionPart")endendlocal function setupGoals()for _, part in goalParts dolocal interactionPart = part:FindFirstChild("InteractionPart")local proximityPrompt = interactionPart and interactionPart:FindFirstChild("ProximityPrompt")if proximityPrompt thenproximityPrompt.Triggered:Connect(function(player)proximityPrompt.Enabled = falseTutorialManager.nextGoal(player, goalParts)TutorialManager.interactGoal(player)end)elsewarn("Proximity prompt not included in goal. Add one to each goal part under the InteractionPart")endendendlocal function createBeamForCharacter(character)local humanoidRootPart = character:WaitForChild("HumanoidRootPart")local playerBeamAttachment = Instance.new("Attachment")local beamTemplate = tutorialFolder:WaitForChild("TutorialBeam")if not beamTemplate thenwarn("Tutorial Beam not found in ReplicatedStorage")endplayerBeamAttachment.Name = "BeamAttachment"playerBeamAttachment.Parent = humanoidRootPartlocal targetBeamAttachment = getTargetAttachment()playerBeam = beamTemplate:Clone()playerBeam.Attachment0 = playerBeamAttachmentplayerBeam.Attachment1 = targetBeamAttachmentplayerBeam.Enabled = trueplayerBeam.Parent = humanoidRootPartendlocal function setupPlayer()setupGoals()TutorialManager.setupPlayerProgress(player)goalIndex = player:WaitForChild("GoalProgress")player.CharacterAdded:Connect(createBeamForCharacter)if player.Character thencreateBeamForCharacter(player.Character)endendsetupPlayer()goalIndex.Changed:Connect(updateBeamTarget)Jogue o projeto para testar os scripts. Mova-se de cabine para cabine, usando a função de interação para ver se o código funciona.
Dicas de solução de problemas
Problema : Partículas são jogadas quando o jogo começa.
Vá para Armazenamento de Servidor > Partículas Tutoriais > Explosão. Verifique Desativado para estar desligado. Problema : Avisos no compilador, como um "rendimento infinito".
Como o script está procurando objetos específicos em determinados locais, é possível que uma parte seja chamada de forma incorreta.Verifique duas vezes se o nome e a localização de cada parte no jogo correspondem ao Tutorial.
Benefícios e limitações de scripts
Se você estiver usando esse sistema de tutorial na sua experiência, tenha em mente o seguindo: Benefícios
- Eventos como TutorialEnd podem ser usados para acionar outros scripts. Por instância, você pode conceder aos jogadores um item especial quando este evento for disparado.
- O script TutorialParticles pode reproduzir múltiplas partículas de uma vez.Você pode adicionar mais partículas no ServerStorage/TutorialParticles para efeitos mais complexos. Limitações
- O progresso do jogador no tutorial não é persistente, o que significa que você terá que codificar alguma maneira de salvar esse progresso.Para orientação, veja o artigo: Salvando Dados.