Tüm bu çalışmaları bir araya getirme zamanı! Artık ışın ve parçacık bileşenlerini oluşturdunuz, üç önceden hazırlanmış senaryoya ekleyeceksiniz.Bu senaryolar, bileşenlere ne zaman yapacaklarını söyleyerek eğitimi yönetir.Örneğin, kodlar yeni oyuncular için ışınlar oluşturacak ve hedeflerle etkileşim kurduklarında parçacıklar yayacak.
Işın ve parçacıkları depola
Senaryolar eklenmeden önce, ışın ve parçacıklar, gerektiğinde senaryoların kopyalarını yapabilmeleri için yer değiştirmelidir.
In Yeniden Düzenlenmiş Depolama , Oyuncu Eğitimi adlı yeni bir klasör oluşturun. Eğitim Işını TestPlayer'dan çıkarın ve yeni klasöre taşın.
In Sunucu Depolama , Eğitim Parçacıkları adlı bir klasör oluşturun. Patlama parçacığını TestPlayer'dan bu klasöre taşı.
Işın ve parçacık yayıcısı hareket ettirildikten sonra, artık TestPlayer'a ihtiyacınız yoktur. Silin TestPlayer çünkü senaryo bitince gerçek oyuncularla çalışacak.
Etkinlikler oluşturma
Oyuncular her bir kez bir hedefle etkileşime girdiğinde, eğitim kılavuzu o oyuncunun ilerlemesini güncelleyebilmeli ve parçacık etkisini yayabilmelidir.Senaryolara bilgi vermek için, sinyaller etkinlikler kullanılarak gönderilebilir.
ReplicatedStorage > Oyuncu Eğitimi'nde, iki Uzak Etkinlik nesnesi oluşturun. Onlara isim verin Sonraki Hedef ve Eğitim Sonu .
Kodları ekleyin
Aşağıdaki üç kod, daha önce oluşturulan parçacık verici ve ışın nesnelerini arayacak ve eğitim sistemini yönetecek.
ReplicatedStorage > Oyuncu Eğitimi > yeni bir ModülScript adlandırılan Eğitim Yöneticisi oluşturun.
Varsayılan kodu aşağıdaki tüm kodu kopyalayıp yapıştırarak 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ı masada sipariş edilmelidir, yoksa hedef siparişi oyun içinde 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")-- Daha fazla kod için yer tutucu. Örneğin, diğer görevler 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 takipçisini arttırlocal currentGoalIndex = player:WaitForChild("GoalProgress")currentGoalIndex.Value += 1endend-- Eğitim hedefleri aracılığıyla oyuncunun ilerlemesini yerel olarak izlemek için bir int değeri oluşturur Creates an int value to locally track player's progress through the tutorial Goalsfunction TutorialManager.setupPlayerProgress(player)local currentGoalProgress = Instance.new("IntValue")currentGoalProgress.Name = "GoalProgress"currentGoalProgress.Value = 1currentGoalProgress.Parent = playerendreturn TutorialManagerBu senaryo, eğitimde bir oyuncunun ilerlemesini yönetmek için kod çalıştırır.Buna, hedeflerle etkileşim kurmak için kod çalıştırma gibi görevler veya eğitim bitince neler olacağı dahil edilir.
In ServerScriptService , yeni bir Script olan Eğitim Parçacıkları adlı yeni bir oluşturun.
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")-- Eklentideki parçacıkları geç ve parçacıkları türüne göre oynatfor _, 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-- Katılar klasörde klonlanır, birden fazla varsa bile ve oyuncuya bağlanırfor _, 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.Bir etkileşim sırasında kaç parçacık üretileceğini belirleyen değişken EMIT_RATE da var.
StarterPlayer > StarterPlayerScripts'de, Eğitim Kılavuzu Kodu adlı yeni bir YerelScript oluşturun.
Sonra, aşağıdaki kodu yapıştırın. Bu kod, oyuncuları yönlendirmek için kullanılan ışını 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.Enabled = trueplayerBeam.Parent = humanoidRootPartendlocal 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)Senaryoları test etmek için projeyi oynayın. Kodun çalışıp çalışmadığını görmek için etkileşim özelliğini kullanarak standdan standa geçin.
Sorun giderme ipuçları
Sorun : Oyun başladığında parçacıklar oynar.
ServerStorage > Eğitim Parçacıkları > Patlama'ya gidin. Kapalı olması için Etkin seçeneğini kontrol edin. Sorun : Derleyicide "sonsuz bir üretim" gibi uyarılar.
Senaryo belirli konumlarda belirli nesneler aradığından, bir parçanın yanlış adlandırıldığı olasıdır.Oyundaki her parçanın adı ve konumunun eğitimle eşleştiğinden emin olun.
Senaryo avantajları ve sınırları
Bu eğitim sistemini deneyiminizde kullanıyorsanız, takip edilennoktalara dikkat edin: Faydaları
- ÖğreticiSonu gibi olaylar, diğer kodları tetiklemek için kullanılabilir. durum, bu olay ateşlendiğinde oyunculara özel bir ödül verebilirsiniz.
- Eğitim Parçacıkları skripti bir kerede birden fazla parçacık oynatabilir.Daha karmaşık etkiler için ServerStorage/TutorialParticles'a daha fazla parçacık ekleyebilirsiniz. Sınırlar
- Eğitimde oyuncu ilerlemesi kalıcı değildir, yani bu ilerlemenin bir şekilde kaydedilmesi gerekir.Rehberlik için, makaleyi görün: Veri Kaydetme.