屬性和屬性

*此內容是使用 AI(Beta 測試版)翻譯,可能含有錯誤。若要以英文檢視此頁面,請按一下這裡

製作互動式遊戲通常意味著要操作物件的屬性和屬性:

  • 屬性是物件類別的一部分。例如,BasePart.Anchored 屬性控制該部件的物理效果。在田徑比賽遊戲中,當飛碟或標槍落地的瞬間,你可能想要將其固定,以便玩家能夠視覺上看到它飛行的距離。

  • 屬性基本上是你定義的自訂屬性。例如,Plant 參考專案使用屬性來設置種子的購買價格和花盆可以容納的最大植物大小。

複製順序

在開始檢索和操作物件之前,你必須瞭解複製順序。

Roblox 引擎不保證從伺服器到客戶端複製物件(和物件變更)的順序,因此 Instance:WaitForChild() 方法在客戶端腳本中訪問物件時至關重要,特別是 Workspace 中的物件。

例如,如果伺服器腳本改變了工作區某個實例的屬性,然後調用 RemoteEvent:FireAllClients(),則屬性更改可能在 RemoteEvent.OnClientEvent 觸發之前或之後複製到客戶端。使用可用的方法和事件來 檢測變更,而不是假設某個變更已經複製。相同類型的變更,如兩個屬性變更,通常按順序到達。

當客戶端第一次啟動遊戲時,某些複製和腳本執行的方面是可預測的:

  1. 客戶端加載 ReplicatedFirst 的內容,例如加載畫面、資源和腳本。

  2. LocalScripts (以及 ScriptsRunContextClient)在 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 的好處。

  3. 客戶端繼續加載遊戲的其餘部分。

  4. 當加載完成時, Loaded 事件觸發,且 IsLoaded() 返回 true。

  5. Players.[Player].PlayerScripts 中的 LocalScripts(從 StarterPlayerScripts 複製)運行,以及在 ReplicatedStorage 中的客戶端 Scripts。這些腳本可以安全地從 ReplicatedStorage 獲取物件,而不需要使用 WaitForChild()

  6. 玩家 Character 模型在遊戲中生成。

  7. Workspace.[Character] 中的 LocalScripts(從 StarterCharacterScripts 複製)運行。

如果你的遊戲使用 實例串流 (Workspace.StreamingEnabled),則有些或大多數物件可能尚未加載到工作區中,因此使用 WaitForChild() 訪問工作區物件變得更加重要。特別是,請參見 串流每模型串流控制 以獲取有關加載和調整串流行為的更多資訊。

獲取物件

修改物件屬性和屬性的第一步是獲取對該物件的引用。最簡單的解決方案是將腳本設為 Explorer 中物件的子項,並使用 script.Parent 來引用該物件。

在 Explorer 中與模型相關聯的腳本。

local sign = script.Parent

更通用的解決方案是使用 Instance:FindFirstChild()Instance:WaitForChild()服務 獲取該物件。

在 ReplicatedStorage 中的文件夾中的模型。

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

修改屬性

屬性很容易訪問 — 只需在物件引用後使用 . — 但是如果你正在處理模型,可能需要選擇單個部件而不是整個模型。

在 ReplicatedStorage 中的模型。

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

創建屬性

雖然您可以以程式方式創建屬性,但更常見的解決方案是在 Studio 使用預設值創建屬性。然後,您可以使用腳本根據玩家的操作來修改它們的值。

在 ReplicatedStorage 中的文件夾中的腳本。

有關在 Studio 中創建屬性的資訊,請參見 實例屬性

設定屬性

要修改屬性的值,請調用 Instance:SetAttribute(),並傳遞名稱和值。

創建或修改屬性

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

如果該屬性尚不存在,則此方法將創建它。

獲取屬性值

要獲取一個已存在屬性的值,請在該實例上調用 Instance:GetAttribute()

獲取屬性值

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

同樣,您可以通過調用 Instance:GetAttributes() 來獲取所有屬性。此方法返回一個鍵值對字典。

獲取所有屬性

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

刪除屬性

要刪除一個屬性,請將其值設為 nil

刪除屬性

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

檢測變更

有幾種方法可以監聽屬性和屬性的變更:

由於這些事件和方法傳遞的參數信息最少,它們都非常適合匿名函數,特別是 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)
©2026 Roblox Corporation、Roblox、Roblox 標誌及 Powering Imagination 是我們在美國及其他國家地區的部分註冊與未註冊商標。