Adicionar scripts

*Este conteúdo é traduzido por IA (Beta) e pode conter erros. Para ver a página em inglês, clique aqui.

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.

  1. Em ReplicatedStorage , crie uma nova pasta chamada PlayerTutorial . Remova o TutorialBeam do TestPlayer e mova-o para a nova pasta.

  2. 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.

  3. 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 .

  1. 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.

  1. 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 jogo
    local goalParts = {
    workspace.TutorialGoals.GoalPart1,
    workspace.TutorialGoals.GoalPart2
    }
    local function checkTutorialEnd(player, goalParts)
    local currentIndex = player:WaitForChild("GoalProgress")
    return currentIndex.Value >= #goalParts
    end
    local 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 tarefas
    end
    function TutorialManager.interactGoal(player)
    NextGoalEvent:FireServer()
    end
    function TutorialManager.getTutorialGoals()
    return goalParts
    end
    function TutorialManager.nextGoal(player, goalParts)
    if checkTutorialEnd(player, goalParts) then
    finishTutorial(player)
    else
    -- Incrementar o rastreador de objetivos do jogador
    local currentGoalIndex = player:WaitForChild("GoalProgress")
    currentGoalIndex.Value += 1
    end
    end
    -- Cria um valor de int para rastrear localmente o progresso do jogador através dos Objetivos do tutorial
    function TutorialManager.setupPlayerProgress(player)
    local currentGoalProgress = Instance.new("IntValue")
    currentGoalProgress.Name = "GoalProgress"
    currentGoalProgress.Value = 1
    currentGoalProgress.Parent = player
    end
    return TutorialManager

    Este 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.

  2. 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 = 50
    local 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ícula
    for _, particle in particleAttachment:GetChildren() do
    if particle:IsA("ParticleEmitter") then
    particle:Emit(EMIT_RATE)
    end
    end
    end
    local 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 jogador
    for _, emitter in ServerStorage.TutorialParticles:GetChildren() do
    emitter:Clone().Parent = playerParticleAttachment
    end
    end)
    end
    Players.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.

  3. 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.LocalPlayer
    local goalParts = TutorialManager.getTutorialGoals()
    local playerBeam = nil
    local goalIndex = nil
    local function getTargetAttachment()
    local currentTarget = goalParts[goalIndex.Value]
    local interactionPart = currentTarget:FindFirstChild("InteractionPart")
    local attachment = interactionPart and interactionPart:FindFirstChildOfClass("Attachment")
    if not attachment then
    attachment = Instance.new("Attachment")
    attachment.Name = "BeamAttachment"
    attachment.Parent = currentTarget
    end
    return attachment
    end
    local function updateBeamTarget()
    playerBeam = player.Character.HumanoidRootPart:FindFirstChildOfClass("Beam")
    local targetBeamAttachment = getTargetAttachment()
    if targetBeamAttachment then
    playerBeam.Attachment1 = targetBeamAttachment
    else
    warn("Attachment not found in a goal. Check that goals have attachments or they're included under the InteractionPart")
    end
    end
    local function setupGoals()
    for _, part in goalParts do
    local interactionPart = part:FindFirstChild("InteractionPart")
    local proximityPrompt = interactionPart and interactionPart:FindFirstChild("ProximityPrompt")
    if proximityPrompt then
    proximityPrompt.Triggered:Connect(function(player)
    proximityPrompt.Enabled = false
    TutorialManager.nextGoal(player, goalParts)
    TutorialManager.interactGoal(player)
    end)
    else
    warn("Proximity prompt not included in goal. Add one to each goal part under the InteractionPart")
    end
    end
    end
    local function createBeamForCharacter(character)
    local humanoidRootPart = character:WaitForChild("HumanoidRootPart")
    local playerBeamAttachment = Instance.new("Attachment")
    local beamTemplate = tutorialFolder:WaitForChild("TutorialBeam")
    if not beamTemplate then
    warn("Tutorial Beam not found in ReplicatedStorage")
    end
    playerBeamAttachment.Name = "BeamAttachment"
    playerBeamAttachment.Parent = humanoidRootPart
    local targetBeamAttachment = getTargetAttachment()
    playerBeam = beamTemplate:Clone()
    playerBeam.Attachment0 = playerBeamAttachment
    playerBeam.Attachment1 = targetBeamAttachment
    playerBeam.Enabled = true
    playerBeam.Parent = humanoidRootPart
    end
    local function setupPlayer()
    setupGoals()
    TutorialManager.setupPlayerProgress(player)
    goalIndex = player:WaitForChild("GoalProgress")
    player.CharacterAdded:Connect(createBeamForCharacter)
    if player.Character then
    createBeamForCharacter(player.Character)
    end
    end
    setupPlayer()
    goalIndex.Changed:Connect(updateBeamTarget)
  4. 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.