Zeit, all diese Arbeit zusammenzubringen! Jetzt, da du die Strahl- und Partikelelemente erstellt hast, fügst du drei vordefinierte Skripte hinzu. Diese Skripte verwalten das Tutorial, indem sie Komponenten sagen, wann sie tun, was zu tun ist. Zum Beispiel erstellen die Skripte Balken für neue Spieler und emittieren Partikel, wenn sie mit Zielen interagieren.
Strahlen und Partikel speichern
Before adding the scripts, the beam and particles need to be moved to where the scripts will be able to make copies of them as needed.
In ReplicatedStorage erstellen Sie einen neuen Ordner namens PlayerTutorial . Verschieben Sie TutorialBeam aus TestPlayer und in den neuen Ordner.
In ServerStorage erstellen Sie einen Ordner namens TutorialParticles . Verschieben Sie die Burst -Partikel aus TestPlayer in diesen Ordner.
Sobald der Strahl- und Partikel-Emitter bewegt ist, brauchst du nicht mehr den TestPlayer. Löschen TestPlayer, da das Skript mit echten Spielern abgeschlossen ist, wenn es fertig ist.
Ereignisse erstellen
Jedes Mal, wenn Spieler mit einem Ziel interagieren, muss der Tutorial-Skript wissen, damit es den Fortschritt dieses Spieler:inaktualisieren und den Partikeleffekt emittieren kann. Um Skripte zu informieren, können Signale mit Ereignissen gesendet werden.
In ReplicatedStorage > PlayerTutorial erstellen Sie zwei RemoteEvent -Objekte. Benennen Sie sie NextGoal und TutorialEnd .
Die Skripte hinzufügen
Die drei Skripte unten suchen nach den Partikel-Emitter und -Objekten, die früher erstellt wurden, und verwalten das Tutorial-System.
In ReplicatedStorage > PlayerTutorial > erstellen Sie ein neues ModuleScript mit dem Namen TutorialManager .
Ersetzen Sie den Standardcode, indem Sie den gesamten Code unten kopieren und einfügen.
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, oder Goalteile können im Spiel anders 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 weitere Codes. Z. B. Wenn Sie Nachrichten an den Server senden möchten, 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öhen Sie den Zielverfolgungs-Inkrement des Spieler:inlocal currentGoalIndex = player:WaitForChild("GoalProgress")currentGoalIndex.Value += 1endend-- Erstellt einen int-Wert, um den Fortschritt des Spieler:inlokal durch die Zielvorgaben des Tutorials zu verfolgenfunction TutorialManager.setupPlayerProgress(player)local currentGoalProgress = Instance.new("IntValue")currentGoalProgress.Name = "GoalProgress"currentGoalProgress.Value = 1currentGoalProgress.Parent = playerendreturn TutorialManagerDieses Skript führt Codes aus, um den Fortschritt eines Spieler:inim Tutorial zu verwalten. Dies beinhaltet Aufgaben wie das Ausführen von Code für das Interagieren mit Zielen oder das, was passiert, wenn das Tutorial abgeschlossen ist.
In ServerScriptService erstellen Sie ein neues Skript mit dem Namen TutorialParticles .
Fügen Sie 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 die Partikel auf der Anbaut und spiele sie entsprechend der Partikelartfor _, 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-- Klonen Sie Partikel in der Ordner, auch wenn es mehr als ein Teil ist, und fügen Sie ihn dem Spieler:infor _, emitter in ServerStorage.TutorialParticles:GetChildren() doemitter:Clone().Parent = playerParticleAttachmentendend)endPlayers.PlayerAdded:Connect(setupPlayerParticles)NextGoalEvent.OnServerEvent:Connect(playParticleBurst)Dieses Skript spielt die Platsparte, wenn Spieler mit Zielen interagieren. Es gibt auch eine Variable namens EMIT_RATE, die bestimmt, wie viele Partikel während einer Interaktion entstehen.
In StarterPlayer > StarterPlayerScripts, erstellen Sie ein neues LocalScript mit dem Namen TutorialScript .
Dann fügen Sie das Skript unten ein. Dieses Skript erstellt und verwaltet den Strahl, der verwendet wird, um die Spieler zu führen.
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.Parent = humanoidRootPartplayerBeam.Enabled = trueendlocal 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, um die Skripte zu testen. Bewegen Sie sich von Booth zu Booth, verwenden Sie die Interaktionsfunktion, um zu sehen, ob der Code funktioniert.
Troubleshooting-Tipps
Problem : Partikel spielen, wenn das Spiel beginnt.
Gehe in ServerStorage > Tutorial Particles > Burst. Überprüfen Sie, dass "Deaktiviert" ausist, um es zu deaktivieren. Problem: : Warnungen im Compiler wie "unendliches Ergebnis".
Da das Skript bestimmte Objekte an bestimmten Orten sucht, ist es möglich, dass ein Teil unzureichend benannt ist. Überprüfen Sie, dass der Name und die Lage jedes Teils im Spiel mit dem Tutorial übereinstimmt.
Skriptvorteile und -Einschränkungen
Wenn du dieses Tutorial-System in deiner Erlebnisverwendest, denke daran: Vorteile
- Ereignisse wie TutorialEnd können verwendet werden, um andere Skripte auszulösen. Zum Instanzkönnen Sie Spielern einen speziellen Gegenstand geben, wenn dieses Ereignis ausgelöst wird.
- Das TutorialParticles-Skript kann mehrere Partikel gleichzeitig spielen. Sie können mehr Partikel in ServerStorage/TutorialParticles hinzufügen, um komplexere Effekte zu erstellen. Einschränkungen
- Spielerfortschritt im Tutorial ist nicht dauerhaft, was bedeutet, dass Sie einige Möglichkeiten haben, diesen Fortschritt zu speichern. Für Richtlinien, siehe den Artikel: Saving Data.