Properti dan atribut

*Konten ini diterjemahkan menggunakan AI (Beta) dan mungkin mengandung kesalahan. Untuk melihat halaman ini dalam bahasa Inggris, klik di sini.

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:

  1. Klien memuat konten dari ReplicatedFirst , seperti layar pemuatan, aset, dan skrip.

  2. LocalScripts (dan Scripts dengan RunContext dari Client ) di ReplicatedFirst jalankan.Skrip ini dapat dengan aman mendapatkan objek dari ReplicatedFirst tanpa menggunakan WaitForChild() :


    -- Amankah
    local 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 aman
    local 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 .

  3. Klien terus memuat sisa pengalaman.

  4. Saat selesai, acara game.Loaded terjadi dan game:IsLoaded() kembali benar.

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

  6. Model pemain Character muncul di pengalaman.

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

A script parented to a model in the Explorer.

local sign = script.Parent

Solusi yang lebih universal adalah untuk mendapatkan objek dari layanan menggunakan metode seperti atau .

A Model within a Folder in ReplicatedStorage.

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.

A Model within ReplicatedStorage.

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.

A script within a folder in ReplicatedStorage.

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.Parent
cabbage: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.Parent
cabbage: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.Parent
local cabbageAttributes = cabbage:GetAttributes()
print(cabbageAttributes.GrowthRate) --> 2
for k, v in cabbageAttributes do
print(k, v)
end

Hapus atribut

Untuk menghapus atribut, atur nilainya menjadi nil .

Menghapus Atribut

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

Deteksi perubahan

Ada beberapa cara untuk mendengarkan perubahan properti dan atribut:

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)