Saatnya mengumpulkan semua pekerjaan ini! Sekarang Anda telah membuat komponen balok dan partikel, Anda akan menambahkan tiga skrip pra-buat.Skrip ini mengelola tutorial dengan memberi tahu komponen kapan melakukan apa.Sebagai contoh, skrip akan membuat balok untuk pemain baru dan memancarkan partikel setiap kali mereka berinteraksi dengan gol.
Simpan balok dan partikel
Sebelum menambahkan skrip, balok dan partikel perlu dipindahkan ke tempat di mana skrip dapat membuat salinan dari mereka sebagaimana diperlukan.
Di ReplicatedStorage , buat folder baru bernama PlayerTutorial . Pindahkan TutorialBeam keluar dari TestPlayer, dan ke dalam folder baru.
Di ServerStorage , buat folder bernama Partikel Tutorial .Pindahkan partikel Meledak keluar dari TestPlayer ke folder itu.
Setelah beam dan emitor partikel dipindahkan, Anda tidak lagi membutuhkan TestPlayer. Hapus TestPlayer karena skrip akan bekerja dengan pemain nyata saat selesai.
Buat acara
Setiap kali pemain berinteraksi dengan gol, skrip tutorial harus tahu agar dapat memperbarui kemajuan pemain itu dan mengeluarkan efek partikel.Untuk memberi tahu skrip, sinyal dapat dikirim menggunakan peristiwa .
Di ReplicatedStorage > PlayerTutorial, buat dua objek Acara Jarak Jauh . Namakan mereka Tujuan Berikutnya dan Akhir Tutorial .
Tambahkan skrip
Tiga skrip di bawah ini akan mencari emitor partikel dan objek balok yang dibuat sebelumnya dan mengelola sistem tutorial.
Di ReplicatedStorage > PlayerTutorial > buat ModulSkrip 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")-- Bagian Tujuan harus diperintahkan di meja, atau Tujuan pesanan mungkin berbeda dalam gamelocal 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")-- Penanda untuk kode lebih lanjut. 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-- Tingkatkan pelacak gol pemainlocal currentGoalIndex = player:WaitForChild("GoalProgress")currentGoalIndex.Value += 1endend-- Membuat nilai int untuk melacak kemajuan pemain secara lokal melalui Tujuan tutorialfunction TutorialManager.setupPlayerProgress(player)local currentGoalProgress = Instance.new("IntValue")currentGoalProgress.Name = "GoalProgress"currentGoalProgress.Value = 1currentGoalProgress.Parent = playerendreturn TutorialManagerSkrip ini menjalankan kode untuk mengelola kemajuan pemain dalam tutorial.Ini termasuk tugas seperti menjalankan kode untuk berinteraksi dengan tujuan, atau apa yang terjadi saat tutorial selesai.
Di ServerScriptService , buat Skrip baru bernama Partikel Tutorial .
Tempelkan 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 sesuai dengan 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 lampirkan ke pemainfor _, emitter in ServerStorage.TutorialParticles:GetChildren() doemitter:Clone().Parent = playerParticleAttachmentendend)endPlayers.PlayerAdded:Connect(setupPlayerParticles)NextGoalEvent.OnServerEvent:Connect(playParticleBurst)Skrip ini memainkan partikel ledakan setiap kali pemain berinteraksi dengan gol.Ada juga variabel bernama EMIT_RATE yang menentukan berapa banyak partikel muncul selama interaksi.
Di StarterPlayer > StarterPlayerScripts, buat Skrip Lokal baru bernama Skrip Tutorial .
Kemudian, tempelkan skrip di bawah ini. Skrip ini membuat dan mengelola balok yang digunakan untuk memandu 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.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)Mainkan proyek untuk menguji skrip. Pindah dari stan ke stan, menggunakan fitur interaksi untuk melihat apakah kode berfungsi.
Tip pemecahan masalah
Masalah : Partikel bermain saat permainan dimulai.
Masuk ke ServerStorage > Partikel Tutorial > Meledak. Periksa Dinonaktifkan agar mati. Masalah : Peringatan dalam kompiler seperti "pengembalian tak terbatas".
Karena skrip mencari objek tertentu di lokasi tertentu, kemungkinan bagian disebutkan dengan nama yang salah.Periksa dua kali bahwa nama dan lokasi setiap bagian dalam game cocok dengan tutorial.
Manfaat dan batasan skrip
Jika Anda menggunakan sistem tutorial ini dalam pengalaman Anda, ingatlah hal mengikuti: Manfaat
- Peristiwa seperti TutorialEnd dapat digunakan untuk memicu skrip lain. kejadian, Anda dapat memberikan hadiah khusus kepada pemain saat peristiwa ini terjadi.
- Skrip TutorialParticles dapat memainkan beberapa partikel sekaligus.Anda dapat menambahkan lebih banyak partikel di ServerStorage/TutorialParticles untuk efek yang lebih kompleks. Batasan
- Kemajuan pemain dalam tutorial tidak bertahan, artinya Anda harus mengkodekan beberapa cara untuk menyimpan kemajuan itu.Untuk panduan, lihat artikel: Menyimpan Data.