製作互動式遊戲通常意味著要操作物件的屬性和屬性:
屬性是物件類別的一部分。例如,BasePart.Anchored 屬性控制該部件的物理效果。在田徑比賽遊戲中,當飛碟或標槍落地的瞬間,你可能想要將其固定,以便玩家能夠視覺上看到它飛行的距離。
屬性基本上是你定義的自訂屬性。例如,Plant 參考專案使用屬性來設置種子的購買價格和花盆可以容納的最大植物大小。
複製順序
在開始檢索和操作物件之前,你必須瞭解複製順序。
Roblox 引擎不保證從伺服器到客戶端複製物件(和物件變更)的順序,因此 Instance:WaitForChild() 方法在客戶端腳本中訪問物件時至關重要,特別是 Workspace 中的物件。
例如,如果伺服器腳本改變了工作區某個實例的屬性,然後調用 RemoteEvent:FireAllClients(),則屬性更改可能在 RemoteEvent.OnClientEvent 觸發之前或之後複製到客戶端。使用可用的方法和事件來 檢測變更,而不是假設某個變更已經複製。相同類型的變更,如兩個屬性變更,通常會按順序到達。
當客戶端第一次啟動遊戲時,某些複製和腳本執行的方面是可預測的:
客戶端加載 ReplicatedFirst 的內容,例如加載畫面、資源和腳本。
LocalScripts (以及 Scripts 且 RunContext 為 Client)在 ReplicatedFirst 中運行。這些腳本可以安全地從 ReplicatedFirst 獲取物件,而不需要使用 Instance:WaitForChild():
-- 安全local ReplicatedFirst = game:GetService("ReplicatedFirst")local LoadingScreen = require(ReplicatedFirst.LoadingScreen)這些腳本無法安全地從其他 服務 獲取物件,因為它們可能尚未加載:
-- 不安全local ReplicatedStorage = game:GetService("ReplicatedStorage")local PickupManager = require(ReplicatedStorage.PickupManager)你可以在這些腳本中使用 WaitForChild() 獲取其他服務中的物件,但這樣做會抵消使用 ReplicatedFirst 的好處。
客戶端繼續加載遊戲的其餘部分。
當加載完成時, Loaded 事件觸發,且 IsLoaded() 返回 true。
在 Players.[Player].PlayerScripts 中的 LocalScripts(從 StarterPlayerScripts 複製)運行,以及在 ReplicatedStorage 中的客戶端 Scripts。這些腳本可以安全地從 ReplicatedStorage 獲取物件,而不需要使用 WaitForChild()。
玩家 Character 模型在遊戲中生成。
在 Workspace.[Character] 中的 LocalScripts(從 StarterCharacterScripts 複製)運行。
如果你的遊戲使用 實例串流 (Workspace.StreamingEnabled),則有些或大多數物件可能尚未加載到工作區中,因此使用 WaitForChild() 訪問工作區物件變得更加重要。特別是,請參見 串流 和 每模型串流控制 以獲取有關加載和調整串流行為的更多資訊。
獲取物件
修改物件屬性和屬性的第一步是獲取對該物件的引用。最簡單的解決方案是將腳本設為 Explorer 中物件的子項,並使用 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) --> Name
print(cabbage[property]) --> Cabbage1
end
end
local function onAnyAttributeChange(attribute)
print(attribute) --> Grow, GrowthRate
print(cabbage:GetAttribute(attribute)) --> false, 3
end
-- 監聽變更並連接到本地函數
cabbage.Changed:Connect(onAnyPropertyChange)
cabbage.AttributeChanged:Connect(onAnyAttributeChange)
-- 監聽變更並連接到匿名函數
cabbage:GetPropertyChangedSignal("Name"):Connect(function()
print(cabbage.Name) --> Cabbage1
end)
cabbage:GetAttributeChangedSignal("GrowthRate"):Connect(function()
print(cabbage:GetAttribute("GrowthRate")) --> 3
end)
-- 觸發 Changed 和 GetPropertyChangedSignal()
cabbage.Name = "Cabbage1"
-- 觸發 Changed 和 AttributeChanged
cabbage:SetAttribute("Grow", false)
-- 觸發 Changed、AttributeChanged 和 GetAttributeChangedSignal()
cabbage:SetAttribute("GrowthRate", 3)