使體驗互動的常見方式通常是操作對象的屬性和屬性:
屬性是對象類的一部分。例如,BasePart.Anchored 屬性為零件控制物理學。在軌道和田地體驗中,您可能想要錨定一個迪斯可或重量級槍枝,即可為玩家提供視覺指示,表示它已經移動的距離。
屬性是您定義的基本屬性。例如,Plant 參考項目使用屬性來設定購買種子的價格,以及壺子可以容納的最大植物大小。
複製訂單
在開始取回並操作對象之前,您必須了解複製程序的順序。
Roblox 引擎不保證從伺服器複製到客戶端的對象的順序,這使得 Instance:WaitForChild() 方法對於在客戶端指令碼中存取對象至關重要,特別是在 Workspace 中的對象。 但是,一些過程的預測可以預測:
客戶端載入ReplicatedFirst 的內容,例如載入屏幕、資產和指令碼。
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() 的好處。
客戶繼續載入體驗的剩餘部分。
當它完成時,game.Loaded 事件發生,game:IsLoaded() 返回真。
LocalScripts 在 StarterPlayerScripts 執行,並且客戶端 Scripts 在 0> Class.ReplicatedStorage0> 中。這些指令碼可以從 3> StarterPlayerScripts3> 和 LocalScripts6> 中安全地取得
玩家的 Character 模型在體驗中生成。
LocalScripts 在 StarterCharacterScripts 執行。
如果您的體驗使用 實例串流 ( Workspace.StreamingEnabled ) ,一些或全部對象可能無法載入到工作區,因此使用 WaitForChild() 來存取工作區對象變得更加重要。特別是,請參閱 1> 流媒體在1> 和
取得對象
修改對象屬性和屬性的第一個步驟是獲得對物件的引用。最簡單的解決方案是在 Explorer 中將 script 作為對象的兒子,並使用 script.Parent 來引用對物件。
local sign = script.Parent
最常用的解決方案是從 服務 使用方法如 Class.Instance:FindFirstChild() 或 Class.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 創建屬性的資訊,請參閱 Instances 屬性。
設定屬性
要修改屬性的值,請使用 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
刪除屬性
要刪除屬性,將其值設為零。
刪除屬性
local cabbage = script.Parentcabbage: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)