Membuat permainan interaktif sering berarti memanipulasi properti dan atribut objek:
Properti adalah bagian dari kelas objek. Misalnya, properti BasePart.Anchored mengontrol fisika untuk bagian tersebut. Dalam permainan lintasan dan lapangan, Anda mungkin ingin menambatkan cakram atau lembing segera setelah ia mendarat sehingga pemain memiliki indikator visual sejauh mana ia telah meluncur.
Atribut pada dasarnya adalah properti kustom yang Anda definisikan. Misalnya, proyek referensi Plant menggunakan atribut untuk menetapkan harga pembelian untuk benih dan ukuran maksimum tanaman yang dapat ditampung pot.
Urutan replikasi
Sebelum Anda mulai mengambil dan memanipulasi objek, Anda harus memiliki pemahaman tentang urutan replikasi.
Mesin Roblox tidak menjamin urutan di mana objek (dan perubahan pada objek) direplikasi dari server ke klien, yang menjadikan metode Instance:WaitForChild() sangat penting untuk mengakses objek dalam skrip klien, terutama objek dalam Workspace.
Misalnya, jika skrip server mengubah properti dari suatu instance di Workspace dan kemudian memanggil RemoteEvent:FireAllClients(), perubahan properti tersebut mungkin direplikasi ke klien sebelum atau setelah RemoteEvent.OnClientEvent dipicu. Gunakan metode dan peristiwa yang tersedia untuk mendeteksi perubahan daripada berasumsi bahwa perubahan telah direplikasi. Perubahan dari jenis yang sama, seperti dua perubahan atribut, umumnya akan tiba dalam urutan.
Ketika klien pertama kali meluncurkan permainan, beberapa aspek replikasi dan eksekusi skrip dapat diprediksi:
Klien memuat konten dari ReplicatedFirst, seperti layar loading, aset, dan skrip.
LocalScripts (dan Scripts dengan RunContext dari Client) di ReplicatedFirst dijalankan. Skrip ini dapat dengan aman mendapatkan objek dari ReplicatedFirst tanpa menggunakan Instance:WaitForChild():
-- Amanlocal ReplicatedFirst = game:GetService("ReplicatedFirst")local LoadingScreen = require(ReplicatedFirst.LoadingScreen)Skrip ini tidak dapat dengan aman mendapatkan objek dari layanan lain, karena mereka mungkin belum dimuat:
-- Tidak amanlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local PickupManager = require(ReplicatedStorage.PickupManager)Anda bisa menggunakan WaitForChild() dalam skrip ini untuk mendapatkan objek dari layanan lain, tetapi melakukan hal ini menghilangkan manfaat dari menggunakan ReplicatedFirst.
Klien melanjutkan memuat sisa permainan.
Ketika selesai, acara Loaded dipicu dan IsLoaded() mengembalikan nilai true.
LocalScripts di Players.[Player].PlayerScripts (disalin dari StarterPlayerScripts) dijalankan, serta Scripts klien di ReplicatedStorage. Skrip ini dapat dengan aman mendapatkan objek dari ReplicatedStorage tanpa menggunakan WaitForChild().
Model Character pemain muncul di dalam permainan.
LocalScripts di Workspace.[Character] (disalin dari StarterCharacterScripts) dijalankan.
Jika permainan Anda menggunakan streaming instance (Workspace.StreamingEnabled), beberapa atau sebagian besar objek mungkin belum dimuat ke dalam workspace, sehingga menggunakan WaitForChild() untuk mengakses objek workspace menjadi langkah pengamanan yang jauh lebih penting. Secara khusus, lihat stream in dan kontrol streaming per-model untuk informasi tambahan tentang memuat dan menyetel perilaku streaming.
Mengambil objek
Langkah pertama untuk memodifikasi properti dan atribut objek adalah mendapatkan referensi ke objek tersebut. Solusi paling sederhana adalah membuat skrip sebagai anak objek di Explorer dan menggunakan script.Parent untuk merujuk objek tersebut.

local sign = script.Parent
Solusi yang lebih universal adalah mendapatkan objek dari layanan menggunakan metode seperti Instance:FindFirstChild() atau Instance:WaitForChild().

local ReplicatedStorage = game:GetService("ReplicatedStorage")local signsFolder = ReplicatedStorage:WaitForChild("Signs")local sign = signsFolder:WaitForChild("InteractiveSign")
Memodifikasi properti
Properti cukup mudah diakses — cukup gunakan . setelah referensi objek — walaupun jika Anda bekerja dengan model, Anda mungkin perlu memilih bagian individual daripada model itu sendiri.

local ReplicatedStorage = game:GetService("ReplicatedStorage")local chair = ReplicatedStorage:WaitForChild("Chair")chair.LeftArmRest.Size = Vector3.new(10, 1, 10)
Membuat atribut
Meskipun Anda dapat membuat atribut secara programatis, solusi yang lebih umum adalah membuatnya dengan nilai default di antarmuka pengguna Studio. Kemudian Anda dapat menggunakan skrip untuk memodifikasi nilainya sebagai respons terhadap tindakan pemain.

Untuk informasi tentang membuat atribut di Studio, lihat atribut instance.
Mengatur atribut
Untuk memodifikasi nilai atribut, panggil Instance:SetAttribute() dengan nama dan nilai.
Buat atau Modifikasi Atributlocal cabbage = script.Parentcabbage:SetAttribute("Harvestable", true)
Jika atribut tersebut belum ada, metode ini akan membuatnya.
Mendapatkan nilai atribut
Untuk mendapatkan nilai dari satu atribut yang ada, panggil Instance:GetAttribute() pada instance.
Dapatkan Nilai Atributlocal cabbage = script.Parentcabbage:SetAttribute("Harvestable", true)local isHarvestable = cabbage:GetAttribute("Harvestable")print(isHarvestable) --> true
Demikian pula, Anda dapat mendapatkan semua atribut dengan memanggil Instance:GetAttributes(). Metode ini mengembalikan kamus pasangan kunci-nilai.
Dapatkan Semua Atributlocal cabbage = script.Parentlocal cabbageAttributes = cabbage:GetAttributes()print(cabbageAttributes.GrowthRate) --> 2for k, v in cabbageAttributes doprint(k, v)end
Menghapus atribut
Untuk menghapus atribut, atur nilainya ke nil.
Hapus Atributlocal cabbage = script.Parentcabbage:SetAttribute("GrowthRate", nil)
Mendeteksi perubahan
Ada beberapa cara untuk mendengarkan perubahan pada properti dan atribut:
- Acara Instance.AttributeChanged mendengarkan perubahan pada atribut apa pun dan mengirimkan nama atribut yang berubah sebagai parameter.
- Metode Instance:GetPropertyChangedSignal() memungkinkan Anda mendengarkan perubahan pada satu properti dan tidak mengirimkan parameter.
- Metode Instance:GetAttributeChangedSignal() memungkinkan Anda mendengarkan perubahan pada satu atribut dan tidak mengirimkan parameter.
Karena informasi minimal yang diberikan oleh acara dan metode ini sebagai parameter, semuanya cocok untuk fungsi anonim, terutama Instance:GetPropertyChangedSignal() dan Instance:GetAttributeChangedSignal(). Untuk mempelajari lebih lanjut tentang fungsi anonim dan bekerja dengan acara, lihat Acara.
Dengarkan Perubahan
local cabbage = script.Parent
-- Fungsi Lokal
local function onAnyPropertyChange(property)
-- Abaikan perubahan pada atribut
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
-- Dengarkan perubahan dan hubungkan ke fungsi lokal
cabbage.Changed:Connect(onAnyPropertyChange)
cabbage.AttributeChanged:Connect(onAnyAttributeChange)
-- Dengarkan perubahan dan hubungkan ke fungsi anonim
cabbage:GetPropertyChangedSignal("Name"):Connect(function()
print(cabbage.Name) --> Cabbage1
end)
cabbage:GetAttributeChangedSignal("GrowthRate"):Connect(function()
print(cabbage:GetAttribute("GrowthRate")) --> 3
end)
-- Memicu Changed dan GetPropertyChangedSignal()
cabbage.Name = "Cabbage1"
-- Memicu Changed dan AttributeChanged
cabbage:SetAttribute("Grow", false)
-- Memicu Changed, AttributeChanged, dan GetAttributeChangedSignal()
cabbage:SetAttribute("GrowthRate", 3)