添加指令碼

*此內容是使用 AI(Beta 測試版)翻譯,可能含有錯誤。若要以英文檢視此頁面,請按一下這裡

是時候把這些工作帶來一起了!現在你已經創建了光束和粒子部件,你將添加三個預製指令。這些指令會管理教學,告訴部件何時做什麼。舉例來說,這些指令會創建新玩家的光束並在他們與目標交互時發出粒子。

存儲光束和粒子

在添加腳本之前,光束和粒子需要移動到可以讓腳本複製的位置。

  1. ReplicatedStorage 中,創建名為 PlayerTutorial 的新資料夾。將 TutorialBeam 從 TestPlayer 移動到新資料夾。

  2. ServerStorage 中,創建名為 TutorialParticles 的文件夾。將 Burst 粒子從 TestPlayer 移動到此文件夾。

  3. 光束和粒子 emitter 移動後,您不再需要 TestPlayer。 刪除 TestPlayer,因為它會在結束時與真實玩家一起工作。

創建事件

每次玩家與目標互動時,教學指令碼需要知道,才能更新該玩家的進度並發出粒子效果。要向指令碼發送信號的方式,可以使用 事件

  1. 在 ReplicatedStorage > PlayerTutorial 中,創建兩個 RemoteEvent 對象。名稱它們 下一個目標結束教學

添加指令碼

下面的三個指令碼將尋找創建於以前的粒子發射器和光束對象,並管理教學系統。

  1. 在 ReplicatedStorage > PlayerTutorial > 建立新名為 TutorialManagerModuleScript

    將預設代碼替換為複製並粘貼下方的整個代碼。


    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 值來本地追蹤玩家的進度通過教學 Goals
    function TutorialManager.setupPlayerProgress(player)
    local currentGoalProgress = Instance.new("IntValue")
    currentGoalProgress.Name = "GoalProgress"
    currentGoalProgress.Value = 1
    currentGoalProgress.Parent = player
    end
    return TutorialManager

    這個脚本在教學中執行代碼來管理玩家的進度。這包括執行與目標交互的代碼或教學結束後發生的事件。

  2. ServerScriptService 中,創建名為 TutorialParticles 的新 Script

    請輸入下方的代碼。


    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.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. 播放項目以測試指令碼。 從攤位到攤位移動,使用互動功能來確認程式碼是否運作。

排障提示

發出問題 : 遊戲開始時玩家會發出粒子。

  • 去到 ServerStorage > Tutorial Particles > Burst。 查看啟用即可關閉。 發出錯誤 : 警告在編譯器中,例如 "無限產量"。

  • 因為指定的對象在某些位置尋找,因此有可能發生錯誤。 重新檢查每個部分在遊戲中的名稱和位置與教學相符。

指令碼優勢和限制

如果您在體驗中使用此教學系統,請記住以下幾點: 優惠

  • 像 TutorialEnd 這樣的事件可以用來觸發其他指令碼。 例個體、實例,你可以在這個事件發生時給玩家一個特殊物品。
  • 教學參與者指令碼可以同時播放多個粒子。 您可以在服務器儲存/教學參與者指令碼中添加更多粒子以獲得更複雜的效果。 限制
  • 玩家在教學中的進度不是持續的,這意味著您將需要編寫一些方法來儲存這些進度。 為指南,請參閱文章:儲存資料。