เพิ่มสคริปต์

*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่

ถึงเวลาที่จะรวบรวมงานทั้งหมดนี้แล้ว! ตอนนี้ที่คุณได้สร้างส่วนประกอบลําแสงและอนุภาคแล้ว คุณจะเพิ่มสคริปต์ที่สร้างไว้ล่วงหน้าสามรายการสคริปต์เหล่านี้จัดการบทแนะนำโดยบอกส่วนประกอบว่าจะทำอะไรเมื่อใดตัวอย่างเช่น สคริปต์จะสร้างลําแสงสําหรับผู้เล่นใหม่และปล่อยอนุภาคเมื่อพวกเขาโต้ตอบกับเป้าหมาย

เก็บลําแสงและอนุภาค

ก่อนที่จะเพิ่มสคริปต์ ลำแสงและอนุภาคจะต้องย้ายไปที่ที่สคริปต์จะสามารถสร้างสำเนาได้ตามต้องการ

  1. ใน ReplicatedStorage สร้างโฟลเดอร์ใหม่ชื่อ PlayerTutorial ย้าย TutorialBeam ออกจาก TestPlayer และเข้าสู่โฟลเดอร์ใหม่

  2. ใน พื้นที่เก็บของเซิร์ฟเวอร์ สร้างโฟลเดอร์ชื่อ TutorialParticles ย้ายอนุภาค ระเบิด ออกจาก TestPlayer ไปยังโฟลเดอร์นั้น

  3. เมื่อลำแสงและตัวปล่อยอนุภาคถูกย้ายแล้ว คุณไม่ต้องใช้ TestPlayer อีกต่อไป ลบ ผู้เล่นทดสอบเพราะสคริปต์จะทำงานร่วมกับผู้เล่นจริงเมื่อเสร็จสิ้น

สร้างเหตุการณ์

ทุกครั้งที่ผู้เล่นโต้ตอบกับเป้าหมาย สคริปต์การสอนจะต้องรู้เพื่อที่จะอัปเดตความคืบหน้าของผู้เล่นนั้นและปล่อยผลกระทบของอนุภาคเพื่อแจ้งให้สคริปต์ทราบ สัญญาณสามารถส่งโดยใช้เหตุการณ์ ****

  1. ใน ReplicatedStorage > PlayerTutorial สร้างวัตถุ RemoteEvent สองวัตถุ ชื่อว่า NextGoal และ TutorialEnd

เพิ่มสคริปต์

สคริปต์สามต่อไปนี้จะค้นหาตัวปล่อยอนุภาคและวัตถุลําแสงที่สร้างไว้ก่อนหน้านี้และจัดการระบบการสอนใช้

  1. ใน ReplicatedStorage > PlayerTutorial > สร้างโมดูลใหม่ ModuleScript ชื่อ TutorialManager

    แทนที่โค้ดเริ่มต้นโดยการคัดลอกและวางโค้ดทั้งหมดด้านล่าง


    local TutorialManager = {}
    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    local tutorialFolder = ReplicatedStorage:WaitForChild("PlayerTutorial")
    local TutorialEndEvent = tutorialFolder:WaitForChild("TutorialEnd")
    local NextGoalEvent = tutorialFolder:WaitForChild("NextGoal")
    -- ส่วนเป้าหมายต้องสั่งในตาราง หรืออาจมีคำสั่งซื้อเป้าหมายแตกต่างกันในเกม
    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")
    -- ชั่วคราวสําหรับโค้ดต่อไป เช่น รหัส
    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
    -- เพิ่มตัวติดตามเป้าหมายของผู้เล่น
    local currentGoalIndex = player:WaitForChild("GoalProgress")
    currentGoalIndex.Value += 1
    end
    end
    -- สร้างค่า int เพื่อติดตามความคืบหน้าของผู้เล่นท้องถิ่นผ่านเป้าหมายการสอนใช้งาน
    function TutorialManager.setupPlayerProgress(player)
    local currentGoalProgress = Instance.new("IntValue")
    currentGoalProgress.Name = "GoalProgress"
    currentGoalProgress.Value = 1
    currentGoalProgress.Parent = player
    end
    return TutorialManager

    สคริปต์นี้รันโค้ดสำหรับการจัดการความคืบหน้าของผู้เล่นในบทแนะนำการใช้งานซึ่งรวมถึงภารกิจเช่นการรันโค้ดเพื่อโต้ตอบกับเป้าหมายหรือสิ่งที่เกิดขึ้นเมื่อบทแนะนำสิ้นสุด

  2. ใน ServerScriptService สร้าง สคริปต์ใหม่ ชื่อ TutorialParticles

    ใส่โค้ดด้านล่าง


    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")
    -- ผ่านอนุภาคบนแนบเนียนและเล่นตามประเภทของอนุภาค
    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
    -- โคลนอนอนุภาคในโฟลเดอร์แม้ว่าจะมีมากกว่าหนึ่งและแนบกับผู้เล่น
    for _, emitter in ServerStorage.TutorialParticles:GetChildren() do
    emitter:Clone().Parent = playerParticleAttachment
    end
    end)
    end
    Players.PlayerAdded:Connect(setupPlayerParticles)
    NextGoalEvent.OnServerEvent:Connect(playParticleBurst)

    สคริปต์นี้เล่นอนุภาคระเบิดเมื่อผู้เล่นโต้ตอบกับเป้าหมายทุกครั้งนอกจากนี้ยังมีตัวแปรชื่อ EMIT_RATE ที่กำหนดจำนวนอนุภาคที่เกิดขึ้นระหว่างการโต้ตอบ

  3. ใน StarterPlayer > StarterPlayerScripts สร้าง สคริปต์ท้องถิ่น ใหม่ชื่อ TutorialScript

    จากนั้นให้วางสคริปต์ด้านล่าง สคริปต์นี้จะสร้างและจัดการลําแสงที่ใช้เพื่อนําทางผู้เล่น


    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. เล่นโครงการเพื่อทดสอบสคริปต์ ย้ายจากบูธไปยังบูธโดยใช้คุณลักษณะการโต้ตอบเพื่อดูว่าโค้ดทำงานได้หรือไม่

เคล็ดลับการแก้ปัญหา

ปัญหา : อนุภาคเล่นเมื่อเกมเริ่มต้น

  • ไปที่ ServerStorage > อนุภาคการสอน > ระเบิด ตรวจสอบให้ปิดใช้งาน ปัญหา : คําเตือนในคอมไพเลอร์เช่น "ผลผลิตไม่สิ้นสุด"

  • เนื่องจากสคริปต์กำลังมองหาวัตถุเฉพาะในสถานที่เฉพาะ จึงเป็นไปได้ว่าส่วนหนึ่งจะถูกเรียกชื่อผิดตรวจสอบให้แน่ใจว่าชื่อและตำแหน่งของแต่ละส่วนในเกมตรงกับบทแนะนำการใช้งาน

ประโยชน์และข้อจำกัดของสคริปต์

หากคุณใช้ระบบการสอนนี้ในประสบการณ์ของคุณ กำลังติดตาม: ประโยชน์

  • อีเวนต์เช่น TutorialEnd สามารถใช้เพื่อเรียกใช้สคริปต์อื่นได้ อินสแตนซ์คุณสามารถมอบรางวัลให้กับผู้เล่นไอเทมพิเศษเมื่ออีเวนต์นี้เกิดขึ้น
  • สคริปต์ TutorialParticles สามารถเล่นอนุภาคหลายอนุภาคได้พร้อมกันคุณสามารถเพิ่มอนุภาคเพิ่มเติมใน ServerStorage/TutorialParticles สําหรับผลกระทบที่ซับซ้อนมากขึ้น ข้อจํากัด
  • ความคืบหน้าของผู้เล่นในบทแนะนำการใช้งานไม่ถาวรซึ่งหมายความว่าคุณจะต้องเขียนโค้ดบางวิธีในการบันทึกความคืบหน้านั้นสำหรับคำแนะนำดูบทความ: การบันทึกข้อมูล