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.
W ReplicatedStorage , utwórz nową kategorię o nazwie PlayerTutorial . Przenieś TutorialBeam z TestPlayer do nowej kategorii.
W ServerStorage , utwórz katalog o nazwie TutorialParticles .Przenieś cząstkę Wybuchu z TestPlayer do tego folderu.
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ń .
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.
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 grzelocal 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")-- Miejsce na dalszy kod. Na przykład, jeśli chcesz wysłać wiadomości na serwer, aby wykonać inne zadaniaendfunction TutorialManager.interactGoal(player)NextGoalEvent:FireServer()endfunction TutorialManager.getTutorialGoals()return goalPartsendfunction TutorialManager.nextGoal(player, goalParts)if checkTutorialEnd(player, goalParts) thenfinishTutorial(player)else-- Zwiększ śledzik celów graczalocal currentGoalIndex = player:WaitForChild("GoalProgress")currentGoalIndex.Value += 1endend-- Tworzy wartość int do śledzenia lokalnego postępu gracza poprzez cele samouczkafunction TutorialManager.setupPlayerProgress(player)local currentGoalProgress = Instance.new("IntValue")currentGoalProgress.Name = "GoalProgress"currentGoalProgress.Value = 1currentGoalProgress.Parent = playerendreturn TutorialManagerTen 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.
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 = 50local 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ąstkifor _, 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-- Klonuj cząstki w folderze, nawet jeśli jest ich więcej niż jedna i przypisz do graczafor _, emitter in ServerStorage.TutorialParticles:GetChildren() doemitter:Clone().Parent = playerParticleAttachmentendend)endPlayers.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.
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.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)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.