Script'leri Ekleme

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

  1. In ReplicatedStorage , PlayerTutorial adında yeni bir klasör oluşturun. TutorialBeam'i TestPlayer'dan çıkarın ve yeni klasöre.

  2. In ServerStorage , aşağıdaki isimli bir klasör oluşturun. TestPlayer'ın Burst parçasını bu klasöre hareket ettirin.

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

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

  1. 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ı 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")
    -- 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ı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 Takibini artır
    local currentGoalIndex = player:WaitForChild("GoalProgress")
    currentGoalIndex.Value += 1
    end
    end
    -- oyuncuilerlemesini tutulmak için yerel olarak bir sayı oluşturur
    function TutorialManager.setupPlayerProgress(player)
    local currentGoalProgress = Instance.new("IntValue")
    currentGoalProgress.Name = "GoalProgress"
    currentGoalProgress.Value = 1
    currentGoalProgress.Parent = player
    end
    return TutorialManager

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

  2. 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 = 50
    local 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ın
    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
    -- Klon parçaları klasördeki, birden fazla olsun ve oyuncuya bağla
    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. Ayrıca bir değişken olan EMIT_RATE var, bir etkileşim sırasında kaç parçacık oluşturulacağını belirler.

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