Oyunları etkileşimli hale getirmek, genellikle nesne özelliklerini ve niteliklerini değiştirmek anlamına gelir:
Özellikler, nesne sınıfının bir parçasıdır. Örneğin, BasePart.Anchored özelliği parçanın fizik davranışını kontrol eder. Bir atletizm oyununda, bir disk veya mızrak yere düştüğünde sabitlemek isteyebilirsiniz, böylece oyuncular ne kadar uzağa gittiğine dair görsel bir göstergeye sahip olurlar.
Nitelikler temelde sizin tanımladığınız özel özelliklerdir. Örneğin, Plant referans projesi, tohumların satın alma fiyatını ve bir saksının tutabileceği maksimum bitki boyutunu ayarlamak için nitelikleri kullanır.
Replikasyon sırası
Nesneleri elde etmeye ve manipüle etmeye başlamadan önce replikasyon sırasını anlamanız gerekir.
Roblox Motoru, sunucudan istemciye nesnelerin (ve nesnelerdeki değişikliklerin) hangi sırayla replike edildiğini garanti etmez; bu da Instance:WaitForChild() yönteminin istemci betiklerinde nesnelere erişim için hayati önem taşıdığı anlamına gelir, özellikle Workspace içindeki nesneler için.
Örneğin, bir sunucu betiği Workspace'deki bir örneğin özelliğini değiştirip ardından RemoteEvent:FireAllClients() çağırırsa, özellik değişikliği RemoteEvent.OnClientEvent tetiklenmeden önce veya sonra istemciye replike olabilir. Var olan yöntemleri ve olayları değişiklikleri algılamak için kullanın, bir değişikliğin yeniden oluştuğunu varsaymak yerine. Aynı türdeki değişiklikler, örneğin iki niteliğin değişimi, genellikle sırayla gelir.
İstemciler bir oyunu ilk başlattıklarında, replikasyon ve betik yürütme ile ilgili bazı yönler tahmin edilebilir:
İstemci ReplicatedFirst içeriğini yükler, örneğin bir yükleme ekranı, varlıklar ve betikler.
LocalScripts (ve Scripts RunContext değeri Client olan) ReplicatedFirst içinde çalışır. Bu betikler, Instance:WaitForChild() kullanmadan ReplicatedFirst içinden nesneleri güvenle alabilir:
-- Güvenlilocal ReplicatedFirst = game:GetService("ReplicatedFirst")local LoadingScreen = require(ReplicatedFirst.LoadingScreen)Bu betikler, diğer servislerden nesneleri güvenle alamaz; çünkü henüz yüklenmemiş olabilirler:
-- Güvenli değillocal ReplicatedStorage = game:GetService("ReplicatedStorage")local PickupManager = require(ReplicatedStorage.PickupManager)Bu betiklerde diğer servislerden nesneleri almak için WaitForChild() kullanabilirsiniz, ancak bu, ReplicatedFirst kullanmanın faydalarını ortadan kaldırır.
İstemci oyunun geri kalanı yüklemeye devam eder.
Tamamlandığında, Loaded olayı tetiklenir ve IsLoaded() true döner.
Players.[Player].PlayerScripts içindeki LocalScripts (kopyalanmış StarterPlayerScripts'ten) çalışır, ayrıca ReplicatedStorage içindeki istemci Scripts de çalışır. Bu betikler, ReplicatedStorage'den nesneleri güvenle almak için WaitForChild() kullanabilirler.
Oyuncunun Character modeli oyunda doğar.
Workspace.[Character] içindeki LocalScripts (kopyalanmış StarterCharacterScripts'ten) çalışır.
Eğer oyununuz örnek akışı (Workspace.StreamingEnabled) kullanıyorsa, bazı veya çoğu nesne çalışma alanına yüklenmemiş olabilir, bu nedenle çalışma alanı nesnelerine erişmek için WaitForChild() kullanmak çok daha önemli bir güvenlik önlemi haline gelir. Özellikle, akışı içeri al ve model başına akış kontrolü hakkında daha fazla bilgi için yükleme ve akış davranışını ayarlamak için detaylara bakın.
Nesneleri alın
Nesne özelliklerini ve niteliklerini değiştirmek için ilk adım, nesneye bir referans elde etmektir. En basit çözüm, betiği Explorer'da nesnenin çocuğu yapmak ve nesneye referans vermek için script.Parent kullanmaktır.

local sign = script.Parent
Daha evrensel çözüm, Instance:FindFirstChild() veya Instance:WaitForChild() gibi yöntemleri kullanarak nesneyi bir servisten almanızdır.

local ReplicatedStorage = game:GetService("ReplicatedStorage")local signsFolder = ReplicatedStorage:WaitForChild("Signs")local sign = signsFolder:WaitForChild("InteractiveSign")
Özellikleri değiştirin
Özelliklere erişmek oldukça basittir — yalnızca nesne referansından sonra . kullanın — ancak bir model ile çalışıyorsanız, modelin kendisi yerine tekil bir parçayı seçmeniz gerekebilir.

local ReplicatedStorage = game:GetService("ReplicatedStorage")local chair = ReplicatedStorage:WaitForChild("Chair")chair.LeftArmRest.Size = Vector3.new(10, 1, 10)
Nitelikler oluşturun
Nitelikleri programlı olarak oluşturabilirsiniz, ancak daha yaygın çözüm, Stüdyo kullanıcı arayüzünde varsayılan değerlerle oluşturmaktır. Sonra, oyuncu eylemlerine yanıt olarak değerlerini değiştirmek için betikler kullanabilirsiniz.

Stüdyoda nitelik oluşturma hakkında bilgi için örnek nitelikleri görün.
Nitelikleri ayarlayın
Bir niteliğin değerini değiştirmek için Instance:SetAttribute() çağrısını, bir ad ve değer ile yapın.
Nitelik Oluştur veya Değiştirlocal cabbage = script.Parentcabbage:SetAttribute("Harvestable", true)
Eğer nitelik daha önce yoksa, bu yöntem onu oluşturur.
Nitelik değerlerini alın
Bir mevcut niteliğin değerini almak için, örneğin Instance:GetAttribute() çağrısını yapın.
Nitelik Değerini Allocal cabbage = script.Parentcabbage:SetAttribute("Harvestable", true)local isHarvestable = cabbage:GetAttribute("Harvestable")print(isHarvestable) --> true
Benzer şekilde, Instance:GetAttributes() çağrısını yaparak tüm nitelikleri alabilirsiniz. Bu yöntem bir anahtar-değer çiftleri sözlüğü döner.
Tüm Nitelikleri Allocal cabbage = script.Parentlocal cabbageAttributes = cabbage:GetAttributes()print(cabbageAttributes.GrowthRate) --> 2for k, v in cabbageAttributes doprint(k, v)end
Nitelikleri silin
Bir niteliği silmek için, değerini nil olarak ayarlayın.
Nitelik Sillocal cabbage = script.Parentcabbage:SetAttribute("GrowthRate", nil)
Değişiklikleri tespit edin
Özelliklerde ve niteliklerdeki değişiklikleri dinlemek için birkaç yol vardır:
- Instance.AttributeChanged olayı, herhangi bir niteliğe yapılan değişiklikleri dinler ve değiştirilmiş niteliğin adını bir parametre olarak geçirir.
- Instance:GetPropertyChangedSignal() yöntemi, bir özelliğe yapılan değişiklikleri dinlemenizi sağlar ve parametre geçmez.
- Instance:GetAttributeChangedSignal() yöntemi, bir niteliğe yapılan değişiklikleri dinlemenizi sağlar ve parametre geçmez.
Bu olayların ve yöntemlerin geçirdiği parametreler çok az bilgi içerdiği için, hepsi anonim fonksiyonlar için iyi bir uyum sağlar, özellikle Instance:GetPropertyChangedSignal() ve Instance:GetAttributeChangedSignal(). Anonim fonksiyonlar ve olaylarla çalışma hakkında daha fazla bilgi için Olaylar bölümüne bakın.
Değişiklikleri Dinle
local cabbage = script.Parent
-- Yerel fonksiyonlar
local function onAnyPropertyChange(property)
-- Niteliklere yapılan değişiklikleri görmezden gel
if property ~= "Attributes" then
print(property) --> Name
print(cabbage[property]) --> Cabbage1
end
end
local function onAnyAttributeChange(attribute)
print(attribute) --> Grow, GrowthRate
print(cabbage:GetAttribute(attribute)) --> false, 3
end
-- Değişiklikleri dinle ve yerel fonksiyonlara bağlan
cabbage.Changed:Connect(onAnyPropertyChange)
cabbage.AttributeChanged:Connect(onAnyAttributeChange)
-- Değişiklikleri dinle ve anonim fonksiyonlara bağlan
cabbage:GetPropertyChangedSignal("Name"):Connect(function()
print(cabbage.Name) --> Cabbage1
end)
cabbage:GetAttributeChangedSignal("GrowthRate"):Connect(function()
print(cabbage:GetAttribute("GrowthRate")) --> 3
end)
-- Changed ve GetPropertyChangedSignal() tetiklenir
cabbage.Name = "Cabbage1"
-- Changed ve AttributeChanged tetiklenir
cabbage:SetAttribute("Grow", false)
-- Changed, AttributeChanged ve GetAttributeChangedSignal() tetiklenir
cabbage:SetAttribute("GrowthRate", 3)