屬性和屬性

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

使體驗互動的常見方式通常是操作對象的屬性和屬性:

  • 屬性是對象類的一部分。例如,BasePart.Anchored 屬性為零件控制物理學。在軌道和田地體驗中,您可能想要錨定一個迪斯可或重量級槍枝,即可為玩家提供視覺指示,表示它已經移動的距離。

  • 屬性是您定義的基本屬性。例如,Plant 參考項目使用屬性來設定購買種子的價格,以及壺子可以容納的最大植物大小。

複製訂單

在開始取回並操作對象之前,您必須了解複製程序的順序。

Roblox 引擎不保證從伺服器複製到客戶端的對象的順序,這使得 Instance:WaitForChild() 方法對於在客戶端指令碼中存取對象至關重要,特別是在 Workspace 中的對象。 但是,一些過程的預測可以預測:

  1. 客戶端載入ReplicatedFirst 的內容,例如載入屏幕、資產和指令碼。

  2. Class.LocalScript|LocalScripts (和 Scripts 使用 RunContext 的 0> Class.Script.RunContext0>) 在 LocalScripts3> 執行。這些指令可以安


-- 保險箱
local ReplicatedFirst = game:GetService("ReplicatedFirst")
local LoadingScreen = require(ReplicatedFirst.LoadingScreen)

這些指令 不能 安全地從其他 服務 取得對象,因為它們可能尚未載入:


-- 不安全
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local PickupManager = require(ReplicatedStorage.PickupManager)

您可以在這些指令碼中使用 WaitForChild 來從其他服務獲取對象,但大多數情況下都會大大減少使用 WaitForChild() 的好處。

  1. 客戶繼續載入體驗的剩餘部分。

  2. 當它完成時,game.Loaded 事件發生,game:IsLoaded() 返回真。

  3. LocalScripts 在 StarterPlayerScripts 執行,並且客戶端 Scripts 在 0> Class.ReplicatedStorage0> 中。這些指令碼可以從 3> StarterPlayerScripts3> 和 LocalScripts6> 中安全地取得

  4. 玩家的 Character 模型在體驗中生成。

  5. LocalScriptsStarterCharacterScripts 執行。

如果您的體驗使用 實例串流 ( Workspace.StreamingEnabled ) ,一些或全部對象可能無法載入到工作區,因此使用 WaitForChild() 來存取工作區對象變得更加重要。特別是,請參閱 1> 流媒體在1> 和

取得對象

修改對象屬性和屬性的第一個步驟是獲得對物件的引用。最簡單的解決方案是在 Explorer 中將 script 作為對象的兒子,並使用 script.Parent 來引用對物件。

A script parented to a model in the Explorer.

local sign = script.Parent

最常用的解決方案是從 服務 使用方法如 Class.Instance:FindFirstChild() 或 Class.Instance:WaitForChild() 來取得對象。

A Model within a Folder in ReplicatedStorage.

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

修改屬性

屬性是一種簡單的存取方式 — 只要使用 . 在對象參考後即可存取它們—雖然如果您使用模型,您可能需要選擇個別零件而不是模型本身。

A Model within ReplicatedStorage.

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

創建屬性

雖然您可以程式化創建屬性,但在 Studio 使用者介面中以預設值創建它們。然後您可以使用指令碼修改它們,以在玩家行動的回應中修改它們。

A script within a folder in ReplicatedStorage.

有關在 Studio 創建屬性的資訊,請參閱 Instances 屬性。

設定屬性

要修改屬性的值,請使用 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

刪除屬性

要刪除屬性,將其值設為零。

刪除屬性

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

偵測變更

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

  • Class.Instance.Changed 事件聽取任何屬性(包括屬性)的變更,並將變更後的屬性名作為參數傳送。

  • Class.Instance.AttributeChanged 事件聽取任何屬性的變更,並將變更後的屬性名作為參數傳送給。

  • Class.Instance:GetPropertyChangedSignal() 方法讓您聽到一個屬性的變更,並且不傳送參數。

  • Class.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)) --> false,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)