Tambahkan skrip

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

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.

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

  2. Di ServerStorage , buat folder bernama Partikel Tutorial .Pindahkan partikel Meledak keluar dari TestPlayer ke folder itu.

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

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

  1. 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 game
    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")
    -- Penanda untuk kode lebih lanjut. 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
    -- Tingkatkan pelacak gol pemain
    local currentGoalIndex = player:WaitForChild("GoalProgress")
    currentGoalIndex.Value += 1
    end
    end
    -- Membuat nilai int untuk melacak kemajuan pemain secara lokal melalui Tujuan tutorial
    function TutorialManager.setupPlayerProgress(player)
    local currentGoalProgress = Instance.new("IntValue")
    currentGoalProgress.Name = "GoalProgress"
    currentGoalProgress.Value = 1
    currentGoalProgress.Parent = player
    end
    return TutorialManager

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

  2. 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 = 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 sesuai dengan 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 lampirkan ke 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 ledakan setiap kali pemain berinteraksi dengan gol.Ada juga variabel bernama EMIT_RATE yang menentukan berapa banyak partikel muncul selama interaksi.

  3. 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.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.Enabled = true
    playerBeam.Parent = humanoidRootPart
    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.

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.