Dodaj kod

*Ta zawartość została przetłumaczona przy użyciu narzędzi AI (w wersji beta) i może zawierać błędy. Aby wyświetlić tę stronę w języku angielskim, kliknij tutaj.

Czas połączyć całą tę pracę! Teraz, gdy stworzyłeś komponenty promienia i cząstek, dodasz trzy gotowe skrypty.Te skrypty zarządzają samouczkiem, mówiąc komponentom, kiedy zrobić coś.Na przykład skrypty stworzą promienie dla nowych graczy i emitują cząstki za każdym razem, gdy wchodzą w interakcję z golami.

Przechowywanie promieni i cząstek

Zanim doda się skrypty, promień i cząstki muszą zostać przeniesione tam, gdzie skrypty będą mogły tworzyć kopie z nich w razie potrzeby.

  1. W ReplicatedStorage , utwórz nową kategorię o nazwie PlayerTutorial . Przenieś TutorialBeam z TestPlayer do nowej kategorii.

  2. W ServerStorage , utwórz katalog o nazwie TutorialParticles .Przenieś cząstkę Wybuchu z TestPlayer do tego folderu.

  3. Gdy promiennik i emiter cząstek zostaną przeniesione, nie potrzebujesz już TestPlayera. Usuń TestPlayer, ponieważ skrypt będzie działał z prawdziwymi graczami po zakończeniu.

Twórz wydarzenia

Za każdym razem, gdy gracze wchodzą w interakcję z bramką, skrypt samouczka musi to wiedzieć, aby mógł zaktualizować postęp tego gracza i wyemitować efekt cząstek.Aby powiadomić skrypty, sygnały mogą być wysyłane za pomocą wydarzeń .

  1. W ReplicatedStorage > PlayerTutorial stwórz dwa obiekty zdalnego wydarzenia . Nazwij je Następny cel i Koniec szkolenia .

Dodaj kod skryptów

Trzy skrypty poniżej poszukają emitera cząstek i obiektów promieni stworzonych wcześniej i zarządzą systemem samouczka.

  1. W ReplicatedStorage > PlayerTutorial > utwórz nowy ModuleScript o nazwie TutorialManager .

    Zastąp domyślny kod kopiując i wklejając cały kod poniżej.


    local TutorialManager = {}
    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    local tutorialFolder = ReplicatedStorage:WaitForChild("PlayerTutorial")
    local TutorialEndEvent = tutorialFolder:WaitForChild("TutorialEnd")
    local NextGoalEvent = tutorialFolder:WaitForChild("NextGoal")
    -- Cele części celu muszą być zamówione w tabeli, w przeciwnym razie kolejność celu może być inna w grze
    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")
    -- Miejsce na dalszy kod. Na przykład, jeśli chcesz wysłać wiadomości na serwer, aby wykonać inne zadania
    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
    -- Zwiększ śledzik celów gracza
    local currentGoalIndex = player:WaitForChild("GoalProgress")
    currentGoalIndex.Value += 1
    end
    end
    -- Tworzy wartość int do śledzenia lokalnego postępu gracza poprzez cele samouczka
    function TutorialManager.setupPlayerProgress(player)
    local currentGoalProgress = Instance.new("IntValue")
    currentGoalProgress.Name = "GoalProgress"
    currentGoalProgress.Value = 1
    currentGoalProgress.Parent = player
    end
    return TutorialManager

    Ten skrypt wykonuje kod do zarządzania postępem gracza w samouczku.Obejmuje to zadania, takie jak uruchamianie kodu do interakcji z celami lub to, co się dzieje, gdy samouczek się zakończy.

  2. W ServerScriptService , utwórz nowy skrypt o nazwie TutorialParticles .

    Wklej kod poniżej.


    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")
    -- Przejdź przez cząstki na załączniku i odtwarzaj je zgodnie z rodzajem cząstki
    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
    -- Klonuj cząstki w folderze, nawet jeśli jest ich więcej niż jedna i przypisz do gracza
    for _, emitter in ServerStorage.TutorialParticles:GetChildren() do
    emitter:Clone().Parent = playerParticleAttachment
    end
    end)
    end
    Players.PlayerAdded:Connect(setupPlayerParticles)
    NextGoalEvent.OnServerEvent:Connect(playParticleBurst)

    Ten skrypt odtwarza cząstkę przepięć za każdym razem, gdy gracze wchodzą w interakcję z golami.Istnieje również zmienna o nazwie EMIT_RATE, która określa, ile cząstek powstanie podczas interakcji.

  3. W StarterPlayer > StarterPlayerScripts utwórz nowy Lokalny skrypt o nazwie Skrypt samouczka .

    Następnie wklej skrypt poniżej. Skrypt tworzy i zarządza promieniem używanym do prowadzenia graczy.


    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. Odtwórz projekt, aby przetestować skrypty. Przejdź z stoisk na stoisko, korzystając z funkcji interakcji, aby sprawdzić, czy kod działa.

Wskazówki dotyczące rozwiązywania problemów

Problem : Cząstki odtwarzają się, gdy rozpoczyna się gra.

  • Wejdź do ServerStorage > Cząstki samouczka > Wybuch. Sprawdź, czy opcja Włączone jest wyłączone. Problem : Ostrzeżenia w kompilatorze, takie jak "nieskończone wydawanie".

  • Ponieważ skrypt szuka określonych obiektów w określonych lokalizacjach, możliwe jest, że część nazywana jest niepoprawnie.Podweryfikuj, czy nazwa i lokalizacja każdej części w grze pasują do samouczka.

Korzyści i ograniczenia skryptów

Jeśli korzystasz z tego systemu samouczka w swoim doświadczeniu, pamiętaj o obserwuje: Korzyści

  • Wydarzenia takie jak TutorialEnd mogą być używane do uruchamiania innych skryptów. Na instancjamożesz nagrodzić graczy specjalnym przedmiotem, gdy to wydarzenie się wystrzeli.
  • Skrypt TutorialParticles może odtwarzać wiele cząstek na raz.Możesz dodać więcej cząstek w ServerStorage/TutorialParticles dla bardziej złożonych efektów. Ograniczenia
  • Postęp gracza w samouczku nie jest trwały, co oznacza, że musisz kodować sposób zapisania tego postępu.Dla wytycznych zobacz artykuł: Zapisywanie danych.