Thêm các kịch bản

*Nội dung này được dịch bằng AI (Beta) và có thể có lỗi. Để xem trang này bằng tiếng Anh, hãy nhấp vào đây.

Đã đến lúc mang tất cả công việc này lại với nhau! Bây giờ bạn đã tạo ra các thành phần chùm và hạt, bạn sẽ thêm vào ba kịch bản được tạo sẵn.Các kịch bản này quản lý hướng dẫn bằng cách cho thành phần biết khi nào nên làm gì.Ví dụ, các kịch bản sẽ tạo chùm tia cho người chơi mới và phát ra các hạt mỗi khi họ tương tác với mục tiêu.

Lưu trữ chùm và hạt

Trước khi thêm các kịch bản, chùm và hạt cần được di chuyển đến nơi các kịch bản có thể tạo bản sao của chúng theo yêu cầu.

  1. Trong ReplicatedStorage , tạo một thư mục mới có tên là PlayerTutorial . Di chuyển TutorialBeam ra khỏi TestPlayer, và vào thư mục mới.

  2. Trong ServerStorage , tạo một thư mục có tên là TutorialParticles .Di chuyển hạt Nổ ra khỏi TestPlayer vào thư mục đó.

  3. Khi chùm và hạt phát xạ được di chuyển, bạn không còn cần đến TestPlayer. Xóa TestPlayer kể từ khi kịch bản sẽ hoạt động với người chơi thực khi hoàn thành.

Tạo sự kiện

Mỗi khi người chơi tương tác với một mục tiêu, kịch bản hướng dẫn sẽ cần phải biết để có thể cập nhật tiến trình của người chơi đó và phát ra hiệu ứng hạt.Để thông báo các kịch bản, tín hiệu có thể được gửi bằng cách sử dụng sự kiện .

  1. Trong ReplicatedStorage > PlayerTutorial, tạo hai đối tượng Sự kiện từ xa . Hãy đặt tên cho chúng là NextGoalTutorialEnd .

Thêm các kịch bản

Các kịch bản ba bên dưới sẽ tìm kiếm các hạt phát và vật thể chùm được tạo trước đó và quản lý hệ thống hướng dẫn.

  1. Trong ReplicatedStorage > PlayerTutorial > tạo một mới ModuleScript có tên TutorialManager .

    Thay thế mã mặc định bằng cách sao chép và dán toàn bộ mã bên dưới.


    local TutorialManager = {}
    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    local tutorialFolder = ReplicatedStorage:WaitForChild("PlayerTutorial")
    local TutorialEndEvent = tutorialFolder:WaitForChild("TutorialEnd")
    local NextGoalEvent = tutorialFolder:WaitForChild("NextGoal")
    -- Các phần mục tiêu phải được đặt hàng trong bảng, nếu không thì lệnh mục tiêu có thể khác nhau trong trò chơi
    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")
    -- Chỗ trống cho mã tiếp theo. Ví dụ: nếu bạn muốn gửi tin nhắn đến máy chủ để thực hiện các nhiệm vụ khác
    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
    -- Tăng trình theo dõi mục tiêu của người chơi
    local currentGoalIndex = player:WaitForChild("GoalProgress")
    currentGoalIndex.Value += 1
    end
    end
    -- Tạo một giá trị int để theo dõi tiến trình của người chơi thông qua các mục tiêu hướng dẫn
    function TutorialManager.setupPlayerProgress(player)
    local currentGoalProgress = Instance.new("IntValue")
    currentGoalProgress.Name = "GoalProgress"
    currentGoalProgress.Value = 1
    currentGoalProgress.Parent = player
    end
    return TutorialManager

    Tập lệnh này chạy mã để quản lý tiến trình của người chơi trong hướng dẫn.Điều này bao gồm các nhiệm vụ như chạy mã để tương tác với mục tiêu, hoặc xảy ra điều gì khi hướng dẫn kết thúc.

  2. Trong ServerScriptService , tạo một Tập lệnh mới có tên TutorialParticles .

    Sao chép mã bên dưới.


    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")
    -- Đi qua các hạt trên phụ lục và chơi chúng theo loại hạt
    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
    -- Nhân bản các hạt trong thư mục, ngay cả khi có nhiều hơn một và gắn vào người chơi
    for _, emitter in ServerStorage.TutorialParticles:GetChildren() do
    emitter:Clone().Parent = playerParticleAttachment
    end
    end)
    end
    Players.PlayerAdded:Connect(setupPlayerParticles)
    NextGoalEvent.OnServerEvent:Connect(playParticleBurst)

    Tập lệnh này phát các hạt nổ mỗi khi người chơi tương tác với các mục tiêu.Cũng có một biến có tên là EMIT_RATE để xác định số lượng hạt xuất hiện trong quá trình tương tác.

  3. Trong StarterPlayer > StarterPlayerScripts, tạo một LocalScript mới có tên là TutorialScript .

    Sau đó, dán mã bên dưới. Các mã này tạo và quản lý chùm tia được sử dụng để hướng dẫn người chơi.


    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. Chơi dự án để kiểm tra các kịch bản. Di chuyển từ gian hàng này sang gian hàng khác, sử dụng tính năng tương tác để xem liệu mã có hoạt động không.

Mẹo khắc phục sự cố

Vấn đề : Hạt chơi khi trò chơi bắt đầu.

  • Vào ServerStorage > Hạt hướng dẫn > Nổ. Kiểm tra Tắt để tắt. Vấn đề : Cảnh báo trong biên dịch viên như "sản lượng vô hạn".

  • Bởi vì kịch bản đang tìm kiếm các đối tượng cụ thể ở một số vị trí nhất định, có thể một phần được đặt tên sai.Kiểm tra lại xem tên và vị trí của mỗi phần trong trò chơi phù hợp với hướng dẫn.

Lợi ích và giới hạn của kịch bản

Nếu bạn đang sử dụng hệ thống hướng dẫn này trong trải nghiệm của mình, hãy nhớ những điều theo dõi: Lợi ích

  • Các sự kiện như TutorialEnd có thể được sử dụng để kích hoạt các kịch bản khác. Ví ví dụ / trường hợp, bạn có thể trao cho người chơi một vật phẩm đặc biệt khi sự kiện này xảy ra.
  • Tập lệnh TutorialParticles có thể chơi nhiều hạt cùng một lúc.Bạn có thể thêm nhiều hạt cảnh trong ServerStorage/TutorialParticles để có được các hiệu ứng phức tạp hơn. Giới hạn
  • Tiến trình của người chơi trong hướng dẫn không bền vững, có nghĩa là bạn sẽ phải viết mã một cách lưu trữ tiến trình đó.Đối với hướng dẫn, xem bài viết: Lưu dữ liệu.