Oyun Kodlanması

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

Harita oluşturulduktan sonra, senaryolardaki tüm farklı öğeleri oluşturmaya başlayabilirsiniz. Bu kursun geri kalanı, oyun bağlantısının tüm farklı öğelerine odaklanacaktır.

Script'leri ayarlama

Savaş royalesi, modül scriptleri ve normal scriptleri bir kombinasyon kullanacak. Aşağıda, bu kodlar ve işlevleri vardır.

GameManagerScript. Game Settings'den Game'e kullanıcı değiştiricilerini kullanarak Maç Yöneticisinden işlevleri çalıştırır
Maç YöneticisiModül Kodu. Oyuncuları bir arenaya göndermek veya bir eşleşmezamanı takip etme gibi işlevleri yürütür.
Oyun AyarlarıModül Kodu. Diğer kodlar tarafından kullanılan sık kullanılan değişkenleri depolar.

GameSettings Yazılımı

Oyun Ayarları adında bir modül k scripti oluşturarak diğer kullanıcıların kullandığı ortak değişkenleri saklayın. Bu ortak değişkenler daha sonra GameManager kullanıcı tarafından kullanılacaktır.

  1. In ServerStorage , bir "ModuleScripts" adında bir klasör oluşturun. Bu klasörde, GameSettings adında yeni bir modül scripti oluşturun.

  2. GameSettings'ı aç ve modül tablosunu özellik adına uygun şekilde yeniden adlandır.


    local GameSettings = {}
    return GameSettings
  3. Modül tabelinde, aşağıdaki kullanımlar için değişkenler ekleyin. Her değer için en iyi tahmininizi alın, test sırasında her zaman değiştirebilirsiniz.

    • Molma Süresi - Oyuncular bir eşleşmeönce bekleme süreleri.
    • Maç Süresi - Bir maçın saniyeler içindeki uzunluğu.
    • En az oyuncu sayısı - başlatiçin gerekli en küçük oyuncu sayısı.
    • Geçiş Süresi - Oyun bağlantısının saniyeler içinde gerçekleşmesinden önce ve sonra geçiş süresi. Oyun bağlantısının parçaları arasındaki geçişi daha az bekleyici hale getirir.

    local GameSettings = {}
    -- Oyun Değişkenleri
    GameSettings.intermissionDuration = 5
    GameSettings.matchDuration = 10
    GameSettings.minimumPlayers = 2
    GameSettings.transitionTime = 5
    return GameSettings

MatchManager Yazılımı

GameManager'a bağlanan ikinci senaryo MatchManager'dir. Bu senaryo, oyunun başlangıcını takib etmek veya oyuncuların maçı bitirdiğinde yeniden ayarlamak gibi görevleri yönetir.

MatchManager'ın içinde prepareGame() adında bir işlev var. Bu, oyuncuları eşleşmedönüştürerek oyunu başlatır.

  1. ServerStorage > ModuleScripts > MatchManager adında bir modül scripti ekleyin. Modül tablosunu yeniden adlandırın.


    local MatchManager = {}
    return MatchManager
  2. MatchManager adındaki yeni bir modül işlevi ekle. Skripti daha sonra test etmek için bir print ifadesi ekleyin.


    local MatchManager = {}
    function MatchManager.prepareGame()
    print("Game starting!")
    end
    return MatchManager

Oyun Kodlanması

Ana oyun döngüsü oluşturulan değişkenleri kullanarak GameManager kriptinde kodlanacak. Hatırlayın, oyun döngüsünde üç faz vardır: mola, rekabet ve temizleme ve sıfırlama.

GameManager Komutu

Bu senaryo normal bir sunucu senaryosu, bu yüzden ServerScriptService'e, modül skriptleri klasörüne değil, bir while true do loop olacaktır.

  1. ServerScriptService'de, GameManager adında yeni bir senaryo oluşturun.

  2. Modül Kriptlerinin bulunduğu yer olan "ServerStorage" için bir değişken ekleyin. Sonra "Oyuncular" hizmetine, mola sırasında oyuncu sayısını kontrol etmek için gereken bir değişken ekleyin.


    -- Hizmetler
    local ServerStorage = game:GetService("ServerStorage")
    local Players = game:GetService("Players")
  3. Daha önce oluşturulan modüller kullanılmak üzere:

    • moduleScripts adında bir değer moduleScripts dizinine yerleştirin.
    • matchManager ve gameSettings adındaki ortak değişkenleri ekleyin. Her bir ortak değişkenin kendi skriptini gerektirmesini sağlayın.

    -- Hizmetler
    local ServerStorage = game:GetService("ServerStorage")
    local Players = game:GetService("Players")
    -- Modül Kodları
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
  4. Değişkenlerden sonra, bir while true do döngüsü ekleyin. Oyun döngüsünün tüm aşamaları sonsuza kadar tekrarlanacaktır.


    -- Modül Kodları
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
    -- Ana oyun döngüsü
    while true do
    end

Mola Kodlanması

Oyun çözgüsü sonsuza kadar çalışırken, mola süresi oyunu durdurmalı ve sadece bir eşleşmeiçin yeterli oyuncu olduğunda devam etmelidir. Bu molayı kodlamak için, ana döngü için bir alt döngü oluşturun. Bu döngü alt döngü içinde sürecek ve bir maç için oyuncuları bir eşleşmeiçin geçişt

Bir 반복 özelliği ile, bu özellikteki kod en az bir kere çalışacaktır. Bir while özelliği ile aynı değildir, oyuncuların maçtan önce her zaman lobiye gittiğinden emin olur. Bu, oyuncuların her zaman eşleşmeönce lobiye gittiğinden emin olur.

  1. In the while true do loop, type repeat and press Enter to autocomplete with the keyword 1> until1> .


    while true do
    repeat
    until
    end
  2. Oyun Ayarları modülünde daha önce oluşturulan <a href="/reference/engine/datas">minimumPlayers</a> değerine eşdeğer veya daha büyük oyuncu sayısı ile şu andaki oyuncu sayısı arasında oynanıyor.


    while true do
    repeat
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    end
  3. Tekrarlanan bir döngüde, mola başladığını söyleyen bir print ifadesi ekleyin. task.wait() kullanarak mola için intermissionDuration durdurmayı kullanırken print statement kullanır.


    while true do
    repeat
    print("Starting intermission")
    task.wait(gameSettings.intermissionDuration)
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    end
  4. Yazdırma ifadesi "Starting intermission" ít nispetle gösterildiğinden emin olun. Mesajı iki kez görmek, tekrar gösterilmeyen yeterli oyuncu bulmadığını kanıtlar ve tekrar çalıştırılır. İkinci kez mesajı görmek için bekleme süresini beklemek zorunda kalacaksınız.

Hata ayıklama ipuçları

Bu noktada, planlanan gibi yapmıyorsanız, aşağıdaki birinden deneyin.

  • task.wait() sollte içinde tekrar eden döngü içinde olmalıdır. Bekleme olmadan, kod çok fazla bir saniye içinde çalışacak ve Roblox Studio'yu aşırı yüklemeye ve bir hata oluşturana neden olacaktır.
  • Oyun Ayarları modülünde, intermissionDuration değeri 1'den büyük olmalıdır. Eğer daha düşükse, kod çok yeniden yüklenir ve yavaşlatma sorunları oluşturur.

Molayı Sonlandırma

Yeterli sayıda oyuncu olduğunda, onları kısa bir geçiş süresiyle bekletin. Sonra, MatchManager'da prepareGame() işlevini çağırın. Unutmayın, bu işlev sadece bir satır yazdırır, ancak daha sonra daha fazla kod ekleyeceksiniz.

  1. Tekrarlanan döngünün sonunda, aradaşıklığınızı test etmek için mola bitişini belirtir bir print ifadesi ekleyin. Sonra, GameSettings'ın task.wait() değişkenini kullanarak bir transitionTime ifadesini takip edin.


    while true do
    repeat
    print("Starting intermission")
    task.wait(gameSettings.intermissionDuration)
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    print("Intermission over")
    task.wait(gameSettings.transitionTime)
    end
  2. Bekledikten sonra, MatchManager modülünden prepareGame() çağırın. Kod çalıştığında, bu sadece kodu çıktı penceresine yazacaktır. Bekleme kodu test etmek için bir sonraki bölüme bekleyin.


    while true do
    repeat
    print("Starting intermission")
    task.wait(gameSettings.intermissionDuration)
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    print("Intermission over")
    task.wait(gameSettings.transitionTime)
    matchManager.prepareGame()
    end

Çok oyunculu oyunları test etme

Şu anda, kodu çalıştırmak için prepareGame() gerekir. Ama bunu yapmak için, tekrar tekrar döngüsünden çıkmak gerekir. Fakat bunu yapmak için, playtest düğmesini kullanıyorsanız, kod asla çalışmaz çünkü sadece oyunun minimum oyuncusunuz (ya da o

Yerel Bir Sunucuyu Başlatma

Tek bir oyuncu daha fazla oynatan kodu test etmek için yerel bir sunucu oluşturun. Yayınlanmış oyunlar normalde Roblox sunucusunda bulunur, ancak bir yerel sunucu simüle edilmiş oyunu bilgisayarınızda oynatır.

  1. Yerel bir sunucuyu başlatmak için, Test sekmesinin Klişeler ve Sunucular bölümünde > oyun ayarlarının minimum oynatıcı sayısına oyuncu dropdown'ını ayarlayın. Bu ders 2 oyuncu kullanıyor.

  2. sunucubaşlatmak için Başlat'a tıklayın.

  3. Sunucunun kurulması için birkaç saniye bekleyin. Orijinal Studio pencerenizin yanı sıra birkaç pencere Roblox Studio'yu açacaktır. Ağ yönlendiricilerden veya diğer online güvenlik yazılımından Roblox Studio'ya erişimi izin vermeniz gerekebilir.

Hata ayıklama ipuçları

Bu noktada, test sunucularını göremiyorsunuz, aşağıdaki birinden deneyin.

  • Sunucunun başlangıcında herhangi bir sorun varsa, makalenin Firewall ve Router Issues bölümünü ikiye katlayın.
  • Oyuncu sayısını 2 veya 3 gibi küçük bir sayıya ayarlar.
  • Eğer sorun çözülmezse, Studio'yu yeniden başlatmayı deneyin veya bilgisayarınızı yeniden başlatın.

Yerel Sunucuda Test

Sunucu başladığında çok sayıda pencere göreceksiniz. Her biri, sunucu/klien ilişkisinin farklı bir parçasını temsil eder.

  • Sunucu (yeşil sınır) oyunu çalıştırır.
  • Müşteri (mavi çizgiler) bir oyuncunun deneyimini simüle eder.
Yeşil sınırlı sunucu
Mavi sınırlı klient

Sunucu açık olduğunda, kodun çalıştığını kontrol edebilirsiniz.

  1. Yeşil sınırlı Sunucu penceresini bulun. MatchManager kullanıcı kayısından çağrılan baskı deklarasyonunu kontrol edin. Çünkü tekrarlanan bir dizi görüntülenir.

  2. Testlerinizi tamamladıktan sonra, herhangi bir pencerede, Temizleme düğmesine basarak sunucuyu kapatın. Bu, tüm Sunucu ve Klient pencerelerini kapar ve normal Studio pencerenize geri döndürür.

Hata ayıklama ipuçları

Burada, planlanan yazılımlar görünmediyse, aşağıdaki birinden deneyin.

  • 準備Game() ile ilgili işlevlerin 루프 içinde olduğundan emin olun.
  • MatchManager'ın yazdırması problemli değilse, bazı modül kaynaklı sorunların ortaya çıkmasına izin verin, modül kaynaklı sorunların ortaya çıkmasına izin verin, bununla birlikte prepareGame()'in bu modülün tablosuna eklenmesine izin verin.

Tamamlanan Scriptler

Aşağıda çalışmanızı iki kat kontrol etmek için tamamlanmış kodlar var.

GameManager Komutu


-- Hizmetler
local ServerStorage = game:GetService("ServerStorage")
local Players = game:GetService("Players")
-- Modül Kodları
local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
-- Ana oyun döngüsü
while true do
repeat
print("Starting intermission")
task.wait(gameSettings.intermissionDuration)
until #Players:GetPlayers() >= gameSettings.minimumPlayers
print("Intermission over")
task.wait(gameSettings.transitionTime)
matchManager.prepareGame()
end

MatchManager Yazılımı


local MatchManager = {}
function MatchManager.prepareGame()
print("Game starting!")
end
return MatchManager

GameSettings Yazılımı


local GameSettings = {}
-- Oyun Değişkenleri
GameSettings.intermissionDuration = 5
GameSettings.roundDuration = 10
GameSettings.minimumPlayers = 2
GameSettings.transitionTime = 5
return GameSettings