Il est temps de rassembler tout ce travail ! Maintenant que vous avez créé les composants de faisceau et de particule, vous ajouterez trois scripts prédéfinis. Ces scripts gèrent le tutoriel en informant les composants quand faire quoi. Par exemple, les scripts créeront des faisceaux pour les nouveaux joueurs et émettront des particules chaque fois qu'ils interagissent avec des buts.
Stockage des rayons et des particules
Avant d'ajouter les scripts, le faisceau et les particules doivent être déplacées là où les scripts pourront faire des copies si nécessaire.
Dans ReplicatedStorage , créez un nouveau dossier nommé PlayerTutorial . Déplacez le TutorialBeam à partir de TestPlayer, et dans le nouveau dossier.
Dans ServerStorage , créez un dossier nommé TutorialParticles . Déplacez la particule de Burst dans ce dossier.
Une fois que l'émetteur de faisceau et de particules est déplacé, vous n'avez plus besoin du TestPlayer. Supprimer TestPlayer car le script fonctionnera avec des joueurs réels lorsque vous aurez terminé.
Créer des événements
Chaque fois qu'un joueur interagit avec un but, le script de tutoriel doit savoir pour qu'il puisse mettre à jour la progression de ce joueur et émettre l'effet de particule. Pour informer les scripts, les signaux peuvent être envoyés en utilisant événements .
Dans ReplicatedStorage > PlayerTutorial, créez deux objets RemoteEvent. Noms-les NextGoal et TutorialEnd.
Ajouter les scripts
Les trois scripts ci-dessous rechercheront l'objet d'émission de particules et le rayon d'objet créés plus tôt et géreront le système de tutoriel.
Dans ReplicatedStorage > PlayerTutorial > créez un nouveau ModuleScript nommé TutorialManager .
Remplacez le code par défaut en copiant et en collant le code entier ci-dessous.
local TutorialManager = {}local ReplicatedStorage = game:GetService("ReplicatedStorage")local tutorialFolder = ReplicatedStorage:WaitForChild("PlayerTutorial")local TutorialEndEvent = tutorialFolder:WaitForChild("TutorialEnd")local NextGoalEvent = tutorialFolder:WaitForChild("NextGoal")-- Les parties de but doivent être commandées dans le tableau, ou bien l'ordre du but peut être différent dans le jeulocal 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")-- Espace réservé pour le code suivant. Par exemple, si vous souhaitez envoyer des messages au serveur pour exécuter d'autres tâchesendfunction TutorialManager.interactGoal(player)NextGoalEvent:FireServer()endfunction TutorialManager.getTutorialGoals()return goalPartsendfunction TutorialManager.nextGoal(player, goalParts)if checkTutorialEnd(player, goalParts) thenfinishTutorial(player)else-- Augmenter le traceur de but du joueurlocal currentGoalIndex = player:WaitForChild("GoalProgress")currentGoalIndex.Value += 1endend-- Crée une valeur int pour suivre localement la progression du joueur à travers les buts du tutorielfunction TutorialManager.setupPlayerProgress(player)local currentGoalProgress = Instance.new("IntValue")currentGoalProgress.Name = "GoalProgress"currentGoalProgress.Value = 1currentGoalProgress.Parent = playerendreturn TutorialManagerCe script exécute du code pour gérer la progression d'un joueur dans le tutoriel. Cela inclut des tâches comme exécuter du code pour interagir avec des buts, ou ce qui se passe quand le tutoriel est terminé.
Dans ServerScriptService , créez un nouveau Script nommé TutorialParticles .
Collez le code ci-dessous.
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")-- Passez par les particules sur l'attribut et jouez-y selon le type de particulefor _, 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-- Clonez des particules dans le dossier, même si il y en a plus d'un et attachez-les au joueurfor _, emitter in ServerStorage.TutorialParticles:GetChildren() doemitter:Clone().Parent = playerParticleAttachmentendend)endPlayers.PlayerAdded:Connect(setupPlayerParticles)NextGoalEvent.OnServerEvent:Connect(playParticleBurst)Ce script joue la particule d'éclat chaque fois que les joueurs interagissent avec des buts. Il y a également une variable nommée EMIT_RATE qui détermine le nombre de particules générées pendant une interaction.
Dans StarterPlayer > StarterPlayerScripts, créez un nouveau LocalScript nommé TutorialScript .
Ensuite, collez le script ci-dessous. Ce script crée et gère le faisceau utilisé pour guider les joueurs.
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)Jouez le projet pour tester les scripts. Déplacez-vous du stand à l'autre, en utilisant la fonction d'interaction pour voir si le code fonctionne.
Conseils de débogage
Problème : Les particules jouent quand le jeu démarre.
Allez dans ServerStorage > Particles de tutoriel > Explosion. Vérifiez qu'il est activé pour être off. Problème : Avertissements dans le compilateur tels qu'un "rendu infini".
Comme le script recherche des objets spécifiques à certains endroits, il est possible qu'une partie soit nommée incorrectement. Vérifiez deux fois que le nom et l'emplacement de chaque partie dans le jeu correspondent au tutoriel.
Avantages et limites des scripts
Si vous utilisez ce système de tutoriel dans votre expérience, tenez compte des points suivre: Avantages
- Des événements tels que TutorialEnd peuvent être utilisés pour déclencher d'autres scripts. Par instance, vous pouvez attribuer des joueurs un élément spécial lorsque cet événement se déclenche.
- Le script TutorialParticles peut jouer plusieurs particules à la fois. Vous pouvez ajouter plus de particules dans ServerStorage/TutorialParticles pour des effets plus complexes. Limiteurs
- La progression du joueur dans le tutoriel n'est pas persistante, ce qui signifie que vous devrez codez une façon de sauvegarder cette progression. Pour plus de conseils, consultez l'article : Enregistrement des données.