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:
Klien memuat konten dari ReplicatedFirst, seperti layar pemuatan, aset, dan skrip.
Class.LocalScript|LocalScripts (dan Scripts dengan RunContext dari 0> Enum.RunContext.Client|Client0> ) dalam LocalScripts3> mengeksekusi
-- Amanlocal 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 amanlocal 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.
Klien terus memuat sisa pengalaman.
Ketika itu selesai, acara game.Loaded berakhir dan game:IsLoaded() kembali dengan benar.
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
Model pemain Character muncul dalam pengalaman.
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.
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")
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.
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.
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.Parentcabbage: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.Parentcabbage: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.Parentlocal cabbageAttributes = cabbage:GetAttributes()print(cabbageAttributes.GrowthRate) --> 2for k, v in cabbageAttributes doprint(k, v)end
Menghapus Sifat
Untuk menghapus属性, tetapkan nilainya.
Hapus Atribut
local cabbage = script.Parentcabbage: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)