让体验互动通常意味着操作对象属性和属性:
属性是对象类的一部分。例如,BasePart.Anchored 属性控制物理对象的物理。在轨道和田径场体验中,您可能想要将 ди斯科或投掷线圈即时锚定在盘子上,以便玩家可以看到其旅程的视觉指示。
属性是您定义的基本属性。例如,植物 参考项目使用属性来设置购买种子的价格以及土壤容器可以容纳的最大植物大小。
复制订单
在开始恢复和操作对象之前,您必须了解复制顺序。
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> Streaming 在1> 和4> 预期子
获取对象
对对象属性和属性的修改第一个步骤是获取对象的引用。最简单的解决方案是使脚本成为 Explorer 中的对象子,然后使用 script.Parent 来引用对象。
local sign = script.Parent
最为通用的解决方案是使用方法如 Class.Instance:FindFirstChild() 或 Instance:FindFirstChild() 来从服务中获取对象。
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
删除属性
要删除属性,将其值设置为零。
删除属性
local cabbage = script.Parentcabbage:SetAttribute("GrowthRate", nil)
检测更改
有几种方法可以听取属性和属性的更改:
Class.Instance.Changed 事件列出更改任何属性(包括属性)的更改,并将更改的属性作为参数传递给 Class.Instance 。
Class.Instance.AttributeChanged 事件列出更改任何属性的更改,并将更改的属性名作为参数传递给 Class.Instance 。
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)) --> 真,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)
-- 更改了火焰,并获得PropertyChangedSignal()
cabbage.Name = "Cabbage1"
-- 已更改和属性更改
cabbage:SetAttribute("Grow", false)
-- 更改了火焰、属性更改和获取属性更改信号
cabbage:SetAttribute("GrowthRate", 3)