Tüm bu işi bir araya getirme zamanı! Şimdi, ışın ve parçacık bileşenlerini oluşturduktan sonra, üç önceden yapılmış senaryoda ekleyeceksiniz. Bu senaryolar, oyuncuların yeni oyun oluşturmak ve hedeflerle etkileşime girmeye her zaman söylediği gibi işlemleri yönetir. Örneğin, oyuncular yeni oyun oluşturmak ve hedeflle etkileşime girme
Işın ve Particileri Depolama
Eklenecek skriptlerin önce, ışın ve parçacıkların gerektiğinde skriptlerin kopyalarını yapabileceği yere hareket ettirilmesi gerekir.
In ReplicatedStorage , PlayerTutorial adında yeni bir klasör oluşturun. TutorialBeam'i TestPlayer'dan çıkarın ve yeni klasöre.
In ServerStorage , aşağıdaki isimli bir klasör oluşturun. TestPlayer'ın Burst parçasını bu klasöre hareket ettirin.
Işın ve parçacık emitteri hareket ettirildiğinde, artık TestPlayer'a ihtiyacınız yoktur. Sil TestPlayer, çünkü skript bittiğinde gerçek oyuncularla çalışacaktır.
Etkinlikler Oluşturulması
Oyuncular bir hedefle etkileşime geçtiğinde, öğretici senaryosu gerekir, böylece oyuncunun ilerlemesini güncelleme ve parçacık efektini emittirebilir. Mesajları bildirmek için, sinyalleri etkinlikler kullanarak gönderilebilir.
ReplicatedStorage > PlayerTutorial'da iki Uzaktan Etkinlik nesnesi oluşturun. Onlara şu isimleri verin NextGoal ve TutorialEnd .
Eklentileri eklemek
Aşağıdaki üç senaryo daha önce oluşturulan parçacı emitter ve ışınlanma nesneleri arayacak ve öğretim sistemini yönetecek.
ReplicatedStorage > PlayerTutorial > eğitimci adında yeni bir ModuleScript oluştur.
Aşağıdaki kodu kopyalayıp yapıştırarak varsayılan kodu değiştirin.
local TutorialManager = {}local ReplicatedStorage = game:GetService("ReplicatedStorage")local tutorialFolder = ReplicatedStorage:WaitForChild("PlayerTutorial")local TutorialEndEvent = tutorialFolder:WaitForChild("TutorialEnd")local NextGoalEvent = tutorialFolder:WaitForChild("NextGoal")-- Hedef parçalarının tabloda sipariş edilmesi gerekir, yoksa oyun içinde hedef siparişi farklı olabilirlocal 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")-- Diğer görevleri yapmak için sunucuya mesaj göndermek için yer tutucu. Örneğin, bir başka görevi yapmak için sunucuya mesaj göndermek istiyorsanızendfunction TutorialManager.interactGoal(player)NextGoalEvent:FireServer()endfunction TutorialManager.getTutorialGoals()return goalPartsendfunction TutorialManager.nextGoal(player, goalParts)if checkTutorialEnd(player, goalParts) thenfinishTutorial(player)else-- oyuncuHedef Takibini artırlocal currentGoalIndex = player:WaitForChild("GoalProgress")currentGoalIndex.Value += 1endend-- oyuncuilerlemesini tutulmak için yerel olarak bir sayı oluştururfunction TutorialManager.setupPlayerProgress(player)local currentGoalProgress = Instance.new("IntValue")currentGoalProgress.Name = "GoalProgress"currentGoalProgress.Value = 1currentGoalProgress.Parent = playerendreturn TutorialManagerBu kodu, bir oyuncunun ilerlemesini öğretici içinde yönetmek için kullanır. Bu, hedeflerle etkileşim kurmak için kodu çalıştırmak gibi görevleri içerir veya öğretici sona erdiğinde ne olur.
In ServerScriptService , a new Script oluştur TutorialParticles isimli.
Aşağıdaki kodu yapıştırın.
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")-- Eklantıdaki parçalardan geçin ve parçalara göre oynatınfor _, 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-- Klon parçaları klasördeki, birden fazla olsun ve oyuncuya bağlafor _, emitter in ServerStorage.TutorialParticles:GetChildren() doemitter:Clone().Parent = playerParticleAttachmentendend)endPlayers.PlayerAdded:Connect(setupPlayerParticles)NextGoalEvent.OnServerEvent:Connect(playParticleBurst)Bu senaryo oyuncular hedeflerle etkileşim kurduğunda patlama parçacını oynar. Ayrıca bir değişken olan EMIT_RATE var, bir etkileşim sırasında kaç parçacık oluşturulacağını belirler.
In StarterPlayer > StarterPlayerScripts, create a new Yeni bir YazılımScripti named EğitimScripti .
Ardından aşağıdaki kodu yapıştırın. Bu kod, oyuncuları yönlendirmek için kullanılan dalgayı oluşturur ve yönetir.
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)Kodları test etmek için projeyi oynatın. Sandalyeden sandalyeye hareket edin, etkileşim özelliğini kullanarak kodun çalışıp çalışmadığını görün.
Hata ayıklama ipuçları
Sorun: : Oyun başladığında parçacıklar oynanır.
ServerStorage > Eğitim Parçaları > Patlama'ya git. Kapalı olabilmek için Etkinleştirme'yi seç. Sorun: Derleyicideki uyarılar, "infinite yield" gibi.
Skript belirli yerlerde belirli nesneler arıyor, bir parçanın ismi yanlış olabilir. Her bir parçanın oyun içindeki ismi ve yerleşimini öğreticiyle eşleştirin.
Script Faydaları ve Sınırları
Bu öğretici sistemi deneyiminizde kullanıyorsanız, takip edilenhatırlayın: Faydaları
- TutorialEnd gibi olaylar diğer oyunları tetiklemek için kullanılabilir. durum, bu olay patladığında oyunculara özel bir öğe verebilirsiniz.
- TutorialParticles yazılımı, birden fazla parçacık aynı anda oynayabilir. ServerStorage/TutorialParticles'a daha karmaşık efektler için daha fazla parçacık ekleyebilirsiniz. Sınırlamalar
- Öğretici içindeki oyuncu ilerlemesi sürükleme değildir, yani bu ilerlemeyi kaydetmek için bir yol bulmak zorunda kalacaksınız. İçinlik için, öğreticiyi görüntüleyin: Verileri Kaydetme.