Đã đế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.
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.
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 đó.
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 .
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.
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ơilocal 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")-- 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ácendfunction TutorialManager.interactGoal(player)NextGoalEvent:FireServer()endfunction TutorialManager.getTutorialGoals()return goalPartsendfunction TutorialManager.nextGoal(player, goalParts)if checkTutorialEnd(player, goalParts) thenfinishTutorial(player)else-- Tăng mức độ Goal của người chơilocal currentGoalIndex = player:WaitForChild("GoalProgress")currentGoalIndex.Value += 1endend-- Tạo một giá trị int để theo dõi tiến độ của người chơi trong hướng dẫn Goalsfunction TutorialManager.setupPlayerProgress(player)local currentGoalProgress = Instance.new("IntValue")currentGoalProgress.Name = "GoalProgress"currentGoalProgress.Value = 1currentGoalProgress.Parent = playerendreturn TutorialManagerCá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.
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 = 50local 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ạtfor _, 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-- 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ơifor _, emitter in ServerStorage.TutorialParticles:GetChildren() doemitter:Clone().Parent = playerParticleAttachmentendend)endPlayers.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.
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.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)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.