Thuộc tính và đặ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 trải nghiệm tương tác thường có nghĩa là thao tác với các thuộc tính và đặc tính của đối tượng:

  • Các thuộc tính là một phần của lớp đối tượng.Ví dụ, điều khiển thuộc tính BasePart.Anchored vật lý cho phần.Trong một trải nghiệm trên sân và sân, bạn có thể muốn neo một discus hoặc javelin ngay lập tức khi nó hạ cánh để người chơi có một chỉ báo hình ảnh về việc nó đã đi bao xa.

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

Thứ tự sao chép

Trước khi bắt đầu lấy và xử lý các đối tượng, bạn phải có sự hiểu biết về trật tự sao lưu.

Cơ chế Roblox không đảm bảo thứ tự mà các đối tượng được sao lưu từ máy chủ sang khách hàng, điều này làm cho phương pháp Instance:WaitForChild() trở nên cần thiết để truy cập các đối tượng trong kịch bản khách hàng, đặc biệt là các đối tượng trong Workspace.Tuy nhiên, một số khía cạnh của quá trình vẫn có thể dự đoán:

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

  2. LocalScripts (và Scripts với một RunContext của Client) trong ReplicatedFirst chạy.Các kịch bản này có thể nhận được các đối tượng một cách an toàn từ ReplicatedFirst mà không sử dụng WaitForChild():


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

    Các kịch bản này không thể lấy an toàn đố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 các kịch bản này để lấy đối tượng từ các dịch vụ khác, nhưng làm như vậy sẽ phủ nhận lợi ích của việc sử dụng ReplicatedFirst .

  3. Khách hàng tiếp tục tải phần còn lại của trải nghiệm.

  4. Khi nó kết thúc, sự kiện game.Loaded bắt lửa và game:IsLoaded() trả về true.

  5. LocalScripts trong Players.Player.PlayerScripts (bị sao chép từ StarterPlayerScripts ) chạy, cũng như khách hàng Scripts trong ReplicatedStorage .Các kịch bản này có thể nhận được các đối tượng một cách an toàn từ ReplicatedStorage mà không sử dụng WaitForChild().

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

  7. LocalScripts trong Workspace.Character (bị sao chép từ StarterCharacterScripts) chạy.

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

Nhận đối tượng

Bước đầu tiên để sửa đổi tính chất 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 mã trở thành con của đối tượng trong Explorer và sử dụng script.Parent để tham chiếu đối tượng.

A script parented to a model in the Explorer.

local sign = script.Parent

Giải pháp toàn diện hơn là lấy đối tượng từ một dịch vụ bằng cách sử dụng các phương pháp như hoặc .

A Model within a Folder in ReplicatedStorage.

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

Sửa đổi thuộc tính

Các thuộc tính dễ dàng truy cập - chỉ cần sử dụng một . 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 phải chọn một phần cụ thể thay vì chính mô hình.

A Model within 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 các thuộc tính theo cách lập trình, giải pháp phổ biến hơn là tạo chúng với 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 để thay đổi giá trị của chúng theo phản hồi của hành động người chơi.

A script within a folder in ReplicatedStorage.

Đối với thông tin về việc tạo thuộc tính trong Studio, xem Thuộc tính của Instances.

Đặt thuộc tính

Để sửa 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 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 tạo nó.

Nhận giá trị thuộc tính

Để lấy giá trị của một thuộc tính hiện có, gọi Instance:GetAttribute() trên ví dụ / trường hợp.

Nhận 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ể nhận được tất cả các thuộc tính bằng cách gọi Instance:GetAttributes() . Phương pháp này trả về một bảng từ điển của các cặp chìa khóa-giá trị.

Nhận 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, đặ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 các thay đổi

Có một số cách để lắng nghe các thay đổi về các thuộc tính và đặ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 thuộc tính đã thay đổi làm tham số.
  • Phương pháp 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ố.
  • Phương pháp 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ố.

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

Lắng nghe thay đổi

local cabbage = script.Parent
-- Chức năng địa phương
local function onAnyPropertyChange(property)
-- Bỏ qua thay đổi đối với các thuộc tính
if property ~= "Attributes" then
print(property) --> Tên
print(cabbage[property]) --> Cải1
end
end
local function onAnyAttributeChange(attribute)
print(attribute) --> Phát triển, Tỷ lệ tăng trưởng
print(cabbage:GetAttribute(attribute)) --> giả mạo 3
end
-- Lắng nghe thay đổi và kết nối với chức năng địa phương
cabbage.Changed:Connect(onAnyPropertyChange)
cabbage.AttributeChanged:Connect(onAnyAttributeChange)
-- Lắng nghe thay đổi và kết nối với chức năng vô danh
cabbage:GetPropertyChangedSignal("Name"):Connect(function()
print(cabbage.Name) --> Cải1
end)
cabbage:GetAttributeChangedSignal("GrowthRate"):Connect(function()
print(cabbage:GetAttribute("GrowthRate")) --> 3
end)
-- Lửa đã thay đổi và GetPropertyChangedSignal()
cabbage.Name = "Cabbage1"
-- Lửa đã thay đổi và Thuộc tính thay đổi
cabbage:SetAttribute("Grow", false)
-- Lửa đã thay đổi, Thuộc tính thay đổi và GetAttributeChangedSignal()
cabbage:SetAttribute("GrowthRate", 3)