Properti dan Attribut

*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 mengubah sifat dan atribut objek:

  • Properti adalah bagian dari kelas objek. Misalnya, BasePart.Anchored kontrol fisika untuk bagian. Dalam pengalaman lintas dan lapangan, Anda mungkin ingin menambatkan discus atau javelin saat ia mendarat sehingga pemain memiliki indikasi visual tentang seberapa jauhnya ia berpergian.

  • Attribut adalah dasar-dasar properti khusus yang Anda definisikan. Misalnya, proyek referensi Tanaman menggunakan属性 untuk menetapkan harga pembelian untuk benih dan ukuran tanaman maksimum yang dapat ditampung pot.

Pesan Replikasi

Sebelum Anda mulai mengambil dan menyimpan objek, Anda harus memiliki pemahaman tentang perintah replikasi.

Mesin Roblox tidak menjamin urutan di mana objek direplikasi dari server ke klien, yang membuat metode Instance:WaitForChild() 必須 untuk akses objek dalam skrip klien, khususnya objek di Workspace . Selain itu, beberapa aspek dari proses ini dapat diprediksi:

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

  2. Class.LocalScript|LocalScripts (dan Scripts dengan RunContext dari 0> Enum.RunContext.Client|Client0> ) dalam LocalScripts3> mengeksekusi


-- Aman
local ReplicatedFirst = game:GetService("ReplicatedFirst")
local LoadingScreen = require(ReplicatedFirst.LoadingScreen)

Skrip ini tidak bisa dengan aman mendapatkan objek dari layanan lain, karena mereka mungkin belum dimuat:


-- Tidak aman
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local PickupManager = require(ReplicatedStorage.PickupManager)

Anda dapat menggunakan WaitForChild() dalam skrip ini untuk mendapatkan objek dari layanan lain, tetapi melakukannya secara luas menghilangkan manfaat menggunakan ReplicatedFirst.

  1. Klien terus memuat sisa pengalaman.

  2. Ketika itu selesai, acara game.Loaded berakhir dan game:IsLoaded() kembali dengan benar.

  3. LocalScripts di StarterPlayerScripts berjalan, serta klien Scripts di 0> Class.ReplicatedStorage0> . Skrip-skrip ini dapat dengan aman mengambil objek dari 3> StarterPlayerScripts3> dan LocalScripts6> tan

  4. Model pemain Character muncul dalam pengalaman.

  5. LocalScripts di StarterCharacterScripts mengeksekusi.

Jika pengalaman Anda menggunakan streaming instans ( Workspace.StreamingEnabled ) , beberapa atau semua objek mungkin tidak dimuat ke ruang kerja, jadi menggunakan WaitForChild() untuk mengakses objek ruang kerja menjadi tindakan keamanan yang lebih penting. Khusus

Mendapatkan Objek

Langkah pertama untuk mengubah kepemilikan dan atribut objek adalah mendapatkan referensi ke objek. Solusi termudah adalah membuat script anak objek di Explorer dan menggunakan script.Parent untuk mengacu pada objek.

A script parented to a model in the Explorer.

local sign = script.Parent

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

A Model within a Folder in ReplicatedStorage.

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local signsFolder = ReplicatedStorage:WaitForChild("Signs")
local sign = signsFolder:WaitForChild("InteractiveSign")

Mengubah Propinsi

Properti mudah diakses — cukup gunakan . setelah referensi objek — meskipun jika Anda bekerja dengan model, Anda mungkin perlu memilih bagian individual 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)

Menciptakanribut

Meskipun Anda dapat menciptakan属性 secara programatis, solusi yang paling umum adalah menciptakannya dengan nilai default di antarmuka pengguna Studio. Kemudian Anda dapat menggunakan script untuk mengubah nilai mereka dalam menanggapi tindakan pemain.

A script within a folder in ReplicatedStorage.

Untuk informasi tentang membuat属性 di Studio, lihat Jenis Instansi .

Mengaturributasi

Untuk mengubah nilai属性, panggil Instance:SetAttribute() dengan nama dan nilai.

Buat atau Modifikasi Token

local cabbage = script.Parent
cabbage:SetAttribute("Harvestable", true)

Jika属性 sudah tidak ada, metode ini menciptakannya.

MendapatkanNilairibut

Untuk mendapatkan nilai satu属性 yang ada, panggil Instance:GetAttribute() di kejadian.

DapatkanNilairibut

local cabbage = script.Parent
cabbage:SetAttribute("Harvestable", true)
local isHarvestable = cabbage:GetAttribute("Harvestable")
print(isHarvestable) --> true

Demikian pula, Anda dapat mengumpulkan semua属性 dengan menelepon Instance:GetAttributes() . Metode ini mengembalikan daftar kata-kata kunci-nilai.

Dapatkan Semua Sifat

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

Menghapus Sifat

Untuk menghapus属性, tetapkan nilainya.

Hapus Atribut

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

Mendeteksi Perubahan

Ada beberapa cara untuk mendengarkan perubahan pada property dan属性:

  • Acara Instance.Changed mendengarkan perubahan pada setiap properti (termasuk属性) dan menyampaikan nama properti yang berubah sebagai parameter.

  • Acara Instance.AttributeChanged mendengarkan perubahan pada setiap属性 dan menyebutkan nama属性 yang diubah sebagai parameter.

  • Metode Instance:GetPropertyChangedSignal() memungkinkan Anda mendengarkan perubahan satu property dan tidak melewati parameter.

  • Metode Instance:GetAttributeChangedSignal() memungkinkan Anda mendengarkan perubahan satu属性 dan tidak memberikan parameter.

Karena informasi minimum yang dilewati acara dan metode ini sebagai parameter, semuanya adalah pilihan yang baik untuk fungsi anonim, khususnya Instance:GetPropertyChangedSignal() dan Instance:GetAttributeChangedSignal() . Untuk belajar 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 atribut
if property ~= "Attributes" then
print(property) --> Nama
print(cabbage[property]) --> Labu 1
end
end
local function onAnyAttributeChange(attribute)
print(attribute) --> Tumbuh, Tingkat Pertumbuhan
print(cabbage:GetAttribute(attribute)) --> false, 3
end
-- Dengarkan perubahan dan terhubung ke fungsi lokal
cabbage.Changed:Connect(onAnyPropertyChange)
cabbage.AttributeChanged:Connect(onAnyAttributeChange)
-- Dengarkan perubahan dan terhubung ke fungsi anonim
cabbage:GetPropertyChangedSignal("Name"):Connect(function()
print(cabbage.Name) --> Labu 1
end)
cabbage:GetAttributeChangedSignal("GrowthRate"):Connect(function()
print(cabbage:GetAttribute("GrowthRate")) --> 3
end)
-- Mengubah Api dan MendapatkanPropertyChangedSignal()
cabbage.Name = "Cabbage1"
-- Api Berubah dan AttributeChanged
cabbage:SetAttribute("Grow", false)
-- Kebakaran berubah, AttributeChanged, dan Dapatkan tanda sinyal Kebakaran
cabbage:SetAttribute("GrowthRate", 3)