Menambahkan Skrip

*Konten ini diterjemahkan menggunakan AI (Beta) dan mungkin mengandung kesalahan. Untuk melihat halaman ini dalam bahasa Inggris, klik di sini.

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.

  1. Di ReplicatedStorage , buat sub-folder baru bernama PlayerTutorial . Pindahkan TutorialBeam keluar dari TestPlayer, dan ke sub-folder baru.

  2. Di ServerStorage , buat folder bernama TutorialParticles . Pindahkan partikel Burst ke dalam TestPlayer ke folder itu.

  3. 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 .

  1. 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.

  1. 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 berbeda
    local goalParts = {
    workspace.TutorialGoals.GoalPart1,
    workspace.TutorialGoals.GoalPart2
    }
    local function checkTutorialEnd(player, goalParts)
    local currentIndex = player:WaitForChild("GoalProgress")
    return currentIndex.Value >= #goalParts
    end
    local 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 lain
    end
    function TutorialManager.interactGoal(player)
    NextGoalEvent:FireServer()
    end
    function TutorialManager.getTutorialGoals()
    return goalParts
    end
    function TutorialManager.nextGoal(player, goalParts)
    if checkTutorialEnd(player, goalParts) then
    finishTutorial(player)
    else
    -- Meningkatkan pelacak Goal pemain
    local currentGoalIndex = player:WaitForChild("GoalProgress")
    currentGoalIndex.Value += 1
    end
    end
    -- Menciptakan nilai int untuk melacak kemajuan pemain lokal melalui Goal Tutorial
    function TutorialManager.setupPlayerProgress(player)
    local currentGoalProgress = Instance.new("IntValue")
    currentGoalProgress.Name = "GoalProgress"
    currentGoalProgress.Value = 1
    currentGoalProgress.Parent = player
    end
    return TutorialManager

    Skrip 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.

  2. 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 = 50
    local 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 partikel
    for _, particle in particleAttachment:GetChildren() do
    if particle:IsA("ParticleEmitter") then
    particle:Emit(EMIT_RATE)
    end
    end
    end
    local 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 pemain
    for _, emitter in ServerStorage.TutorialParticles:GetChildren() do
    emitter:Clone().Parent = playerParticleAttachment
    end
    end)
    end
    Players.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.

  3. 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.LocalPlayer
    local goalParts = TutorialManager.getTutorialGoals()
    local playerBeam = nil
    local goalIndex = nil
    local function getTargetAttachment()
    local currentTarget = goalParts[goalIndex.Value]
    local interactionPart = currentTarget:FindFirstChild("InteractionPart")
    local attachment = interactionPart and interactionPart:FindFirstChildOfClass("Attachment")
    if not attachment then
    attachment = Instance.new("Attachment")
    attachment.Name = "BeamAttachment"
    attachment.Parent = currentTarget
    end
    return attachment
    end
    local function updateBeamTarget()
    playerBeam = player.Character.HumanoidRootPart:FindFirstChildOfClass("Beam")
    local targetBeamAttachment = getTargetAttachment()
    if targetBeamAttachment then
    playerBeam.Attachment1 = targetBeamAttachment
    else
    warn("Attachment not found in a goal. Check that goals have attachments or they're included under the InteractionPart")
    end
    end
    local function setupGoals()
    for _, part in goalParts do
    local interactionPart = part:FindFirstChild("InteractionPart")
    local proximityPrompt = interactionPart and interactionPart:FindFirstChild("ProximityPrompt")
    if proximityPrompt then
    proximityPrompt.Triggered:Connect(function(player)
    proximityPrompt.Enabled = false
    TutorialManager.nextGoal(player, goalParts)
    TutorialManager.interactGoal(player)
    end)
    else
    warn("Proximity prompt not included in goal. Add one to each goal part under the InteractionPart")
    end
    end
    end
    local function createBeamForCharacter(character)
    local humanoidRootPart = character:WaitForChild("HumanoidRootPart")
    local playerBeamAttachment = Instance.new("Attachment")
    local beamTemplate = tutorialFolder:WaitForChild("TutorialBeam")
    if not beamTemplate then
    warn("Tutorial Beam not found in ReplicatedStorage")
    end
    playerBeamAttachment.Name = "BeamAttachment"
    playerBeamAttachment.Parent = humanoidRootPart
    local targetBeamAttachment = getTargetAttachment()
    playerBeam = beamTemplate:Clone()
    playerBeam.Attachment0 = playerBeamAttachment
    playerBeam.Attachment1 = targetBeamAttachment
    playerBeam.Parent = humanoidRootPart
    playerBeam.Enabled = true
    end
    local function setupPlayer()
    setupGoals()
    TutorialManager.setupPlayerProgress(player)
    goalIndex = player:WaitForChild("GoalProgress")
    player.CharacterAdded:Connect(createBeamForCharacter)
    if player.Character then
    createBeamForCharacter(player.Character)
    end
    end
    setupPlayer()
    goalIndex.Changed:Connect(updateBeamTarget)
  4. 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.