이 모든 작업을 하나로 결합할 때입니다! 이제 빔과 입자 구성 요소를 만든 후 3가지 미리 만들기 스크립트를 추가합니다. 이 스크립트는 튜토리얼을 관리하여 구성 요소가 언제 무엇을 할지 알려줍니다. 예를 들어, 스크립트는 새로운 플레이어를 위해 빔을 생성하고 목표와 상호 작용
빔과 입자 저장
스크립트를 추가하기 전에 빔과 입자는 스크립트가 필요할 때 복사할 수 있는 위치로 이동해야 합니다.
In ReplicatedStorage , create a new folder named PlayerTutorial . Move TutorialBeam out of TestPlayer, and into the new folder.
In ServerStorage , create a folder named TutorialParticles . Move the Burst particle out of TestPlayer into that folder.
빔과 입자 생성기가 이동된 후 테스트 플레이어가 더 이상 필요 없습니다. 삭제 테스트 플레이어는 스크립트가 완료되면 실제 플레이어와 작동하므로 필요 없습니다.
이벤트 생성
플레이어가 목표와 상호 작용할 때마다 튜토리얼 스크립트는 플레이어의 진행 상황을 업데이트하고 입자 효과를 발생시킬 수 있어야 합니다. 플레이어에게 알리려면 이벤트 를 사용할 수 있습니다.
In ReplicatedStorage > PlayerTutorial에서 두 개의 RemoteEvent 개체를 생성합니다. 이름을 NextGoal 및 TutorialEnd 입니다.
스크립트 추가
아래에 있는 세 개의 스크립트는 이전에 생성된 입자 방출기 및 빔 개체를 검색하고 튜토리얼 시스템을 관리합니다.
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 >= #goalPartsendlocal function finishTutorial(player)local playerBeam = player.Character.HumanoidRootPart:FindFirstChildOfClass("Beam")playerBeam:Destroy()print(player.Name .. " finished the tutorial")-- 다른 코드수행하려면 서버에 메시지를 보내려면 자리 표시자입니다. 예. 서버에 메시지를 보내려면 다른 작업을 수행하려면 자리 표시자입니다.endfunction TutorialManager.interactGoal(player)NextGoalEvent:FireServer()endfunction TutorialManager.getTutorialGoals()return goalPartsendfunction TutorialManager.nextGoal(player, goalParts)if checkTutorialEnd(player, goalParts) thenfinishTutorial(player)else-- 플레이어의 목표 추적기를 증가시킵니다.local currentGoalIndex = player:WaitForChild("GoalProgress")currentGoalIndex.Value += 1endend-- 튜토리얼 목표를 통해 플레이어의 진행 상황을 로컬에서 추적하는 값을 만듭니다.function TutorialManager.setupPlayerProgress(player)local currentGoalProgress = Instance.new("IntValue")currentGoalProgress.Name = "GoalProgress"currentGoalProgress.Value = 1currentGoalProgress.Parent = playerendreturn TutorialManager이 스크립트는 튜토리얼에서 플레이어의 진행 상황을 관리하는 코드를 실행합니다. 여기에는 대상과 상호 작용하는 코드를 실행하거나 튜토리얼이 끝나면 무슨 일이 일어나는지 등이 포함됩니다.
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 = 50local 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() doif particle:IsA("ParticleEmitter") thenparticle:Emit(EMIT_RATE)endendendlocal 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() doemitter:Clone().Parent = playerParticleAttachmentendend)endPlayers.PlayerAdded:Connect(setupPlayerParticles)NextGoalEvent.OnServerEvent:Connect(playParticleBurst)이 스크립트는 플레이어가 목표와 상호 작용할 때마다 폭발 입자를 재생합니다. 또한 상호 작용 동안 발생하는 입자 수를 결정하는 변수 EMIT_RATE가 있습니다.
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.LocalPlayerlocal goalParts = TutorialManager.getTutorialGoals()local playerBeam = nillocal goalIndex = nillocal function getTargetAttachment()local currentTarget = goalParts[goalIndex.Value]local interactionPart = currentTarget:FindFirstChild("InteractionPart")local attachment = interactionPart and interactionPart:FindFirstChildOfClass("Attachment")if not attachment thenattachment = Instance.new("Attachment")attachment.Name = "BeamAttachment"attachment.Parent = currentTargetendreturn attachmentendlocal function updateBeamTarget()playerBeam = player.Character.HumanoidRootPart:FindFirstChildOfClass("Beam")local targetBeamAttachment = getTargetAttachment()if targetBeamAttachment thenplayerBeam.Attachment1 = targetBeamAttachmentelsewarn("Attachment not found in a goal. Check that goals have attachments or they're included under the InteractionPart")endendlocal function setupGoals()for _, part in goalParts dolocal interactionPart = part:FindFirstChild("InteractionPart")local proximityPrompt = interactionPart and interactionPart:FindFirstChild("ProximityPrompt")if proximityPrompt thenproximityPrompt.Triggered:Connect(function(player)proximityPrompt.Enabled = falseTutorialManager.nextGoal(player, goalParts)TutorialManager.interactGoal(player)end)elsewarn("Proximity prompt not included in goal. Add one to each goal part under the InteractionPart")endendendlocal function createBeamForCharacter(character)local humanoidRootPart = character:WaitForChild("HumanoidRootPart")local playerBeamAttachment = Instance.new("Attachment")local beamTemplate = tutorialFolder:WaitForChild("TutorialBeam")if not beamTemplate thenwarn("Tutorial Beam not found in ReplicatedStorage")endplayerBeamAttachment.Name = "BeamAttachment"playerBeamAttachment.Parent = humanoidRootPartlocal targetBeamAttachment = getTargetAttachment()playerBeam = beamTemplate:Clone()playerBeam.Attachment0 = playerBeamAttachmentplayerBeam.Attachment1 = targetBeamAttachmentplayerBeam.Parent = humanoidRootPartplayerBeam.Enabled = trueendlocal function setupPlayer()setupGoals()TutorialManager.setupPlayerProgress(player)goalIndex = player:WaitForChild("GoalProgress")player.CharacterAdded:Connect(createBeamForCharacter)if player.Character thencreateBeamForCharacter(player.Character)endendsetupPlayer()goalIndex.Changed:Connect(updateBeamTarget)프로젝트를 플레이하여 스크립트를 테스트하십시오. 인터랙트 기능을 사용하여 코드가 작동하는지 확인하십시오.
문제 해결 팁
문제 : 게임이 시작될 때 입자가 재생됩니다.
ServerStorage > Tutorial Particles > Burst로 이동합니다. Enabled를 끄기활성화를 확인하십시오. 문제 : 컴파일러에서 농도 경고, 즉 "무한 생산"을 표시합니다.
스크립트는 특정 위치에서 특정 개체를 검색하기 때문에 부품의 이름이 잘못 되었을 수 있습니다. 각 부품의 이름과 위치가 게임의 튜토리얼과 일치하는지 확인하십시오.
스크립트 이점과 제한
경험에서 이 튜토리얼 시스템을 사용하는 경우 팔로잉명심하십시오. 혜택
- TutorialEnd와 같은 이벤트는 다른 스크립트를 트리거할 수 있습니다. 예를 인스턴스, 이 이벤트가 발생했을 때 플레이어에게 특별 아이템을 수여할 수 있습니다.
- TutorialParticles 스크립트는 여러 입자를 한 번에 플레이할 수 있습니다. ServerStorage/TutorialParticles에 더 많은 입자를 추가하여 더 복잡한 효과를 만들 수 있습니다. 제한
- 튜토리얼에서 플레이어의 진행 상황은 지속되지 않습니다. 즉, 해당 진행 상황을 저장하는 방법을 코드해야 합니다. 가이드는 문서 를 참조하십시오. 데이터 저장.