스크립트 추가

*이 콘텐츠는 AI(베타)를 사용해 번역되었으며, 오류가 있을 수 있습니다. 이 페이지를 영어로 보려면 여기를 클릭하세요.

이 모든 작업을 하나로 결합할 때입니다! 이제 빔과 입자 구성 요소를 만든 후 3가지 미리 만들기 스크립트를 추가합니다. 이 스크립트는 튜토리얼을 관리하여 구성 요소가 언제 무엇을 할지 알려줍니다. 예를 들어, 스크립트는 새로운 플레이어를 위해 빔을 생성하고 목표와 상호 작용

빔과 입자 저장

스크립트를 추가하기 전에 빔과 입자는 스크립트가 필요할 때 복사할 수 있는 위치로 이동해야 합니다.

  1. In ReplicatedStorage , create a new folder named PlayerTutorial . Move TutorialBeam out of TestPlayer, and into the new folder.

  2. In ServerStorage , create a folder named TutorialParticles . Move the Burst particle out of TestPlayer into that folder.

  3. 빔과 입자 생성기가 이동된 후 테스트 플레이어가 더 이상 필요 없습니다. 삭제 테스트 플레이어는 스크립트가 완료되면 실제 플레이어와 작동하므로 필요 없습니다.

이벤트 생성

플레이어가 목표와 상호 작용할 때마다 튜토리얼 스크립트는 플레이어의 진행 상황을 업데이트하고 입자 효과를 발생시킬 수 있어야 합니다. 플레이어에게 알리려면 이벤트 를 사용할 수 있습니다.

  1. In ReplicatedStorage > PlayerTutorial에서 두 개의 RemoteEvent 개체를 생성합니다. 이름을 NextGoalTutorialEnd 입니다.

스크립트 추가

아래에 있는 세 개의 스크립트는 이전에 생성된 입자 방출기 및 빔 개체를 검색하고 튜토리얼 시스템을 관리합니다.

  1. ReplicatedStorage > PlayerTutorial > 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
    -- 튜토리얼 목표를 통해 플레이어의 진행 상황을 로컬에서 추적하는 값을 만듭니다.
    function TutorialManager.setupPlayerProgress(player)
    local currentGoalProgress = Instance.new("IntValue")
    currentGoalProgress.Name = "GoalProgress"
    currentGoalProgress.Value = 1
    currentGoalProgress.Parent = player
    end
    return TutorialManager

    이 스크립트는 튜토리얼에서 플레이어의 진행 상황을 관리하는 코드를 실행합니다. 여기에는 대상과 상호 작용하는 코드를 실행하거나 튜토리얼이 끝나면 무슨 일이 일어나는지 등이 포함됩니다.

  2. In 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. In StarterPlayer > StarterPlayerScripts, create a new 로컬 스크립트 named 튜토리얼 스크립트 .

    그런 다음 아래 스크립트를 붙여 넣습니다. 이 스크립트는 플레이어를 가이드하는 빔을 만듭니다.


    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로 이동합니다. Enabled를 끄기활성화를 확인하십시오. 문제 : 컴파일러에서 농도 경고, 즉 "무한 생산"을 표시합니다.

  • 스크립트는 특정 위치에서 특정 개체를 검색하기 때문에 부품의 이름이 잘못 되었을 수 있습니다. 각 부품의 이름과 위치가 게임의 튜토리얼과 일치하는지 확인하십시오.

스크립트 이점과 제한

경험에서 이 튜토리얼 시스템을 사용하는 경우 팔로잉명심하십시오. 혜택

  • TutorialEnd와 같은 이벤트는 다른 스크립트를 트리거할 수 있습니다. 예를 인스턴스, 이 이벤트가 발생했을 때 플레이어에게 특별 아이템을 수여할 수 있습니다.
  • TutorialParticles 스크립트는 여러 입자를 한 번에 플레이할 수 있습니다. ServerStorage/TutorialParticles에 더 많은 입자를 추가하여 더 복잡한 효과를 만들 수 있습니다. 제한
  • 튜토리얼에서 플레이어의 진행 상황은 지속되지 않습니다. 즉, 해당 진행 상황을 저장하는 방법을 코드해야 합니다. 가이드는 문서 를 참조하십시오. 데이터 저장.