Öznitelikler ve Nitelikler

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

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:

  1. İstemci ReplicatedFirst içeriğini yükler, örneğin bir yükleme ekranı, varlıklar ve betikler.

  2. 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üvenli
    local 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ğil
    local 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.

  3. İstemci oyunun geri kalanı yüklemeye devam eder.

  4. Tamamlandığında, Loaded olayı tetiklenir ve IsLoaded() true döner.

  5. 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.

  6. Oyuncunun Character modeli oyunda doğar.

  7. 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.

Explorer'da bir modele bağlı bir betik.

local sign = script.Parent

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

ReplicatedStorage'da bir Klasör içinde bir Model.

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.

ReplicatedStorage'da bir Model.

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.

ReplicatedStorage'da bir klasör içinde bir betik.

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ştir

local cabbage = script.Parent
cabbage: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 Al

local cabbage = script.Parent
cabbage: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 Al

local cabbage = script.Parent
local cabbageAttributes = cabbage:GetAttributes()
print(cabbageAttributes.GrowthRate) --> 2
for k, v in cabbageAttributes do
print(k, v)
end

Nitelikleri silin

Bir niteliği silmek için, değerini nil olarak ayarlayın.

Nitelik Sil

local cabbage = script.Parent
cabbage:SetAttribute("GrowthRate", nil)

Değişiklikleri tespit edin

Özelliklerde ve niteliklerdeki değişiklikleri dinlemek için birkaç yol vardır:

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)
©2026 Roblox Corporation. Roblox, the Roblox logo and Powering Imagination are among our registered and unregistered trademarks in the U.S. and other countries.