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ı globalwait()'i kullanımdan kalkmış ve yerinetask.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
Başlamadan önce: Studio, bir Baseplate ve Output penceresi
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.
- Roblox'un Windows ve Mac için ücretsiz uygulaması Roblox Studio'yu kur ve Roblox hesabınla giriş yap.
- 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.
- 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.
- Output'u Window menüsünden ya da Script sekmesinden aç. Scriptlerinin mesajları ve hataları orada görünür.
- 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ç.
| Script | Tür | Nereye konur | Ne öğretir |
|---|---|---|---|
FirstScript | Script | ServerScriptService | Değişkenler, bir fonksiyon, bir if ifadesi, döngüler ve bir tablo |
ColourChanger | Script | Workspace'teki bir Part'ın içine | Özellik değiştirmek, script.Parent ve bekleyen bir döngü |
TouchPad | Script | Pad adlı bir Part'ın içine | Event'ler, bir parçaya dokunan oyuncuyu bulmak ve bir debounce |
MyFirstLocalScript | LocalScript | StarterPlayer içindeki StarterPlayerScripts | Bir oyuncunun cihazında çalışan kod, tuş basışları ve o cihazda kalan şeyler |
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
- 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.
- Yeni scripte sağ tıkla, Rename'i seç ve adını
FirstScriptyap. Ad scriptin ne yaptığını değiştirmez, ama hangi scriptin neyi yazdırdığını söyler. - Yeni scriptler tek bir satırla başlar:
print("Hello world!"). Onu sil ve aşağıdaki kodu yapıştır. - 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.
- 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.
-- 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.
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.
| Kod | Fikir | Ne anlama gelir |
|---|---|---|
local gameName = "Coin Run" | Değişken | Bir 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): string | Fonksiyon | İ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. |
return | Dönüş değeri | Fonksiyonu ç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 interpolasyonu | Ters tırnak içindeki metin değerler içerebilir: Luau {name} ve {goal}'u güncel değerleriyle değiştirir. |
if, elseif, else, end | If ifadesi | Luau 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 do | Sayı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 do | Tablo 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.
- Home sekmesinde Part'a tıkla. Studio Workspace'e bir blok ekler. Adı önemli değil.
- Explorer'da fareyle yeni parçanın üzerine gel, +'ya tıkla ve bir Script ekle. Adını
ColourChangeryap ve içeriğini aşağıdaki kodla değiştir. - Play'e bas. Parça kırmızı, sonra mavi, sonra yeşil olur, saniyede bir değişir ve baştan başlar.
-- 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.:: BasePartbir 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.Colorvepart.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 özellikColor'dır.Anchored = trueparç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.#colourslistenin uzunluğudur, yani 3, ve%bölmeden kalanı verir; bu yüzdenindex % #colours + 11, 2, 3, 1, 2, 3 diye sayar.while true dosonsuza kadar tekrarlar, içindekitask.wait(1)bu yüzden önemli. Roblox dokümantasyonu sonsuz bir döngüye her zamantask.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.
- Başka bir Part ekle ve adını tam olarak
Padyap, 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. - Onu üzerine basabileceğin düz bir platform yap, örneğin Properties penceresinde
Size'ını6, 1, 6yaparak. SpawnLocation'ın yakınında zemine taşı ve hareket etmemesi için Anchored'ı işaretle. - Fareyle Pad'in üzerine gel, +'ya tıkla, bir Script ekle, adını
TouchPadyap ve aşağıdaki kodu yapıştır. - Play'e bas ve platforma bas. 2 saniye boyunca sarı olur ve Output adını yazar.
-- 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)
| Kod | Ne 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. |
otherPart | Platforma 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 end | Oyuncu 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.
- Explorer'da StarterPlayer'ı aç, fareyle StarterPlayerScripts üzerine gel, +'ya tıkla ve bir LocalScript ekle. Adını
MyFirstLocalScriptyap ve aşağıdaki kodu yapıştır. - Play'e bas. Output, Client etiketiyle
Hello,ve adını gösterir. - Oyun görünümüne tıkla ve E'ye bas. Platform solar. Geri getirmek için yine E'ye bas.
- 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ı.
-- 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ş,gameProcessedtrueolur ve script onu yok sayar.workspace:FindFirstChild("Pad"), Pad adlı child'ı döndürür, ya da yoksanil.pad:IsA("BasePart"), scriptTransparency'sini değiştirmeden önce onun gerçekten bir parça olduğunu kontrol eder.if pad.Transparency == 0 then 0.6 else 0bir 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.
| Tür | Nerede çalışır | Değişiklikleri nereye ulaşır | Ne için kullanılır | Genelde nereye konur |
|---|---|---|---|---|
| Script | Sunucuda | Tüm oyunculara | Oyun kuralları: coin'ler, hasar, kapılar, turlar, kaydetme | ServerScriptService, ya da öğrenirken bir parçanın içi |
| LocalScript | Bir oyuncunun cihazında | Sadece o cihaza, kendi karakterinin hareketi hariç | Girdiler, kamera, ekrandaki menüler, tek oyuncuya özel efektler | StarterPlayerScripts ya da StarterGui |
| ModuleScript | Onu require() ile çağıran tarafta | Onu require eden scriptle aynı yere | Birkaç 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
- 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.
- 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.
- E'ye bas. Platform 0.6 Transparency'ye kadar solar. Yine E'ye bas, katı olur.
- 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.
- Bilerek bir şeyi boz. Pad'in adını
Pad2yap ve oyna. Ona basmak onu yine sarı yapar, çünkü TouchPad parçasını adıyla değilscript.Parentile bulur. E'ye basmak artık hiçbir şey yapmaz ve hata da yoktur:FindFirstChild("Pad")nildöndürdü veif pad and ...kontrolü geri kalanı sessizce atladı.FindFirstChild'dan sonraki satıraprint(pad)ekle, oyna ve E'ye bas: Outputnilgö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:
| Konteyner | Buraya koy | Neden |
|---|---|---|
| ServerScriptService | Oyununun kurallarının çoğunu içeren Script'ler: ödüller, turlar, kaydetme | Sunucuda çalışırlar ve ServerScriptService'teki hiçbir şey oyunculara gönderilmez. |
| Workspace'teki bir parçanın içi | O 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 StarterPlayerScripts | LocalScript'lerin çoğu: girdiler, kamera, tek oyuncuya özel efektler | Her oyuncu girince kendi kopyasını alır. |
| StarterGui | Ekrandaki bir menüyü yöneten, bir ScreenGui içindeki LocalScript'ler | Her oyuncu arayüzün kendi kopyasını alır. |
| ReplicatedStorage | Hem 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:
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.
| Mesaj | Ne 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.
| Eğitim | Sorun | Bu rehber |
|---|---|---|
wait(1) ile duraklatıyor | Roblox 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ığı gibi | Bir ş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ıyor | Touched 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 koyuyor | Orada 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ıyor | Roblox'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 veriyor | Değ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 oyuncununleaderstatsklasörünü bul veCoinsdeğerine 1 ekle. İpucu:player:FindFirstChild("leaderstats"), sonraleaderstats:FindFirstChild("Coins"), sonracoins.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 vepart.Color'dan sonraki satırda aynıindex'i kullanarakpart.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çindeprint(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:
- 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ı.
- RemoteEvents: bir LocalScript'in sunucudan bir şey yapmasını nasıl istediği ve sunucunun isteği nasıl kontrol ettiği.
- Bir liderlik tablosu: sunucuda oluşturulan ve değiştirilen ilk istatistiklerin.
- İlk oyunun: iki sunucu scriptiyle yönetilen, lavlı, coin'li ve bitiş çizgili kısa bir parkur, sonra da yayınlanması.
- 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.
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.
- 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
- Roblox Creator Docs: Luau (İngilizce). Luau nedir ve nereden geliyor
- Roblox Creator Docs: Roblox Studio setup (İngilizce). Windows ve Mac, ve sistem gereksinimleri
- Roblox Creator Docs: Output (İngilizce). Output'u açmak, filtreler, Show Context ve Show Source
- Roblox Creator Docs: Studio testing modes (İngilizce). Play, Run, Stop, Client/Server anahtarı ve Server & Clients
- Roblox Creator Docs: Script Editor (İngilizce). yeni scriptlerin nerede açıldığı ve Script Analysis
- Roblox Creator Docs: Script types and locations (İngilizce). her script türünün nerede çalıştığı ve scriptleri içine koymak yerine parçaları etiketlemek
- Roblox Creator Docs: Script (İngilizce). bir Script ne zaman çalışmaya başlar
- Roblox Creator Docs: Control structures (İngilizce). if ifadeleri, döngüler ve sonsuz bir döngünün neden beklemeye ihtiyacı olduğu
- Roblox Creator Docs: Events (İngilizce). Connect ve Touched'ın fonksiyonuna ne verdiği
- Roblox Creator Docs: Debounce patterns (İngilizce). Touched'ın tek bir temas için neden birkaç kez tetiklendiği
- Roblox Creator Docs: wait (İngilizce). global wait() ve task.wait()
- Roblox Creator Docs: Network ownership, movement validation and physics exploits (İngilizce). bir istemcinin kendi karakteriyle neler yapabileceği
- Roblox Creator Docs: Coding fundamentals (İngilizce). Roblox'un yeni başlayanlar için serisi
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.