Eğitim · Script temelleri

Roblox Studio'da script nasıl yazılır: yeni başlayanlar için rehber

Roblox Studio'da script yazmak, oyununa eklediğin scriptlere Lua dilinin Roblox sürümü olan Luau ile kod yazmak demek. Bu rehber boş bir Baseplate'ten başlıyor: Output penceresini açıyorsun, ilk scriptini yazıyorsun, koddan bir parçayı değiştiriyorsun, bir oyuncu bir platforma bastığında tepki veriyorsun ve bir LocalScript deniyorsun; bu arada değişkenleri, fonksiyonları, if ifadelerini, döngüleri ve event'leri öğreniyorsun.

Güncellendi: 26 Ekim 202617 dk okumaYazan:

Kısa cevap

Roblox Studio'da script yazmak için Explorer'da fareyle ServerScriptService üzerine gel, +'ya tıkla ve bir Script ekle. Studio onu Script Editor'da açar. print("Hello") gibi Luau yaz, Play'e (F5) bas ve sonucu Output penceresinde oku (Window menüsü ya da Script sekmesi). Bir Script sunucuda çalışır ve her şeyi herkes için değiştirir; StarterPlayerScripts içindeki bir LocalScript ise sadece tek bir oyuncunun cihazında çalışır.

  • Önce dört fikri öğren: değişkenler (local coins = 3), fonksiyonlar (local function name() ... end), if ifadeleri ve event'ler (part.Touched:Connect(...)). Bu rehberdeki dört script bunlarla, artı döngüler ve tablolarla kurulur.
  • wait() değil, task.wait() kullan. Roblox referansı global wait()'i kullanımdan kalkmış ve yerine task.wait() gelmiş olarak işaretliyor.
  • Output penceresinin görüntüleme seçeneklerinde Show Context'i aç, böylece her satır Server'dan mı yoksa bir Client'tan mı geldiğini söyler.
Bu sayfada
  1. Başlamadan önce
  2. 1. İlk script
  3. 2. Parça değiştirmek
  4. 3. Event'ler
  5. 4. İlk LocalScript
  6. 5. Test et
  7. Nereye konur
  8. Hataları okumak
  9. Eski eğitimler
  10. Pratik
  11. Sırada ne var
  12. Yaygın hatalar
  13. RoCode ile
  14. Sık sorulan sorular
  15. Kaynaklar ve ek okumalar

Başlamadan önce: Studio, bir Baseplate ve Output penceresi

ÇizimDört script tek bir testte: ColourChanger'ın parçası her saniye renk değiştiriyor, Pad'e basmak onu tüm oyuncular için 2 saniye sarı yapıyor ve adını Output'a yazıyor, E de Pad'i sadece bu ekranda soldurur.

Roblox Studio ve bir Roblox hesabı gerekiyor, başka bir şey değil: kod editörü ya da plugin yok. Bu rehberdeki tüm scriptler Studio'nun kendi Script Editor'ında yazılıyor.

  1. Roblox'un Windows ve Mac için ücretsiz uygulaması Roblox Studio'yu kur ve Roblox hesabınla giriş yap.
  2. Studio'yu aç. Başlangıç sayfası şablonlar gösterir: Baseplate'i seç. 4x4 ızgara dokulu bir zemin ve oynadığında avatarının doğduğu nokta olan bir SpawnLocation elde edersin.
  3. Explorer ve Properties pencereleri görünmüyorsa Window menüsünden ya da Home sekmesinden aç. Explorer oyunundaki her nesneyi gösterir; Properties de seçtiğin şeyin ayarlarını gösterir.
  4. Output'u Window menüsünden ya da Script sekmesinden aç. Scriptlerinin mesajları ve hataları orada görünür.
  5. Output penceresinin görüntüleme seçeneklerinde her mesajı Client ya da Server olarak etiketleyen Show Context'i ve mesajı üreten scripti ve satır numarasını gösteren Show Source'u aç.
Yazacağın dört script
ScriptTürNereye konurNe öğretir
FirstScriptScriptServerScriptServiceDeğişkenler, bir fonksiyon, bir if ifadesi, döngüler ve bir tablo
ColourChangerScriptWorkspace'teki bir Part'ın içineÖzellik değiştirmek, script.Parent ve bekleyen bir döngü
TouchPadScriptPad adlı bir Part'ın içineEvent'ler, bir parçaya dokunan oyuncuyu bulmak ve bir debounce
MyFirstLocalScriptLocalScriptStarterPlayer içindeki StarterPlayerScriptsBir oyuncunun cihazında çalışan kod, tuş basışları ve o cihazda kalan şeyler
Bitirdiğinde Explorer (sadece bu rehberin kullandığı nesneler)
Workspace
  Baseplate Part
  SpawnLocation SpawnLocation
  Part Part new
    ColourChanger Script new
  Pad Part new
    TouchPad Script new
ServerScriptService
  FirstScript Script new
StarterPlayer
  StarterPlayerScripts
    MyFirstLocalScript LocalScript new

Adım 1: ilk scriptini yaz

  1. Explorer'da fareyle ServerScriptService üzerine gel, + butonuna tıkla ve Script'i seç (kısayol Ctrl+I, Mac'te ⌘I). Studio scripti oluşturur ve Script Editor'da açar.
  2. Yeni scripte sağ tıkla, Rename'i seç ve adını FirstScript yap. Ad scriptin ne yaptığını değiştirmez, ama hangi scriptin neyi yazdırdığını söyler.
  3. Yeni scriptler tek bir satırla başlar: print("Hello world!"). Onu sil ve aşağıdaki kodu yapıştır.
  4. Solundaki açılır menüde Test seçiliyken Play'e (F5) bas. Studio bir test başlatır ve avatarını SpawnLocation'a koyar.
  5. Output satırlarını oku ve Stop'a (Shift+F5) bas. Stop ayrıca her nesneyi Play'e basmadan önceki haline döndürür, yani oynarken taşıdığın ya da rengini değiştirdiğin her şey geri gelir.
Script konum: ServerScriptService adı: FirstScript
-- ServerScriptService içinde FirstScript adlı Script.
-- İlk Luau kodun: değişkenler, bir fonksiyon, bir if ifadesi, bir döngü ve bir tablo.
-- Play'e (F5) bas ve sonuçları Output penceresinde oku.

-- Değişken, bir değeri tutan bir addır
local gameName = "Coin Run"
local coinsToWin = 3

-- Fonksiyon, istediğin kadar çalıştırabileceğin adlandırılmış bir kod bloğudur.
-- name ve goal parametreleridir; return, çağırana bir değer döndürür.
local function describe(name: string, goal: number): string
	return `{name}: collect {goal} coins to win`
end

print(describe(gameName, coinsToWin)) --> Coin Run: collect 3 coins to win

-- Bir if ifadesi kodu sadece koşulu doğruysa çalıştırır
if coinsToWin > 5 then
	print("That is a long game")
elseif coinsToWin > 1 then
	print("That is a short game")
else
	print("One coin and you win")
end

-- Bir for döngüsü kodu belirli sayıda tekrarlar
for count = 1, coinsToWin do
	print("Coin number", count)
end

-- Bir tablo bir değer listesi tutar; bu döngü her birini sırayla ziyaret eder
local colours = { "Red", "Green", "Blue" }
for position, colour in colours do
	print(position, colour) --> 1 Red, sonra 2 Green, sonra 3 Blue
end

Bir satırda --'dan sonra gelen her şey yorumdur: Luau onu atlar, yani kendine not bırakabilirsin. --> yorumları o satırın ne yazdırdığını gösterir.

Output, Studio'nun kendi mesajlarıyla karışık olarak bu sekiz satırı göstermeli. print birden fazla değer alınca aralarına bir boşluk koyar. Show Context ve Show Source açıkken her satırda ayrıca Server etiketi ve satır numarasıyla FirstScript yazar.

Output (beklenen)
Coin Run: collect 3 coins to win
That is a short game
Coin number 1
Coin number 2
Coin number 3
1 Red
2 Green
3 Blue

Her satırı onu yazdıran kodla eşleştir. Daha sonra aynısını hata mesajlarıyla yapacaksın, o yüzden şimdiden alışmaya değer.

FirstScript sadece saf Luau kullanıyor, hiç Roblox nesnesi yok, yani tarayıcındaki ücretsiz Luau playground'da da çalışır. Orada bir değeri değiştir ve neyin değiştiğini görmek için yeniden çalıştır.

FirstScript'in her parçası ne yapar
KodFikirNe anlama gelir
local gameName = "Coin Run"DeğişkenBir değeri tutan bir ad. local, onu sadece bu scriptin ya da içinde bulunduğu bloğun kullanabileceği anlamına gelir. Tırnak içindeki metin bir string'dir (metin dizesi); 3 bir number'dır (sayı). Adlar büyük küçük harfe duyarlıdır, yani coinsToWin ve CoinsToWin iki farklı değişkendir.
local function describe(name: string, goal: number): stringFonksiyonİstediğin kadar çalıştırabileceğin adlandırılmış bir kod bloğu. name ve goal onun parametreleridir: her çağrıldığında ona verilen değerler. : string ve : number isteğe bağlı tip notlarıdır. Luau onları Script Editor'da seni hatalara karşı uyarmak için kullanır; kod onlarsız da aynı şekilde çalışır.
returnDönüş değeriFonksiyonu çağıran koda bir değer döndürür. print(describe(gameName, coinsToWin)), describe ne döndürürse onu yazdırır.
`{name}: collect {goal} coins to win`String interpolasyonuTers tırnak içindeki metin değerler içerebilir: Luau {name} ve {goal}'u güncel değerleriyle değiştirir.
if, elseif, else, endIf ifadesiLuau koşulları yukarıdan aşağıya dener ve sadece ilk doğru olanı çalıştırır. coinsToWin 3'tür; 5'ten büyük değil ama 1'den büyük, yani sadece "That is a short game" yazdırılır.
for count = 1, coinsToWin doSayısal for döngüsüİçindeki kodu 1'den coinsToWin'e kadar her sayı için bir kez çalıştırır; count önce 1, sonra 2, sonra 3 olur.
{ "Red", "Green", "Blue" } ve for position, colour in colours doTablo ve döngüListe olarak kullanılan bir tablo, Luau'nun array dediği şey. Konumlar 0'dan değil 1'den başlar. Döngü her elemanı ziyaret eder ve sana konumunu ve değerini verir.

function, if, for ya da while ile başlayan her blok end ile kapanır. Eksik tek bir end bile bütün scriptin çalışmasını engeller; hataları okumak bölümü alacağın mesajı gösteriyor.

Adım 2: bir scriptle bir parçayı değiştir

Scriptler dünyadaki şeyleri değiştirdiklerinde işe yarar hale gelir. Properties penceresinde gördüğün, bir parçanın Color, Transparency ya da Anchored gibi ayarları özelliklerdir (property) ve bir script de onları değiştirebilir.

  1. Home sekmesinde Part'a tıkla. Studio Workspace'e bir blok ekler. Adı önemli değil.
  2. Explorer'da fareyle yeni parçanın üzerine gel, +'ya tıkla ve bir Script ekle. Adını ColourChanger yap ve içeriğini aşağıdaki kodla değiştir.
  3. Play'e bas. Parça kırmızı, sonra mavi, sonra yeşil olur, saniyede bir değişir ve baştan başlar.
Script konum: Workspace'teki bir Part adı: ColourChanger
-- Workspace'teki bir Part'ın içinde ColourChanger adlı Script.
-- Scriptler Properties penceresinde gördüğün özelliklerin aynısını değiştirir.
-- Bu script parçasına her saniye yeni bir renk verir, tüm oyuncular için.

local part = script.Parent :: BasePart -- bu scriptin içinde bulunduğu parça

local colours = {
	Color3.fromRGB(255, 85, 85), -- kırmızı
	Color3.fromRGB(85, 170, 255), -- mavi
	Color3.fromRGB(85, 255, 127), -- yeşil
}

part.Anchored = true -- sabitlenmiş (anchored) bir parça koyduğun yerde kalır

local index = 1
while true do
	part.Color = colours[index]
	index = index % #colours + 1 -- 1, 2, 3 ve yine 1
	task.wait(1) -- bir saniyelik duraklama (eski wait() kullanımdan kalktı)
end
  • script.Parent, scriptin içinde bulunduğu nesnedir, burada parça. Scripti başka bir parçaya sürüklersen onun yerine o parçayı değiştirir.
  • :: BasePart bir tip dönüştürmesidir (type cast). Script Editor'a parent'ın bir parça olduğunu söyler, böylece üzerinde kullandığın özellikleri kontrol edebilir. Luau tipleri sadece uyarılar ve öneriler için kullanır, yani dönüştürme satırın ne yaptığını değiştirmez.
  • part.Color ve part.Anchored, Properties penceresinde gördüğün özelliklerin aynısıdır, aynı adlarla. Roblox Amerikan İngilizcesi yazımını kullanır, bu yüzden bu scriptin adı ColourChanger olsa da özellik Color'dır.
  • Anchored = true parçayı yerinde tutar: Roblox referansına göre sabitlenmiş bir parça yerçekimi, çarpışmalar ya da başka herhangi bir fizik yüzünden asla hareket etmez.
  • colours[index] listeden bir eleman okur. #colours listenin uzunluğudur, yani 3, ve % bölmeden kalanı verir; bu yüzden index % #colours + 1 1, 2, 3, 1, 2, 3 diye sayar.
  • while true do sonsuza kadar tekrarlar, içindeki task.wait(1) bu yüzden önemli. Roblox dokümantasyonu sonsuz bir döngüye her zaman task.wait() gibi bir duraklama koymanı söylüyor: o olmadan oyun donar ve Studio çöker.

ColourChanger bir Script, yani sunucuda çalışır ve oyundaki tüm oyuncular aynı rengi aynı anda görür. Adım 4 diğer script türünü gösteriyor.

Adım 3: bir event ile oyuncuya tepki ver

Bir oyunun kodunun çoğu bir şeyin olmasını bekler: bir oyuncu girer, bir parçaya dokunulur, bir butona tıklanır. Roblox bunlara event (olay) der. Biri tetiklendiğinde kod çalıştırmak için ona bir fonksiyon bağlarsın.

  1. Başka bir Part ekle ve adını tam olarak Pad yap, P büyük. Onu bir klasörün ya da modelin içine değil doğrudan Workspace'e koy, çünkü adım 4'teki LocalScript onu orada arıyor.
  2. Onu üzerine basabileceğin düz bir platform yap, örneğin Properties penceresinde Size'ını 6, 1, 6 yaparak. SpawnLocation'ın yakınında zemine taşı ve hareket etmemesi için Anchored'ı işaretle.
  3. Fareyle Pad'in üzerine gel, +'ya tıkla, bir Script ekle, adını TouchPad yap ve aşağıdaki kodu yapıştır.
  4. Play'e bas ve platforma bas. 2 saniye boyunca sarı olur ve Output adını yazar.
Script konum: Workspace.Pad adı: TouchPad
-- Workspace'te Pad adlı bir Part'ın içinde TouchPad adlı Script.
-- Event'ler: bir oyuncu platforma basınca sarı parlar ve Output kimin bastığını söyler.
-- Bir debounce, oyuncu üzerindeyken saniyede birçok kez çalışmasını engeller.

local Players = game:GetService("Players")

local pad = script.Parent :: BasePart
local COOLDOWN_SECONDS = 2

local normalColour = pad.Color
local busy = false

local function onTouched(otherPart: BasePart)
	if busy then
		return -- son dokunuştan beri hâlâ bekleme süresinde
	end
	-- Karakter, dokunan vücut parçasını (ya da şapkayı) içeren Model'dir
	local character = otherPart:FindFirstAncestorOfClass("Model")
	local player = character and Players:GetPlayerFromCharacter(character)
	if not player then
		return -- dokunan bir oyuncu değil, serbest bir parça ya da bir NPC
	end

	busy = true
	print(`{player.Name} stepped on the pad`)
	pad.Color = Color3.fromRGB(255, 220, 0)
	task.wait(COOLDOWN_SECONDS)
	pad.Color = normalColour
	busy = false
end

pad.Touched:Connect(onTouched)
TouchPad bir dokunuştan oyuncuya nasıl ulaşır
KodNe yapar
pad.Touched:Connect(onTouched)Fonksiyonu platformun Touched event'ine bağlar, yani bir şey platforma her dokunduğunda Roblox onTouched'ı çalıştırır ve ona dokunan parçayı verir.
otherPartPlatforma dokunan parça: bir ayak, bir bacak, bir şapkanın kulpu ya da oyuncunun taşıdığı bir araç. Asla oyuncunun kendisi değildir, bu yüzden sonraki iki satır kime ait olduğunu bulur.
otherPart:FindFirstAncestorOfClass("Model")O parçadan yukarı doğru, sınıfı tam olarak Model olan ilk ataya kadar çıkar; bu da karakterdir. Sınıf adının tam eşleşmesi gerektiği için bir şapkayı (Accessory sınıfı) ve eldeki bir aracı (Tool sınıfı) atlar.
Players:GetPlayerFromCharacter(character)O modelin karakteri olduğu Player'ı döndürür, ya da bir NPC gibi kimsenin karakteri değilse nil döndürür. Öndeki character and, hiç model bulunmadığında çağrıyı atlar ve player'ı nil bırakır.
if not player then return endOyuncu olmayan her şey için burada durur. return fonksiyondan erken çıkar.

Platformun neden bir debounce'a ihtiyacı var

Roblox'un debounce sayfası, parçalar temas ettiğinde Touched'ın çok kısa aralıklarla birkaç kez tetiklendiği konusunda uyarıyor ve yürüyen bir karakterin birkaç vücut parçası var. Bir kontrol olmadan platforma tek bir adım birçok satır yazdırabilir ve sarı parlamayı tekrar tekrar sıfırlayabilir.

busy değişkeni debounce'tur. İlk dokunuş onu true yapar ve sonraki 2 saniye içindeki her dokunuş if busy then return end'e ulaşıp durur. task.wait(COOLDOWN_SECONDS)'dan sonra platform rengine döner ve busy yeniden false olur. COOLDOWN_SECONDS büyük harfle yazılmış, çünkü oyun çalışırken değişmeyen bir ayar; Roblox'un sabitler için önerdiği gelenek bu.

Bu platformun herkes için tek bir debounce'u var, yani o 2 saniye içinde basan ikinci bir oyuncu yok sayılır. Parlayan bir platform için sorun değil. Ödül veren bir platformun ise oyuncu başına bir bekleme süresi olmalı, leaderboard rehberindeki (İngilizce) coin platformunun yaptığı gibi.

Adım 4: ilk LocalScript'in ve neden farklı olduğu

Çalışan bir oyun, bir sunucu artı her oyuncu için bir istemcidir (client). Şimdiye kadarki her şey sunucuda çalışan bir Script'ti, yani değişiklikleri tüm oyunculara ulaşıyordu. Bir LocalScript ise sadece tek bir oyuncunun cihazında çalışır. Tuş basışları, kamera ve ekrandaki menüler orada yönetilir, çünkü onları sadece o cihaz bilir.

  1. Explorer'da StarterPlayer'ı aç, fareyle StarterPlayerScripts üzerine gel, +'ya tıkla ve bir LocalScript ekle. Adını MyFirstLocalScript yap ve aşağıdaki kodu yapıştır.
  2. Play'e bas. Output, Client etiketiyle Hello, ve adını gösterir.
  3. Oyun görünümüne tıkla ve E'ye bas. Platform solar. Geri getirmek için yine E'ye bas.
  4. Test hâlâ sürerken, oyunun sunucudaki kopyasına geçmek için Studio'nun test kontrollerindeki Client/Server anahtarına tıkla. Orada platform katı: sunucu değişiklikten hiç haberdar olmadı.
LocalScript konum: StarterPlayerScripts adı: MyFirstLocalScript
-- StarterPlayer > StarterPlayerScripts içinde MyFirstLocalScript adlı LocalScript.
-- LocalScript bir oyuncunun cihazında çalışır. E'ye bas: Pad sadece senin ekranında solar,
-- çünkü burada bir parçaya yapılan değişiklik sunucuya ya da başka kimseye ulaşmaz.

local Players = game:GetService("Players")
local UserInputService = game:GetService("UserInputService")

local player = Players.LocalPlayer
print(`Hello, {player.Name}`) -- Output'ta Client olarak işaretli görünür

UserInputService.InputBegan:Connect(function(input: InputObject, gameProcessed: boolean)
	if gameProcessed then
		return -- tuş başka bir şey için kullanıldı, örneğin sohbete yazmak
	end
	if input.KeyCode == Enum.KeyCode.E then
		local pad = workspace:FindFirstChild("Pad")
		if pad and pad:IsA("BasePart") then
			pad.Transparency = if pad.Transparency == 0 then 0.6 else 0
		end
	end
end)
  • Players.LocalPlayer, scripti cihazında çalıştıran oyuncudur. Roblox onu sadece LocalScript'ler ve onların require ettiği ModuleScript'ler için tanımlar, yani sunucu kodu onu kullanamaz.
  • UserInputService.InputBegan, oyuncu bir tuşa basmaya, tıklamaya ya da dokunmaya başladığında tetiklenir. Motor o girdiyi zaten kullandıysa, örneğin bir butona tıklama ya da sohbet çubuğuna yazılan bir tuş, gameProcessed true olur ve script onu yok sayar.
  • workspace:FindFirstChild("Pad"), Pad adlı child'ı döndürür, ya da yoksa nil. pad:IsA("BasePart"), script Transparency'sini değiştirmeden önce onun gerçekten bir parça olduğunu kontrol eder.
  • if pad.Transparency == 0 then 0.6 else 0 bir if ifadesidir (expression): iki değerden birini seçer. 0 Transparency tamamen görünür, 1 görünmezdir.
  • Bir Shift ile sprint scripti (İngilizce) iyi bir ikinci LocalScript'tir: bir tuşu dinler ve karakterinin WalkSpeed'ini değiştirir.
Script, LocalScript ve ModuleScript
TürNerede çalışırDeğişiklikleri nereye ulaşırNe için kullanılırGenelde nereye konur
ScriptSunucudaTüm oyuncularaOyun kuralları: coin'ler, hasar, kapılar, turlar, kaydetmeServerScriptService, ya da öğrenirken bir parçanın içi
LocalScriptBir oyuncunun cihazındaSadece o cihaza, kendi karakterinin hareketi hariçGirdiler, kamera, ekrandaki menüler, tek oyuncuya özel efektlerStarterPlayerScripts ya da StarterGui
ModuleScriptOnu require() ile çağıran taraftaOnu require eden scriptle aynı yereBirkaç scriptin paylaştığı kodİki taraf için ReplicatedStorage, sadece sunucu için ServerScriptService

Bir hilecinin neleri değiştirebileceği

Bir hilecinin kendi cihazındaki her şeyi kontrol ettiğini varsay. Kendi LocalScript'lerini çalıştırabilir ve seninkileri değiştirebilir, yani platformu ya da başka herhangi bir şeyi kendi ekranında soldurabilir. Burada bu zararsız: soldurma sadece görsel ve onun cihazında kalıyor. Önemli olan her şeye sunucudaki bir Script'in karar vermesinin sebebi de bu.

Bir sunucu Script'i de kendiliğinden güvenli değildir. TouchPad sunucuda çalışıyor, ama her oyuncunun cihazı kendi karakterinin fiziğini kontrol ediyor ve Roblox'un güvenlik dokümantasyonu, Touched'ın ne zaman tetikleneceğiyle oynamayı ya da tetiklenmesini engellemeyi, bir istemcinin kontrol ettiği parçalarla yapabilecekleri arasında sayıyor. Parlayan bir platform için fark etmez. Ödeme yapan bir platform içinse sunucunun kendi kontrol ettiği bir şeyi de kontrol et, örneğin checkpoint'lerin sadece sırayla sayıldığı obby rehberindeki kural (İngilizce) gibi.

Adım 5: dört scripti birlikte test et

  1. Output'u Ctrl+K (Mac'te ⌘K) ile temizle ve Play'e (F5) bas. Output, FirstScript'in sekiz satırını Server etiketiyle, Hello satırını da Client etiketiyle gösterir. ColourChanger'ın parçası her saniye renk değiştirir.
  2. Platforma bas. 2 saniye boyunca sarı olur ve Output adını ve "stepped on the pad"i bir kez gösterir. Üzerinde yürümeye devam et: Touched her tetiklendiğinde değil, en fazla 2 saniyede bir yeni bir satır görünür.
  3. E'ye bas. Platform 0.6 Transparency'ye kadar solar. Yine E'ye bas, katı olur.
  4. Stop'a bas. Test açılır menüsünde Server & Clients'ı seç, 2 istemci ayarla ve Play'e (ya da F7) bas. Studio bir sunucu ve iki istemci penceresi açar. Bir istemcide E'ye bas: platform orada solar, diğer istemci ve sunucu ise onu hâlâ katı görür. Bitirince End Session'a bas.
  5. Bilerek bir şeyi boz. Pad'in adını Pad2 yap ve oyna. Ona basmak onu yine sarı yapar, çünkü TouchPad parçasını adıyla değil script.Parent ile bulur. E'ye basmak artık hiçbir şey yapmaz ve hata da yoktur: FindFirstChild("Pad") nil döndürdü ve if pad and ... kontrolü geri kalanı sessizce atladı. FindFirstChild'dan sonraki satıra print(pad) ekle, oyna ve E'ye bas: Output nil gösterir. Böyle bir print, bir scriptin neden hiçbir şey yapmadığını bulmanın en hızlı yoludur. Stop'a bas, print satırını sil ve parçanın adını yine Pad yap.

Scriptler nereye konur

Bir scriptin nerede olduğu, onun çalışıp çalışmayacağına karar verir ve hiç çalışmayacaksa Studio seni uyarmaz. Bundan sonra yazacağın scriptler için:

Her script türü nereye konur
KonteynerBuraya koyNeden
ServerScriptServiceOyununun kurallarının çoğunu içeren Script'ler: ödüller, turlar, kaydetmeSunucuda çalışırlar ve ServerScriptService'teki hiçbir şey oyunculara gönderilmez.
Workspace'teki bir parçanın içiO parçaya ait bir Script, ColourChanger ve TouchPad gibiÖğrenirken olur: parça script.Parent'tır. Gerçek projeler için Roblox parçaları etiketlemeyi öneriyor (aşağıya bak).
StarterPlayer içindeki StarterPlayerScriptsLocalScript'lerin çoğu: girdiler, kamera, tek oyuncuya özel efektlerHer oyuncu girince kendi kopyasını alır.
StarterGuiEkrandaki bir menüyü yöneten, bir ScreenGui içindeki LocalScript'lerHer oyuncu arayüzün kendi kopyasını alır.
ReplicatedStorageHem sunucu hem istemci kodunun require ettiği ModuleScript'lerİki taraf da onu görebilir. Buraya konan bir LocalScript ya da varsayılan ayarlı bir Script asla çalışmaz.

Roblox'un script konumları sayfası, scriptleri doğrudan Workspace'teki parçaların içine koymamanı öneriyor: parçaları etiketle ve CollectionService ile tek bir ModuleScript'ten onlarla çalış. Bir parçanın içindeki script yine de başlamanın en kolay yolu ve öğrenirken bir iki nesne için yeterli. Kapı rehberi tüm kapılar için tek bir scriptle etiket kalıbını gösteriyor, istemci ve sunucu rehberinde de (ikisi de İngilizce) hangi konteynerlerin hangi scriptleri çalıştırdığının tam tablosu var.

Bir şeyler ters gidince: Output'u oku

Hatalar Output'ta kırmızı görünür. Her biri nerede olduğuyla, scriptin tam adı ve satır numarasıyla başlar, sonra neyin ters gittiğini söyler. Hataya tıkla, Studio o scripti o satırda açar. Örneğin TouchPad'den if not player kontrolünü silseydin ve platformun üzerine serbest bir parça düşseydi, Output şunu gösterirdi:

Output (örnek)
Workspace.Pad.TouchPad:22: attempt to index nil with 'Name'

Kodun yazılışındaki hatalar, örneğin eksik bir end, Play'e basmadan önce görünür: Script Editor onların altını kırmızıyla çizer ve Script Analysis penceresi (Script sekmesindeki Analysis butonu) onları listeler. Bu hatalardan biri olan bir script hiç çalışmaz, öncesindeki satırlar bile.

Tanıman gereken üç hata
MesajNe anlama gelirÇözüm
Colour is not a valid member of Part "Workspace.Part"O nesnede tam o adla bir şey yok. Burada özellik Color diye yazılıyor.Yazımı ve büyük küçük harfleri Properties penceresinden ya da Explorer'dan kopyala. Bu hata hakkında daha fazlası.
attempt to index nil with 'Name'Kod nil olan bir değerden bir şey okudu, burada .Name. Yukarıdaki örnekte platforma serbest bir parça dokunduğu için player nil'di.Değerin neden nil olduğunu bul ve kullanmadan önce if ile kontrol et. Bu hata hakkında daha fazlası.
Expected 'end' (to close 'then' at line 2), got <eof>2. satırdaki if'in end'i yok. Bir fonksiyon için mesaj to close 'function' der; <eof> dosyanın sonu demektir.Eksik end'i ekle; son satıra değil, parantezin belirttiği satıra bak. Mesaj bazen "did you forget to close ... at line N?" ile biter. Bu kısım Luau'nun girintine bakarak yaptığı bir tahmindir ve yanlış bloğu gösterebilir, o yüzden önce parantezdeki satıra bak. Sözdizimi hataları hakkında daha fazlası.

Bir script hiçbir şey yapmıyor ve Output da hiçbir şey göstermiyorsa, genelde hiç çalışmayacağı bir yerdedir ya da hiç tetiklenmeyen bir event'i bekliyordur. Script hataları rehberinde (İngilizce) sessiz scriptler için bir liste var ve Output'un nasıl okunacağını derinlemesine anlatıyor.

Eski script eğitimleri neleri farklı yapıyor

Videolardan ve forum gönderilerinden de öğreniyorsan eski kalıplarla karşılaşacaksın. Önemli olanlar bunlar, her birinin neden sorun olduğuyla birlikte.

Eski eğitimlerdeki kalıplar ve bu rehberin onların yerine yaptığı
EğitimSorunBu rehber
wait(1) ile duraklatıyorRoblox referansı global wait()'i kullanımdan kalkmış olarak işaretliyor ve yerine task.wait()'in geldiğini söylüyor.task.wait(1)
Karakteri otherPart.Parent ile buluyor, Roblox'un kendi lav dersinin yaptığı gibiBir şapka ya da eldeki bir araç parçaya dokunduğunda otherPart.Parent karakter değil Accessory ya da Tool olur, yani hiç Humanoid bulunmaz ve o dokunuş kaybolur.FindFirstAncestorOfClass("Model"), sonra GetPlayerFromCharacter
Touched'ı debounce olmadan kullanıyorTouched tek bir adım için çok kısa aralıklarla birkaç kez tetiklenir, yani kod tekrar tekrar çalışır.Bir busy değişkeni ve bir bekleme
Bir LocalScript'i Workspace'teki bir parçanın içine koyuyorOrada bir LocalScript asla çalışmaz. Sadece bir oyuncuya ait yerlerden çalışır.StarterPlayerScripts içinde LocalScript'ler (neden)
part.Touched:connect(...) ya da table.getn(list) yazıyorRoblox'un adlandırma rehberi camelCase API'lerin çoğunun kullanımdan kalktığını söylüyor ve referans sadece Connect'i içeriyor. table.getn, #list lehine kullanımdan kalktı.:Connect(...) ve #list
Coin'leri bir LocalScript'te değiştiriyor ya da hasarı orada veriyorDeğişiklik o oyuncunun cihazında kalır, yani başka kimse görmez ve sunucu onu hiç saymaz.Oyun kuralları sunucudaki Script'lerde

Pratik: denemen için üç değişiklik

Kodu değiştirmek onu okumaktan daha çok şey öğretir. Bunları kendi oyununda tek tek dene ve her birinden sonra Play'e bas.

  • Platform bir puan versin. Leaderboard rehberinin 1. adımındaki (İngilizce) Leaderstats scriptini ekle. Sonra TouchPad'de busy = true'dan sonra oyuncunun leaderstats klasörünü bul ve Coins değerine 1 ekle. İpucu: player:FindFirstChild("leaderstats"), sonra leaderstats:FindFirstChild("Coins"), sonra coins.Value += 1. Leaderboard rehberindeki coin platformu, oyuncu başına bekleme süresiyle bitmiş bir sürüm.
  • Renk değiştiriciyi de soldur. ColourChanger parçanın Transparency'sini de her saniye değiştirsin. İpucu: { 0, 0.3, 0.6 } gibi 0 ile 1 arasında sayılardan oluşan ikinci bir tablo ekle ve part.Color'dan sonraki satırda aynı index'i kullanarak part.Transparency'yi ondan ayarla.
  • Platformun rengini yazdır. MyFirstLocalScript, E'ye bastığında platformun Color'ını yazdırsın. İpucu: if pad and pad:IsA("BasePart") bloğunun içinde print(pad.Color). Platform sarıyken E'ye bas: istemci sunucunun koyduğu rengi görür, çünkü sunucuda yapılan değişiklikler tüm istemcilere ulaşır.

Sırada ne öğrenmeli

Oyun scriptlerinin çoğunun kurulduğu parçaları artık kullandın. Sonrası için iyi bir sıra:

  1. LocalScript vs Script vs ModuleScript: her script türünün nerede çalıştığı ve neleri değiştirebileceği, adım 4'ten daha ayrıntılı.
  2. RemoteEvents: bir LocalScript'in sunucudan bir şey yapmasını nasıl istediği ve sunucunun isteği nasıl kontrol ettiği.
  3. Bir liderlik tablosu: sunucuda oluşturulan ve değiştirilen ilk istatistiklerin.
  4. İlk oyunun: iki sunucu scriptiyle yönetilen, lavlı, coin'li ve bitiş çizgili kısa bir parkur, sonra da yayınlanması.
  5. Sonra eklemek için bir sistem seç: bir GUI'li mağaza, bir tur sistemi, obby checkpoint'leri, bir yükleme ekranı ya da bir tuşa basınca animasyon. Bir şey bozulduğunda script hataları rehberi mesajı okumana yardım eder. Bu rehberler İngilizce.

Roblox'un Coding fundamentals eğitimleri (İngilizce) iyi bir tamamlayıcı: değişkenlerden ve fonksiyonlardan koşullara, döngülere, array'lere ve dictionary'lere, oradan da kodu ModuleScript'lerle düzenlemeye uzanan, Studio'da kurulacak küçük projeler içeren altı seri.

Yaygın hatalar ve çözümleri

İlk scriptle ilgili sorunların çoğu eşleşmeyen bir ad, yanlış yerdeki bir script ya da beklemesiz bir döngüdür. Test ederken Output'u açık tut.

Play'e basınca Studio donuyor ya da cevap vermiyor

Bir while true do döngüsünün içinde hiç bekleme yok, yani başka hiçbir şey çalışamıyor. Roblox dokümantasyonu, task.wait() gibi bir duraklaması olmayan sonsuz bir döngünün oyunu dondurduğunu ve Studio'yu çökerttiğini söylüyor. Sonsuza kadar tekrarlayan her döngünün içine, ColourChanger'ın yaptığı gibi bir task.wait() koy.

Platforma basınca hiçbir şey olmuyor

TouchPad'in bir LocalScript değil Script olduğunu, doğrudan Pad parçasının içinde olduğunu, devre dışı bırakılmadığını ve platformun CanTouch özelliğinin işaretli olduğunu kontrol et. Sonra onTouched'ın içine ilk satır olarak print("touched", otherPart.Name) koy. Hiç yazdırılmıyorsa event tetiklenmiyor; yazdırılıyorsa sorun daha aşağıda.

E'ye basmak hiçbir şey yapmıyor

MyFirstLocalScript, StarterPlayerScripts içinde bir LocalScript olmalı: Workspace'te ya da ServerScriptService'te bir LocalScript asla çalışmaz. Parçanın adı tam olarak Pad olmalı ve doğrudan Workspace'te durmalı. Önce oyun görünümüne tıkla ve sohbete yazmadığından emin ol, çünkü script oyunun zaten kullandığı tuşları yok sayar.

Parça benim ekranımda değişiyor ama diğer oyuncular için değil

Değişiklik bir LocalScript'te yapıldı, yani senin cihazında kaldı. Bunu bir sunucu Script'inde yap ya da LocalScript bunu bir RemoteEvent ile sunucudan istesin.

ColourChanger bir parçanın içinde çalışıyor ama ServerScriptService'te hata veriyor

Parçası olarak script.Parent'ı kullanıyor. ServerScriptService'te parent ServerScriptService'tir ve onda Anchored ya da Color yoktur, bu yüzden Output bir "not a valid member" hatası gösterir. Onu parçanın içinde bırak ya da parçaya bir ad ver ve onu o adla bul, örneğin local part = workspace:WaitForChild("ColourPart") :: BasePart.

Output hiçbir şey göstermiyor

Output penceresinin açık olduğunu (Window menüsü ya da Script sekmesi) ve hiç filtre olmadığını kontrol et: Output mesaj türüne, Client ya da Server'a ve metne göre filtrelenebilir. Açıksa ve hâlâ boşsa script muhtemelen hiç çalışmadı. Hiçbir şey yapmayan scriptler için listeye (İngilizce) bak.

RoCode ile takıldığın yerden kurtul

Kendi oyununda bir scriptte takılırsan RoCode onu seninle birlikte okuyabilir. RoCode, Roblox Studio için bağımsız bir yapay zeka ajanıdır, Roblox yapmıyor: bir web sohbetine yazarsın, Studio plugin'i de Explorer'ındaki scriptleri oluşturup düzenler.

Öğrenirken işe yarayan mod Ask: scriptleri yine sen yazarsın, RoCode ise var olanı okur ve sorularını cevaplar.

Sen yazarsın

Pad parçasının içindeki TouchPad scriptinin ne yaptığını satır satır açıkla ve neden bir debounce kullandığını söyle.

RoCode yapar
  • Ask modunda sadece Search Scripts ve Read Script gibi okuma araçlarını kullanır ve oyunda hiçbir şeyi değiştirmez
  • Bir şeyin düzeltilmesi gerekiyorsa neyi nerede değiştireceğini söyler ve Build'e geçmeyi önerir
  • Build'de scriptleri yerinde düzenler ve her birinin derlendiğini Check Script ile kontrol eder. Bu bir derleme kontrolüdür, tip kontrolü ya da oyun testi değil
  • Studio'nun Output'unu Check Output aracıyla okur, son testinin Server ve Client satırları dahil, Stop'a bastıktan sonra bile

Build modunda plugin 3.9 ya da üstüyle RoCode kısa bir test yapıp hataları okuyabilir, plugin 3.9.11 ya da üstüyle de oyunun çalıştığını kontrol etmek için bir test karakterini yönetebilir; ama oyun çalışırken ekran görüntüsü almaz, yani platforma yine sen basarsın. RoCode Studio'ya nasıl bağlanır.

Sık sorulan sorular

Roblox Studio'da scriptleri nereye yazarım?

Explorer'da fareyle ServerScriptService gibi bir konteynerin üzerine gel, + butonuna tıkla ve Script'i seç. Studio onu Luau yazdığın Script Editor'da açar. Sunucu scriptleri genelde ServerScriptService'e, LocalScript'ler de StarterPlayerScripts'e ya da StarterGui'ye konur.

Roblox Studio'da bir scripti nasıl çalıştırırım?

Play'e (F5) bas. Studio bir test başlatır ve ServerScriptService ya da Workspace'teki etkin her Script oyun başlar başlamaz çalışır; StarterPlayerScripts'teki LocalScript'ler ise teste girdiğinde çalışır. Run (Play'in yanındaki açılır menüden seç ya da F8'e bas) oyunu avatarın olmadan başlatır, bu rehber için Play'i kullan. Testi bitirmek için Stop'a (Shift+F5) bas. Var olan bir scripti açmak için Explorer'da ona çift tıkla.

Roblox hangi programlama dilini kullanıyor?

Luau. Roblox onu Lua 5.1'den türetilmiş, hızlı, küçük, güvenli ve kademeli tip sistemine sahip bir script dili olarak tanımlıyor, yani Lua eğitimlerinin çoğu hâlâ işe yarar. Luau ters tırnakla string interpolasyonu ve isteğe bağlı tip notları gibi özellikler ekler, Roblox da task.wait gibi kendi kütüphanelerini ve nesnelerini ekler.

Script ile LocalScript arasındaki fark ne?

Bir Script sunucuda çalışır ve değişiklikleri tüm oyunculara ulaşır. Bir LocalScript bir oyuncunun cihazında girdiler, kamera ve ekrandaki menüler gibi şeyler için çalışır; parçalarda, değerlerde ve arayüzde yaptığı değişiklikler o cihazda kalır. İstemci ve sunucu rehberi (İngilizce) ikisini ve ModuleScript'leri anlatıyor.

Roblox Studio'da telefonda ya da iPad'de script yazabilir miyim?

Roblox'un kurulum sayfası Studio'yu Windows ve Mac için ücretsiz bir uygulama olarak tanımlıyor ve telefon ya da tablet sürümünden bahsetmiyor, yani script yazmak için bir bilgisayar gerekiyor.

Scriptim neden hiçbir şey yapmıyor ve hata da göstermiyor?

Genelde o tür scriptin çalışmadığı bir yerdedir (Workspace'te bir LocalScript ya da StarterPlayerScripts'te bir Script), devre dışıdır ya da beklediği event hiç tetiklenmiyordur. Script hataları rehberinde bir kontrol listesi (İngilizce) var.

Roblox'ta script yazmayı öğrenmek ne kadar sürer?

Kimse sana dürüst bir sayı veremez: ne kadar kurduğuna bağlı. En çok işe yarayan şey kendi oyununda sık sık küçük scriptler yazmak. Buradaki dört scripti değiştir, pratik görevlerini dene, sonra ilk oyunun rehberini takip et ve her seferinde bir sistem ekle.

Kaynaklar ve ek okumalar

Kod nasıl kontrol edildi: bu sayfadaki her script, Roblox API tanımlarıyla Luau'nun katı tür denetleyicisinden geçiyor (luau-lsp, 26 Ekim 2026). Tür denetimi yanlış yazılmış API'leri ve hatalı türleri yakalar, oyun mantığını değil. Bu yüzden yayınlamadan önce Studio'da test et.

RoCode'u kendi oyununda dene.

Her gün ücretsiz kredi, kart gerekmez. Plugin'i kur, özelliği anlat ve Studio'da ne oluştuğunu kontrol et.