Thuộc tính và thuộc tính

*Nội dung này được dịch bằng AI (Beta) và có thể có lỗi. Để xem trang này bằng tiếng Anh, hãy nhấp vào đây.

Làm cho các trò chơi trở nên tương tác thường có nghĩa là thao tác các thuộc tính và thuộc tính của đối tượng:

  • Thuộc tính là một phần của lớp đối tượng. Ví dụ, thuộc tính BasePart.Anchored kiểm soát vật lý cho phần. Trong một trò chơi điền kinh, bạn có thể muốn giữ chặt một chiếc đĩa hoặc mũi lao ngay khi nó hạ cánh để người chơi có chỉ báo hình ảnh về khoảng cách mà nó đã đi.

  • Thuộc tính về cơ bản là các thuộc tính tùy chỉnh mà bạn định nghĩa. Ví dụ, dự án tham chiếu Plant sử dụng thuộc tính để đặt giá mua cho hạt giống và kích thước cây tối đa mà một chậu có thể chứa.

Thứ tự sao chép

Trước khi bạn bắt đầu lấy và thao tác các đối tượng, bạn phải hiểu thứ tự sao chép.

Roblox Engine không đảm bảo thứ tự mà các đối tượng (và những thay đổi đối với các đối tượng) được sao chép từ máy chủ đến khách, điều này làm cho phương thức Instance:WaitForChild() trở nên cần thiết để truy cập các đối tượng trong các tập lệnh khách, đặc biệt là các đối tượng trong Workspace.

Ví dụ, nếu một tập lệnh máy chủ thay đổi một thuộc tính của một thể hiện nào đó trong Workspace và sau đó gọi RemoteEvent:FireAllClients(), việc thay đổi thuộc tính có thể được sao chép đến khách trước hoặc sau khi sự kiện RemoteEvent.OnClientEvent được kích hoạt. Sử dụng các phương thức và sự kiện có sẵn để phát hiện thay đổi thay vì giả định rằng một thay đổi đã được sao chép. Những thay đổi cùng loại, chẳng hạn như hai thay đổi thuộc tính, thường đến theo thứ tự.

Khi khách hàng lần đầu tiên khởi động một trò chơi, một số khía cạnh của việc sao chép và thực thi tập lệnh là có thể dự đoán:

  1. Khách hàng tải nội dung của ReplicatedFirst, chẳng hạn như màn hình tải, tài sản và tập lệnh.

  2. LocalScripts (và Scripts với RunContextClient) trong ReplicatedFirst chạy. Những tập lệnh này có thể an toàn lấy các đối tượng từ ReplicatedFirst mà không cần sử dụng Instance:WaitForChild():


    -- An toàn
    local ReplicatedFirst = game:GetService("ReplicatedFirst")
    local LoadingScreen = require(ReplicatedFirst.LoadingScreen)

    Những tập lệnh này không thể an toàn lấy các đối tượng từ các dịch vụ khác, vì chúng có thể chưa được tải:


    -- Không an toàn
    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    local PickupManager = require(ReplicatedStorage.PickupManager)

    Bạn có thể sử dụng WaitForChild() trong những tập lệnh này để lấy các đối tượng từ các dịch vụ khác, nhưng làm như vậy sẽ làm giảm lợi ích của việc sử dụng ReplicatedFirst.

  3. Khách tiếp tục tải phần còn lại của trò chơi.

  4. Khi hoàn tất, sự kiện Loaded được kích hoạt và IsLoaded() trả về true.

  5. LocalScripts trong Players.[Player].PlayerScripts (được sao chép từ StarterPlayerScripts) chạy, cũng như các Scripts của khách trong ReplicatedStorage. Những tập lệnh này có thể an toàn lấy các đối tượng từ ReplicatedStorage mà không cần sử dụng WaitForChild().

  6. Mô hình Character của người chơi xuất hiện trong trò chơi.

  7. LocalScripts trong Workspace.[Character] (được sao chép từ StarterCharacterScripts) chạy.

Nếu trò chơi của bạn sử dụng streaming instance (Workspace.StreamingEnabled), một số hoặc hầu hết các đối tượng có thể chưa được tải vào workspace, vì vậy việc sử dụng WaitForChild() để truy cập các đối tượng trong workspace trở thành một biện pháp an toàn còn quan trọng hơn. Cụ thể, xem stream incác điều khiển streaming theo mô hình để biết thêm thông tin về việc tải và điều chỉnh hành vi streaming.

Lấy đối tượng

Bước đầu tiên để chỉnh sửa các thuộc tính và thuộc tính của đối tượng là lấy một tham chiếu đến đối tượng. Giải pháp đơn giản nhất là làm cho tập lệnh trở thành một con của đối tượng trong Explorer và sử dụng script.Parent để tham chiếu đến đối tượng.

Một tập lệnh được gán cho một mô hình trong Explorer.

local sign = script.Parent

Giải pháp phổ quát hơn là lấy đối tượng từ một dịch vụ bằng các phương thức như Instance:FindFirstChild() hoặc Instance:WaitForChild().

Một mô hình trong một thư mục trong ReplicatedStorage.

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

Chỉnh sửa thuộc tính

Các thuộc tính rất dễ truy cập — chỉ cần sử dụng dấu . sau tham chiếu đối tượng — mặc dù nếu bạn đang làm việc với một mô hình, bạn có thể cần chọn một phần riêng lẻ thay vì toàn bộ mô hình.

Một mô hình trong ReplicatedStorage.

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local chair = ReplicatedStorage:WaitForChild("Chair")
chair.LeftArmRest.Size = Vector3.new(10, 1, 10)

Tạo thuộc tính

Mặc dù bạn có thể tạo thuộc tính bằng cách lập trình, giải pháp phổ biến hơn là tạo chúng với các giá trị mặc định trong giao diện người dùng Studio. Sau đó, bạn có thể sử dụng các tập lệnh để sửa đổi giá trị của chúng để đáp ứng các hành động của người chơi.

Một tập lệnh trong một thư mục trong ReplicatedStorage.

Để biết thông tin về việc tạo thuộc tính trong Studio, xem các thuộc tính instance.

Đặt thuộc tính

Để sửa đổi giá trị của một thuộc tính, gọi Instance:SetAttribute() với một tên và giá trị.

Tạo hoặc Chỉnh sửa Thuộc tính

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

Nếu thuộc tính chưa tồn tại, phương thức này sẽ tạo nó.

Lấy giá trị thuộc tính

Để lấy giá trị của một thuộc tính đã tồn tại, gọi Instance:GetAttribute() trên thể hiện.

Lấy Giá trị Thuộc tính

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

Tương tự, bạn có thể lấy tất cả các thuộc tính bằng cách gọi Instance:GetAttributes(). Phương thức này trả về một từ điển các cặp khóa-giá trị.

Lấy Tất cả Các thuộc tính

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

Xóa thuộc tính

Để xóa một thuộc tính, hãy đặt giá trị của nó thành nil.

Xóa Thuộc tính

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

Phát hiện thay đổi

Có một số cách để lắng nghe các thay đổi đối với các thuộc tính và thuộc tính:

  • Sự kiện Instance.AttributeChanged lắng nghe các thay đổi đối với bất kỳ thuộc tính nào và truyền tên của thuộc tính đã thay đổi dưới dạng tham số.
  • Phương thức Instance:GetPropertyChangedSignal() cho phép bạn lắng nghe các thay đổi đối với một thuộc tính và không truyền tham số nào.
  • Phương thức Instance:GetAttributeChangedSignal() cho phép bạn lắng nghe các thay đổi đối với một thuộc tính và không truyền tham số nào.

Do thông tin tối thiểu mà các sự kiện và phương thức này truyền dưới dạng tham số, tất cả chúng đều phù hợp tốt với các hàm ẩn danh, đặc biệt là Instance:GetPropertyChangedSignal()Instance:GetAttributeChangedSignal(). Để tìm hiểu thêm về hàm ẩn danh và làm việc với các sự kiện, xem Sự kiện.

Lắng nghe Thay đổi

local cabbage = script.Parent
-- Các hàm cục bộ
local function onAnyPropertyChange(property)
-- Bỏ qua thay đổi thuộc tính
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
-- Lắng nghe các thay đổi và kết nối với các hàm cục bộ
cabbage.Changed:Connect(onAnyPropertyChange)
cabbage.AttributeChanged:Connect(onAnyAttributeChange)
-- Lắng nghe các thay đổi và kết nối với các hàm ẩn danh
cabbage:GetPropertyChangedSignal("Name"):Connect(function()
print(cabbage.Name) --> Cabbage1
end)
cabbage:GetAttributeChangedSignal("GrowthRate"):Connect(function()
print(cabbage:GetAttribute("GrowthRate")) --> 3
end)
-- Kích hoạt Changed và GetPropertyChangedSignal()
cabbage.Name = "Cabbage1"
-- Kích hoạt Changed và AttributeChanged
cabbage:SetAttribute("Grow", false)
-- Kích hoạt Changed, AttributeChanged và GetAttributeChangedSignal()
cabbage:SetAttribute("GrowthRate", 3)
©2026 Roblox Corporation. Roblox, logo Roblox và Powering Imagination là các nhãn hiệu đã đăng ký và chưa đăng ký của chúng tôi tại Hoa Kỳ và các quốc gia khác.