Thêm Scripts

*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 vào một cùng! Bây giờ bạn đã tạo ra các thành phần hàng dọc và hàng ngang, bạn sẽ thêm ba kịch bản mẫu. Các kịch bản này quản lý hướng dẫn bằng cách nói các thành phần khi nào làm gì. Ví dụ, các kịch bản sẽ tạo

Lưu trữ Beam và Particles

Trước khi thêm các script, thanh và hạt cần được di chuyển đến nơi các script sẽ có thể sao chép chúng nếu cần thiết.

  1. Trong ReplicatedStorage , tạo một thư mục mới có tên 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 TutorialParticles . Di chuyển hạt nổ ra khỏi TestPlayer vào thư mục đó.

  3. Một khi bóng hình và hạt nhân emitter được di chuyển, bạn không cần TestPlayer nữa. Xóa TestPlayer vì script sẽ hoạt động với những người chơi thực sự khi kết thúc.

Tạo Sự Kiện

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

  1. Trong ReplicatedStorage > PlayerTutorial, tạo hai RemoteEvent đối tượng. Đặt tên cho chúng NextGoal và TutorialEnd.

Thêm vào Scripts

Ba script được đề xuất dưới đây sẽ tìm kiếm các thể emitter hạt và thành phần hình ảnh đã 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 là TutorialManager .

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


    local TutorialManager = {}
    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    local tutorialFolder = ReplicatedStorage:WaitForChild("PlayerTutorial")
    local TutorialEndEvent = tutorialFolder:WaitForChild("TutorialEnd")
    local NextGoalEvent = tutorialFolder:WaitForChild("NextGoal")
    -- Các bộ phận mục tiêu phải được đặt hàng trong bảng, hoặc 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")
    -- Nơi đựng mã cho mục đích khác. Ví dụ: nếu bạn muốn gửi tin nhắn đến máy chủ để làm 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 mức độ Goal 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 độ của người chơi trong hướng dẫn Goals
    function TutorialManager.setupPlayerProgress(player)
    local currentGoalProgress = Instance.new("IntValue")
    currentGoalProgress.Name = "GoalProgress"
    currentGoalProgress.Value = 1
    currentGoalProgress.Parent = player
    end
    return TutorialManager

    Các bảng thành này thực hiện mã để quản lý tiến trình của một 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 các mục tiêu hoặc những gì xảy ra khi hướng dẫn kết thúc.

  2. Trong ServerScriptService , tạo một Script mới có tên là TutorialParticles .

    Vui lòng nhậ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 kèm theo 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à kết dính với 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)

    Cuộn văn này chơi vỏ hạt nhân tạo 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 đổi tên là EMIT_RATE để xác định số lượng các hạt nhân tạo trong một cuộc tương tác.

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

    Sau đó, dán mã này. Mã này tạo và quản lý hành vi đượ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.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. Chơi dự án để kiểm tra các script. Di chuyển từ gian hàng này đến gian hàng kia, sử dụng tính năng tương tác để xem có phải lập trình mã nào không.

Mẹo dịch vụ

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

  • Vào ServerStorage > Hạt giống Hướng Dẫn > Phát nổ. Kiểm tra Đã bật để bị tắt. Vấn đề : Cảnh báo trong máy tính như một "vụ thu hoạch vô tận".

  • Vì script đang tìm các đối tượng cụ thể ở một số vị trí nhất định, có thể một phần sẽ được gọi sai. Xem lại lần nữa rằng tên và vị trí của mỗi phần trong trò chơi trùng với hướng dẫn.

Lợi ích và Giới hạn của Ngôn ngữ

Nếu bạn đang sử dụng hệ thống hướng dẫn này trong kinh nghiệm của bạn, hãy nhớ đ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 script khác. Ví ví dụ / trường hợp, bạn có thể trao cho người chơi một món đồ đặc biệt khi sự kiện này bắt đầu.
  • Các hạt liên quan tương tác với nhau như một phần của hành động. Bạn có thể thêm nhiều hạt hơn vào ServerStorage/TutorialParticles để có hiệu ứng phức tạp hơn. Giới hạn
  • Sự tiến bộ 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 lập trình một cách nào đó để lưu tiến bộ đó. Để hướng dẫn, xem bài viết: Lưu dữ liệu.