Membuat pengalaman interaktif sering berarti memanipulasi properti dan atribut objek:
Properties adalah bagian dari kelas objek.Sebagai contoh, kontrol properti BasePart.Anchored memeriksa fisika bagian.Dalam pengalaman trek dan lapangan, Anda mungkin ingin mengunci diskus atau javelin segera setelah mendarat sehingga pemain memiliki indikator visual tentang seberapa jauh mereka melakukan perjalanan.
Atribut pada dasarnya adalah properti khusus yang Anda definisikan.Sebagai contoh, proyek referensi Tanaman menggunakan atribut untuk menetapkan harga pembelian untuk benih dan ukuran tanaman maksimum yang dapat ditampung oleh pot.
Pesanan replikasi
Sebelum Anda mulai mengambil dan memanipulasi objek, Anda harus memiliki pemahaman tentang urutan replikasi.
Mesin Roblox tidak menjamin urutan di mana objek direplikasi dari server ke klien, yang membuat metode Instance:WaitForChild() penting untuk mengakses objek di skrip klien, terutama objek di Workspace.Namun, beberapa aspek dari prosesnya dapat diprediksi:
Klien memuat konten dari ReplicatedFirst , seperti layar pemuatan, aset, dan skrip.
LocalScripts (dan Scripts dengan RunContext dari Client ) di ReplicatedFirst jalankan.Skrip ini dapat dengan aman mendapatkan objek dari ReplicatedFirst tanpa menggunakan WaitForChild() :
-- Amankahlocal ReplicatedFirst = game:GetService("ReplicatedFirst")local LoadingScreen = require(ReplicatedFirst.LoadingScreen)Skrip ini tidak bisa mendapatkan objek dari layanan lain secara aman, 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 melakukannya menghilangkan manfaat menggunakan ReplicatedFirst .
Klien terus memuat sisa pengalaman.
Saat selesai, acara game.Loaded terjadi dan game:IsLoaded() kembali benar.
LocalScripts di Players.Player.PlayerScripts (dityalin dari StarterPlayerScripts ) jalankan, serta klien Scripts di ReplicatedStorage .Skrip ini dapat dengan aman mendapatkan objek dari ReplicatedStorage tanpa menggunakan WaitForChild() .
Model pemain Character muncul di pengalaman.
LocalScripts di Workspace.Character (dityalin dari StarterCharacterScripts ) jalankan.
Jika pengalaman Anda menggunakan streaming instansi ( Workspace.StreamingEnabled ), beberapa atau sebagian besar objek mungkin tidak dimuat ke ruang kerja, jadi menggunakan WaitForChild() untuk mengakses objek ruang kerja menjadi langkah keselamatan yang lebih penting.Secara khusus, lihat Stream di dan kontrol streaming per model untuk informasi tambahan tentang pemuatan dan penyetelan perilaku streaming.
Dapatkan objek
Langkah pertama untuk memodifikasi properti dan atribut objek adalah mendapatkan referensi ke objek.Solusi termudah adalah membuat skrip menjadi anak dari objek di Explorer dan menggunakan script.Parent untuk merujuk ke objek.

local sign = script.Parent
Solusi yang lebih universal adalah untuk mendapatkan objek dari layanan menggunakan metode seperti atau .

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

local ReplicatedStorage = game:GetService("ReplicatedStorage")local chair = ReplicatedStorage:WaitForChild("Chair")chair.LeftArmRest.Size = Vector3.new(10, 1, 10)
Buat atribut
Meskipun Anda dapat membuat atribut secara programatik, solusi yang paling umum adalah membuatnya dengan nilai default di antarmuka pengguna Studio.Kemudian Anda dapat menggunakan skrip untuk memodifikasi nilai mereka dalam menanggapi tindakan pemain.

Untuk informasi tentang membuat atribut di Studio, lihat atribut instansi.
Tetapkan attribute
Untuk memodifikasi nilai atribut, panggil Instance:SetAttribute() dengan nama dan nilai.
Buat atau Modifikasi Atribut
local cabbage = script.Parentcabbage:SetAttribute("Harvestable", true)
Jika atributnya belum ada, metode ini membuatnya.
Dapatkan nilai atribut
Untuk mendapatkan nilai satu atribut yang ada, panggil Instance:GetAttribute() pada kejadian.
Dapatkan Nilai Atribut
local 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 men返ikan dictionary pasangan kunci-nilai.
Dapatkan Semua Atribut
local cabbage = script.Parentlocal cabbageAttributes = cabbage:GetAttributes()print(cabbageAttributes.GrowthRate) --> 2for k, v in cabbageAttributes doprint(k, v)end
Hapus atribut
Untuk menghapus atribut, atur nilainya menjadi nil .
Menghapus Atribut
local cabbage = script.Parentcabbage:SetAttribute("GrowthRate", nil)
Deteksi perubahan
Ada beberapa cara untuk mendengarkan perubahan properti dan atribut:
- Daftar peristiwa Instance.AttributeChanged mendengarkan perubahan pada setiap atribut dan mengirimkan nama atribut yang diubah sebagai parameter.
- Metode Instance:GetPropertyChangedSignal() memungkinkan Anda mendengarkan perubahan pada satu properti dan tidak mengirim parameter.
- Metode Instance:GetAttributeChangedSignal() memungkinkan Anda mendengarkan perubahan pada satu atribut dan tidak mengirim parameter.
Karena informasi minimal yang dilewati oleh peristiwa 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 peristiwa, lihat Peristiwa.
Dengarkan Perubahan
local cabbage = script.Parent
-- Fungsi lokal
local function onAnyPropertyChange(property)
-- Abaikan perubahan atribut
if property ~= "Attributes" then
print(property) --> Nama
print(cabbage[property]) --> Kubis1
end
end
local function onAnyAttributeChange(attribute)
print(attribute) --> Tumbuh, Tingkat Pertumbuhan
print(cabbage:GetAttribute(attribute)) --> salah, 3
end
-- Dengarkan perubahan danhubungkan ke fungsi lokal
cabbage.Changed:Connect(onAnyPropertyChange)
cabbage.AttributeChanged:Connect(onAnyAttributeChange)
-- Dengarkan perubahan danhubungkan ke fungsi anonim
cabbage:GetPropertyChangedSignal("Name"):Connect(function()
print(cabbage.Name) --> Kubis1
end)
cabbage:GetAttributeChangedSignal("GrowthRate"):Connect(function()
print(cabbage:GetAttribute("GrowthRate")) --> 3
end)
-- Api Berubah dan GetPropertyChangedSignal()
cabbage.Name = "Cabbage1"
-- Api Berubah dan Atribut Berubah
cabbage:SetAttribute("Grow", false)
-- Api Berubah, AttributeChanged, dan GetAttributeChangedSignal()
cabbage:SetAttribute("GrowthRate", 3)