Zeit, all diese Arbeit zusammenzubringen! Jetzt, da du die Strahl- und Partikelkomponenten erstellt hast, fügst du drei vorgefertigte Skripte hinzu.Diese Skripte verwalten das Tutorial, indem sie Komponenten sagen, wann sie was tun sollen.Zum Beispiel erzeugen die Skripte Strahlen für neue Spieler und emittieren Partikel, wenn sie mit Zielen interagieren.
Strahl und Partikel speichern
Bevor die Skripte hinzugefügt werden, müssen der Strahl und die Partikel an einen Ort verschoben werden, an dem die Skripte Kopien von ihnen erstellen können, wie es erforderlich ist.
In ReplicatedStorage , erstelle einen neuen Ordner mit dem Namen PlayerTutorial . Verschiebe den Tutorial-Strahl aus dem Testplayer in den neuen Ordner.
In ServerStorage erstellen Sie einen Ordner mit dem Namen TutorialParticles .Bewegen Sie die Ausbruch -Partikel aus dem TestPlayer in diesen Ordner.
Sobald der Strahl- und Partikelstrahler bewegt wurde, brauchst du den TestPlayer nicht mehr. Löschen TestPlayer, da das Skript bei Beendigung mit echten Spielern arbeiten wird.
Erstelle Ereignisse
Jedes Mal, wenn Spieler mit einem Ziel interagieren, muss das Tutorial-Skript wissen, um den Fortschritt dieses Spieler:inzu aktualisieren und den Partikeleffekt zu emittieren.Um Skripte zu informieren, können Signale mit Ereignissen verschickt werden.
In ReplicatedStorage > PlayerTutorial erstellen Sie zwei Remote-Ereignis -Objekte. Benennen Sie sie NextGoal und TutorialEnd .
Füge die Skripte hinzu
Die drei Skripte unten suchen nach dem PartikelEmitter und den Beam-Objekten, die zuvor erstellt wurden, und verwalten das Tutorial-System.
In ReplicatedStorage > PlayerTutorial > erstelle ein neues Modulskript mit dem Namen TutorialManager .
Ersetzen Sie den Standardcode durch Kopieren und Einfügen des gesamten Codes unten.
local TutorialManager = {}local ReplicatedStorage = game:GetService("ReplicatedStorage")local tutorialFolder = ReplicatedStorage:WaitForChild("PlayerTutorial")local TutorialEndEvent = tutorialFolder:WaitForChild("TutorialEnd")local NextGoalEvent = tutorialFolder:WaitForChild("NextGoal")-- Beachten Sie, dass Zielteile in der Tabelle bestellt werden müssen, sonst kann die Zielbestellung im Spiel unterschiedlich seinlocal 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")-- Platzhalter für weiteren Codes. Z. B. wenn du Nachrichten an den Server senden möchtest, um andere Aufgaben auszuführenendfunction TutorialManager.interactGoal(player)NextGoalEvent:FireServer()endfunction TutorialManager.getTutorialGoals()return goalPartsendfunction TutorialManager.nextGoal(player, goalParts)if checkTutorialEnd(player, goalParts) thenfinishTutorial(player)else-- Erhöhe den Zieltracker des Spieler:inlocal currentGoalIndex = player:WaitForChild("GoalProgress")currentGoalIndex.Value += 1endend-- Erstellt einen int-Wert, um den Fortschritt des Spieler:indurch die Tutorial-Ziele lokal zu verfolgenfunction TutorialManager.setupPlayerProgress(player)local currentGoalProgress = Instance.new("IntValue")currentGoalProgress.Name = "GoalProgress"currentGoalProgress.Value = 1currentGoalProgress.Parent = playerendreturn TutorialManagerDieses Skript führt Code aus, um den Fortschritt eines Spieler:inim Tutorial zu verwalten.Dazu gehören Aufgaben wie der Ausführung von Code zum Interagieren mit Zielen oder was passiert, wenn das Tutorial beendet ist.
In ServerScriptService erstellen Sie ein neues Skript mit dem Namen TutorialParticles .
Füge den Code unten ein.
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")-- Gehe durch Partikel auf dem Anhang und spiele sie entsprechend der Art des Partikels abfor _, 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-- Klone Partikel im Ordner, auch wenn es mehr als eine gibt und sie dem Spieler:inbeigefügt werdenfor _, emitter in ServerStorage.TutorialParticles:GetChildren() doemitter:Clone().Parent = playerParticleAttachmentendend)endPlayers.PlayerAdded:Connect(setupPlayerParticles)NextGoalEvent.OnServerEvent:Connect(playParticleBurst)Dieses Skript spielt die Explosionspartikel ab, wenn Spieler mit Zielen interagieren.Es gibt auch eine Variable namens EMIT_RATE, die festlegt, wie viele Partikel während einer Interaktion entstehen.
In StarterPlayer > StarterPlayerScripts erstellen Sie ein neues Lokales Skript mit dem Namen Tutorialskript .
Dann füge das Skript unten ein. Dieses Skript erstellt und verwaltet den Strahl, der Spieler führt.
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)Spiele das Projekt ab, um die Skripte zu testen. Wechsle von Stand zu Stand, indem du die Interaktionsfunktion verwendest, um zu sehen, ob der Code funktioniert.
Problemlösungstipps
Problem : Partikel spielen, wenn das Spiel beginnt.
Gehe in ServerStorage > Tutorial-Partikel > Explosion. Überprüfe Deaktiviert, um auszusteigen. Problem : Warnungen im Kompilator wie eine "unendliche Ausgabe".
Da das Skript nach bestimmten Objekten an bestimmten Orten sucht, ist es möglich, dass ein Teil falsch benannt wird.Überprüfe, ob der Name und die Lage jedes Teils im Spiel dem Tutorial entsprechen.
Skriptvorteile und Einschränkungen
Wenn du dieses Tutorial-System in deiner Erlebnisverwendest, denke daran, gefolgte Profile: Vorteile
- Ereignisse wie TutorialEnd können verwendet werden, um andere Skripte auszulösen. Zum Instanzkannst du den Spielern ein spezielles Element vergeben, wenn dieses Ereignis ausgelöst wird.
- Das TutorialParticles-Skript kann mehrere Partikel gleichzeitig spielen.Du kannst mehr Partikel in ServerStorage/TutorialParticles hinzufügen, um komplexere Effekte zu erzielen. Einschränkungen
- Der Spielerfortschritt im Tutorial ist nicht dauerhaft, was bedeutet, dass du einen Weg finden musst, diesen Fortschritt zu speichern.Für Anleitungen siehe den Artikel: Daten speichern.