Saatnya untuk menggabungkan semua pekerjaan ini bersama! Sekarang setelah Anda menciptakan komponen balok dan partikel, Anda akan menambahkan tiga skrip prasetel. Skrip-skrip ini mengelola tutorial dengan memberi tahu komponen kapan melakukan apa yang harus dilakukan. Misalnya, skrip akan menciptakan balok untuk pemain baru dan menghasilkan partikel ketika mereka berinteraksi dengan tujuan.
Menyimpan Raya dan Partikel
Sebelum menambahkan skrip, silakan pindahkan beam dan partikel ke tempat di mana skrip dapat dibuat salinan dari mereka jika perlu.
Di ReplicatedStorage , buat sub-folder baru bernama PlayerTutorial . Pindahkan TutorialBeam keluar dari TestPlayer, dan ke sub-folder baru.
Di ServerStorage , buat folder bernama TutorialParticles . Pindahkan partikel Burst ke dalam TestPlayer ke folder itu.
Setelah beam dan particle emitter diangkat, Anda tidak lagi memerlukan TestPlayer karena skrip akan bekerja dengan pemain nyata saat selesai.
Menciptakan Acara
Setiap kali pemain berinteraksi dengan goal, tutorial script akan perlu tahu sehingga itu player's progress dan emit efek partikel. Untuk memberitahu script, sinyal dapat dikirim menggunakan acara .
Di ReplicatedStorage > PlayerTutorial, buat dua objek RemoteEvent . Beri nama mereka NextGoal dan TutorialEnd .
Menambahkan Skrip
Tiga script di bawah ini akan mencari emitter partikel dan objek sinar yang dibuat sebelumnya dan mengelola sistem tutorial.
Di ReplicatedStorage > PlayerTutorial > buat ModuleScript baru bernama TutorialManager .
Ganti kode default dengan menyalin dan menempelkan seluruh kode di bawah ini.
local TutorialManager = {}local ReplicatedStorage = game:GetService("ReplicatedStorage")local tutorialFolder = ReplicatedStorage:WaitForChild("PlayerTutorial")local TutorialEndEvent = tutorialFolder:WaitForChild("TutorialEnd")local NextGoalEvent = tutorialFolder:WaitForChild("NextGoal")-- Catat bagian Tujuan harus dipesan di tabel, atau jika Tujuan dalam game mungkin berbedalocal 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")-- Penghias untuk kode lainnya. Misalnya, jika Anda ingin mengirim pesan ke server untuk melakukan tugas lainendfunction TutorialManager.interactGoal(player)NextGoalEvent:FireServer()endfunction TutorialManager.getTutorialGoals()return goalPartsendfunction TutorialManager.nextGoal(player, goalParts)if checkTutorialEnd(player, goalParts) thenfinishTutorial(player)else-- Meningkatkan pelacak Goal pemainlocal currentGoalIndex = player:WaitForChild("GoalProgress")currentGoalIndex.Value += 1endend-- Menciptakan nilai int untuk melacak kemajuan pemain lokal melalui Goal Tutorialfunction TutorialManager.setupPlayerProgress(player)local currentGoalProgress = Instance.new("IntValue")currentGoalProgress.Name = "GoalProgress"currentGoalProgress.Value = 1currentGoalProgress.Parent = playerendreturn TutorialManagerSkrip ini mengeksekusan kode untuk mengelola kemajuan seorang pemain dalam tutorial. Ini termasuk tugas seperti mengeksekusan kode untuk berinteraksi dengan tujuan, atau apa yang terjadi ketika tutorial selesai.
Dalam ServerScriptService , buat Skrip Baru bernama TutorialParticles .
Tempel kode di bawah ini.
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")-- Pergi melalui partikel pada lampiran dan mainkan mereka sesuai jenis partikelfor _, 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-- Klon partikel di folder, bahkan jika ada lebih dari satu dan menempelkan pada pemainfor _, emitter in ServerStorage.TutorialParticles:GetChildren() doemitter:Clone().Parent = playerParticleAttachmentendend)endPlayers.PlayerAdded:Connect(setupPlayerParticles)NextGoalEvent.OnServerEvent:Connect(playParticleBurst)Skrip ini memainkan partikel burst setiap kali pemain berinteraksi dengan goal. Ada juga variabel bernama EMIT_RATE yang menentukan berapa banyak partikel yang muncul selama interaksi.
Di StarterPlayer > StarterPlayerScripts, buat Skrip Lokal baru bernama TutorialScript .
Kemudian, tempelkan skrip di bawah ini. Skrip ini menciptakan dan mengelola sinar yang digunakan untuk membimbing pemain.
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)Mainkan proyek untuk menguji skrip. Pindah dari stan ke stan, menggunakan fitur interaksi untuk melihat apakah kode berfungsi.
Tips Troubleshoot
Masalah : Partikel bermain saat game dimulai.
Pergi ke ServerStorage > Partikel Tutorial > Burst. Periksa Diaktifkan untuk mati. Masalah : Peringatan dalam kompilator seperti "menghasilkan tanaman tanpa batas".
Karena naskah mencari objek tertentu di lokasi tertentu, mungkin ada bagian yang bernama salah. Periksa dua kali bahwa nama dan lokasi setiap bagian dalam permainan cocok dengan tutorial.
Manfaat dan Kekurangan Skrip
Jika Anda menggunakan sistem tutorial ini dalam pengalaman Anda, ingatlah hal mengikuti: Manfaat
- Acara seperti TutorialEnd dapat digunakan untuk mengaktifkan skrip lain. kejadian, Anda dapat memberi pemain item khusus saat acara ini terjadi.
- Skrip TutorialParticles dapat memainkan banyak partikel sekaligus. Anda dapat menambahkan lebih banyak partikel di ServerStorage/TutorialParticles untuk efek yang lebih kompleks. Terbatasnya
- Kemajuan pemain dalam tutorial tidak bertahan, yang berarti Anda harus menulis beberapa cara menyimpan kemajuan itu. Untuk panduan, lihat artikel: Menyimpan Data.