使體驗互動通常會涉及操縱對象屬性和特性:
屬性是對象類別的一部分。例如,BasePart.Anchored屬性控制零件的物理學。在田徑體驗中,您可能想在碟子或標槍落地一瞬間錨定它,以便玩家擁有視覺指標表示它飛行了多遠。
特性是你定義的基本自訂屬性。例如,植物參考項目使用屬性來設置種子的購買價格和植物盆的最大尺寸。
複製訂單
在開始擷取和操作對象之前,您必須掌握複製順序的理解。
Roblox 引擎不保證從伺服器複製到客戶端的物件順序,這使得 Instance:WaitForChild() 方法對在客戶端訪問物件特別是在 Workspace 中的物件至關重要。然而,過程的某些方面是可預測的:
客戶載入 ReplicatedFirst 的內容,例如載入屏幕、資產和腳本。
LocalScripts (和 Scripts 使用 RunContext 的 Client )在 ReplicatedFirst 執行中。這些腳本可以安全地從 ReplicatedFirst 中取得對象,而不使用 WaitForChild():
-- 安全local ReplicatedFirst = game:GetService("ReplicatedFirst")local LoadingScreen = require(ReplicatedFirst.LoadingScreen)這些腳本 無法 安全地從其他 服務 獲取對象,因為它們可能尚未載入:
-- 不安全local ReplicatedStorage = game:GetService("ReplicatedStorage")local PickupManager = require(ReplicatedStorage.PickupManager)你 可以 在這些腳本中使用 WaitForChild() 來從其他服務獲得對象,但這樣做會否認使用 ReplicatedFirst 的好處。
客戶端繼續載入體驗的剩餘部分。
當它完成時,game.Loaded事件發生,並返回game:IsLoaded()真實。
LocalScripts 在 Players.Player.PlayerScripts (從 StarterPlayerScripts 複製)執行,以及客戶端 Scripts 在 ReplicatedStorage 中。這些腳本可以安全地從 ReplicatedStorage 中取得對象,而不使用 WaitForChild() 。
玩家的 Character 模型在體驗中生成。
LocalScripts 在 Workspace.Character (從 StarterCharacterScripts 複製)執行。
如果您的體驗使用 實例傳輸 ( Workspace.StreamingEnabled ),一些或大多數對象可能未載入到工作區中,因此使用 WaitForChild() 來存取工作區對象變得更加重要的安全措施。特別是,請參閱 在 和 每個模型的串流控件 以獲得有關載入和調整串流行為的額外信息。
取得對象
修改對象屬性和特性的第一步是取得對物件的參考。最簡單的解決方案是將腳本變為探索器中對象的子孫,並使用 script.Parent 來引用對物件。

local sign = script.Parent
更一般的解決方案是使用 服務 的方法從對象中獲取,例如 Instance:FindFirstChild() 或 Instance:WaitForChild() 。

local ReplicatedStorage = game:GetService("ReplicatedStorage")local signsFolder = ReplicatedStorage:WaitForChild("Signs")local sign = signsFolder:WaitForChild("InteractiveSign")
修改屬性
屬性很容易存取—只需使用對象參考後面的 . — 但如果你正在使用模型,你可能需要選擇個別零件而不是模型本身。

local ReplicatedStorage = game:GetService("ReplicatedStorage")local chair = ReplicatedStorage:WaitForChild("Chair")chair.LeftArmRest.Size = Vector3.new(10, 1, 10)
創建特性
雖然您可以以程式方式創建特性,但更常見的解決方案是在 Studio 使用者介面中創建它們,並使用預設值。然後您可以使用腳本來修改他們的值,以回應玩家的行動。

有關在 Studio 創建特性的資訊,請參閱 實例特性 。
設定屬性
要修改特性值,請使用名稱和值來呼叫 Instance:SetAttribute() 。
創建或修改特性
local cabbage = script.Parentcabbage:SetAttribute("Harvestable", true)
如果特性尚未存在,此方法會創建它。
取得特性值
要取得現有特性的值,請在實個體、實例上呼叫 Instance:GetAttribute() 。
取得特性值
local cabbage = script.Parentcabbage:SetAttribute("Harvestable", true)local isHarvestable = cabbage:GetAttribute("Harvestable")print(isHarvestable) --> true
相同地,您可以透過呼叫 Instance:GetAttributes() 來取得所有屬性。此方法會返回一個包含鑰匙值對的字典。
取得所有特性
local cabbage = script.Parentlocal cabbageAttributes = cabbage:GetAttributes()print(cabbageAttributes.GrowthRate) --> 2for k, v in cabbageAttributes doprint(k, v)end
刪除屬性
要刪除特性,將其值設為 nil 。
刪除特性
local cabbage = script.Parentcabbage:SetAttribute("GrowthRate", nil)
偵測變更
有幾種方法可以聆聽到屬性和特性的變更:
- Instance.AttributeChanged 事件聆聽任何特性的變更,並將更改的特性名稱作為參數傳送。
- Instance:GetPropertyChangedSignal() 方法讓您聆聽一個屬性的變更,並不傳送任何參數。
- Instance:GetAttributeChangedSignal() 方法讓你聆聽一個特性的變更,並不傳送任何參數。
由於這些事件和方法作為參數傳送的最小信息,所有都適合於匿名函數,特別是 Instance:GetPropertyChangedSignal() 和 Instance:GetAttributeChangedSignal() 。要了解更多關於匿名函數和與事件工作的信息,請參閱事件。
聆聽變更
local cabbage = script.Parent
-- 本地功能
local function onAnyPropertyChange(property)
-- 忽略對特性的變更
if property ~= "Attributes" then
print(property) --> 名稱
print(cabbage[property]) --> 捲心菜1
end
end
local function onAnyAttributeChange(attribute)
print(attribute) --> 成長、成長率
print(cabbage:GetAttribute(attribute)) --> 否,3
end
-- 聆聽變更並連接到本地功能
cabbage.Changed:Connect(onAnyPropertyChange)
cabbage.AttributeChanged:Connect(onAnyAttributeChange)
-- 聆聽變更並連接到匿名函數
cabbage:GetPropertyChangedSignal("Name"):Connect(function()
print(cabbage.Name) --> 捲心菜1
end)
cabbage:GetAttributeChangedSignal("GrowthRate"):Connect(function()
print(cabbage:GetAttribute("GrowthRate")) --> 3
end)
-- 火焰變更和 GetPropertyChangedSignal()
cabbage.Name = "Cabbage1"
-- 火焰已變更和屬性變更
cabbage:SetAttribute("Grow", false)
-- 火焰變更、屬性變更和 GetAttributeChangedSignal()
cabbage:SetAttribute("GrowthRate", 3)