Senaryoları ekleyin

*Bu içerik, yapay zekâ (beta) kullanılarak çevrildi ve hatalar içerebilir. Sayfayı İngilizce görüntülemek için buraya tıkla.

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.

  1. 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.

  2. In Sunucu Depolama , Eğitim Parçacıkları adlı bir klasör oluşturun. Patlama parçacığını TestPlayer'dan bu klasöre taşı.

  3. 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.

  1. 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.

  1. 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ı olabilir
    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")
    -- Daha fazla kod için yer tutucu. Örneğin, diğer görevler için sunucuya mesaj göndermek istiyorsanız
    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
    -- oyuncuHedef takipçisini arttır
    local currentGoalIndex = player:WaitForChild("GoalProgress")
    currentGoalIndex.Value += 1
    end
    end
    -- 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 Goals
    function TutorialManager.setupPlayerProgress(player)
    local currentGoalProgress = Instance.new("IntValue")
    currentGoalProgress.Name = "GoalProgress"
    currentGoalProgress.Value = 1
    currentGoalProgress.Parent = player
    end
    return TutorialManager

    Bu 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.

  2. 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 = 50
    local 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 oynat
    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
    -- Katılar klasörde klonlanır, birden fazla varsa bile ve oyuncuya bağlanır
    for _, emitter in ServerStorage.TutorialParticles:GetChildren() do
    emitter:Clone().Parent = playerParticleAttachment
    end
    end)
    end
    Players.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.

  3. 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.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.Enabled = true
    playerBeam.Parent = humanoidRootPart
    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. 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.