Birçok geliştirici için, Roblox scripting'e uyum sağlamanın temel zorluğu, dosya konumunun ve Script.RunContext özelliğinin önemidir. Script türüne, Explorer içindeki konumuna ve çalışma bağlamına bağlı olarak, scriptler çok farklı davranabilir. Belirli yöntem çağrıları başarısız olabilir, oyundaki nesnelere erişim sağlanamayabilir veya scriptler hiç çalışmayabilir.
Bu karmaşıklığın nedeni, Roblox oyunlarının varsayılan olarak çok oyunculu olmasıdır. Scriptlerin yalnızca sunucuda çalışabilmesi, yalnızca istemcide çalışabilmesi veya her ikisi arasında paylaşılabilmesi gerekir. Roblox platformunun zamanla evrimi durumu daha da karmaşık hale getirmiştir.
Script türleri
Roblox'ta üç tür script bulunmaktadır:
- Script - Konumuna ve Script.RunContext özelliğine bağlı olarak sunucuda veya istemcide çalışan kod.
- LocalScript - Sadece istemcide çalışan kod. Bir çalışma bağlamına sahip değildir.
- ModuleScript - Diğer scriptlerde yeniden kullanabileceğiniz kod. Bir çalışma bağlamına sahip değildir.
Bir Script oluşturduğunuzda, varsayılan çalışma bağlamı Legacydir, bu da a) sunucu tarafı scripti olduğu ve b) yalnızca ServerScriptService veya Workspace gibi bir sunucu konteynerinde çalıştığı anlamına gelir.
- Script'in çalışma bağlamını Server olarak değiştirirseniz, artık ReplicatedStorage içinde de çalışabilir, ancak bunu önermiyoruz. O konumdaki içerikler istemcilere kopyalanır, bu nedenle sunucu tarafı scriptleri için kötü bir konumdur.
- Script'in çalışma bağlamını Client olarak değiştirirseniz, ReplicatedStorage içinde çalışabilir. Ayrıca StarterCharacterScripts ve StarterPlayerScripts içinde de çalışabilir. Ancak, başlangıç konteynerleri istemcilere kopyalanır, bu nedenle orijinal script ve kopyası çalışır, bu da istenmeyen bir durumdur.
Bir script'in çalışma bağlamını değiştirmek için, Explorer içinde seçin ve Properties penceresindeki değeri değiştirin.

Öneriler
RunContext'u Client olan tek bir Script'i ReplicatedStorage içine koyun.
RunContext'u Server olan tek bir Script'i ServerScriptService içine koyun.
Mümkün olduğunca istemci ve sunucu kodu için ModuleScripts kullanın. Bu modülleri istemci scriptinizden ve sunucu scriptinizden talep edin.
Bu yaklaşım, kodunuza istemci ve sunucu taraflarında tek bir giriş noktası sağlar, bu da organizasyonu basitleştirir ve sorunlu modülleri izole etmeyi veya devre dışı bırakmayı kolaylaştırır. Her ModuleScript'e bir start() fonksiyonu ekleyin, böylece tüm modüller kodlarını çalıştırmaya başlamadan önce yüklenebilir:
Örnek sunucu scripti--!strictlocal ServerScriptService = game:GetService("ServerScriptService")local SampleModule = require(ServerScriptService.SampleModule)local AnotherSampleModule = require(ServerScriptService.AnotherSampleModule)SampleModule.start()AnotherSampleModule.start()Örnek modül--!strictlocal CollectionService = game:GetService("CollectionService")local NPC_TAG = "npc"local SampleModule = {}local function setUpNpc(npc: Instance)-- her NPC'yi başlatendlocal function cleanUpNpc(npc: Instance)-- olay tetiklendiğinde çalışırendfunction SampleModule.start() -- fonksiyonu tabloya ekle-- etiketlere dayalı kurulum için örnek döngüfor _, npc in CollectionService:GetTagged(NPC_TAG) dosetUpNpc(npc)end-- olaylar tetiklendiğinde fonksiyonları çalıştırCollectionService:GetInstanceAddedSignal(NPC_TAG):Connect(setUpNpc)CollectionService:GetInstanceRemovedSignal(NPC_TAG):Connect(cleanUpNpc)endreturn SampleModuleKod paylaşmak için, ReplicatedStorage içinde ModuleScripts kullanın ve bunları hem istemci scriptinizde hem de sunucu scriptinizde talep edin.
Oyununuza gerekli ise, ReplicatedFirst içinde tek bir istemci scripti ve minimum sayıda ModuleScripts ile bir yükleme ekranı uygulamak için aynı deseni tekrarlayın. ReplicatedFirst hakkında daha fazla bilgi için Replication order sayfasına bakın.
LocalScripts'i dikkatli kullanın. Kullanmanız gerekiyorsa, bunları StarterCharacterScripts, StarterPlayerScripts, StarterGui veya StarterPack içine koyun.
Bu konteynerlerdeki scriptler, bir konumdan çalışmak yerine oyuncu konteynerlerine kopyalanır, bu da hata ayıklamayı karmaşık hale getirebilir. İstemci kodu için ReplicatedStorage kullanmak, Output penceresindeki satırlara tıklamanıza ve scriptin kararlı konumu olan ReplicatedStorage.YourScript'e gitmenize olanak tanır; bu, scriptin çalışma zamanında kopyalandığı geçici konum olan Players.YourName.PlayerScripts.YourLocalScript yerine.
Workspace içindeki nesnelere doğrudan script eklemekten kaçının. Bunun yerine, instance'ları etiketleyin ve bunlarla CollectionService üzerinden çalışmak için bir ModuleScript kullanın.
Anahtar istisna, Creator Store'da modeller veya paketler dağıtıyorsanız. Bu durumda, scriptleri instance hiyerarşisi içinde dahil etmeniz gerekebilir; her script için nasıl çalıştığını netleştirmek için bir RunContext belirtin. Bu özelliği açıkça ayarlamak, modellerin ve paketlerin çeşitli konumlardan düzgün çalışmasını sağlama olasılığını artırır.
Örnek proje yapısı
Plant referans projesi, büyük ve karmaşık bir oyunda kodunuzu nasıl organize edebileceğinizi gösterir. Kodunun büyük çoğunluğunu yeniden kullanılabilir ModuleScripts olarak saklar.
Script konumları
| Location | Description |
|---|---|
| Workspace | Oyunun 3D dünyasını temsil eder. Nesnelere doğrudan bağlanan ve davranışlarını kontrol eden sunucu betiklerini çalıştırabilir. |
| ReplicatedFirst | Her şeyden önce istemciye çoğaltılan nesneleri içerir. Bu konum, bir yükleme ekranını görüntülemek için gerekli olan en az nesne ve istemci betiği seti için idealdir. |
| ReplicatedStorage | Hem istemciye hem de sunucuya çoğaltılan nesneleri içerir. Bu konum, Scripts için RunContext değeri Client olan, istemci ModuleScripts ve hem sunucuda hem de istemcide kullanmak istediğiniz ModuleScripts için idealdir. LocalScripts bu konumdan çalışmaz. |
| ServerScriptService | Sunucu betiklerini içerir. Bu konum, oyun mantığı ve bulut depolama gibi sunucu tarafı işlevselliğine veya nesnelerine erişmesi gereken betikler için idealdir. |
| ServerStorage | Sunucu tarafı nesnelerini içerir. Bu konum, bir oyuna katıldıklarında istemcilere hemen çoğaltılmasına gerek olmayan büyük nesneler için idealdir. Betikler bu konumdan çalışmaz, ancak burada sunucu tarafı ModuleScripts depolayabilirsiniz. |
| StarterPlayer ⟩ StarterCharacterScripts | Karakterin doğduğunda çalışan LocalScripts içerir. |
| StarterPlayer ⟩ StarterPlayerScripts | Oyuncu oyuna katıldığında çalışan LocalScripts içerir. |
| StarterGui | İstemcinin oyunu yüklediğinde görüntülediği GUI öğelerini içerir. LocalScripts bu konumdan çalışabilir. |
| StarterPack | Genellikle yalnızca Tools içerir, ancak oyuncu sırt çantalarını ayarlamak için LocalScripts da içerebilir. |
Bu resim, hangi Explorer penceresi konumlarının istemci scriptlerini içerebileceğini gösterir. Unutmayın, ReplicatedFirst ve ReplicatedStorage, Scripts'in RunContext'u Client olan scriptlerini içerebilirken, Starter[] konteynerleri LocalScripts kullanmalıdır.
