RayValue 是一个旨在存储单一射线的对象。与 CFrameValue 类似,RayValue 中存储的射线无法在工作室的属性窗口内查看或编辑。相反,使用命令栏来获取和设置这些对象的值。例如,您可以使用如下代码在 Workspace 中创建一个名为 "Value" 的新 RayValue。它在 (0, 50, 0) 处创建一个射线,并朝着正-X 方向。
Instance.new("RayValue").Value = Ray.new(Vector3.new(0, 50, 0), Vector3.new(10, 0, 0))
由于在工作室中没有简单的方法来编辑射线,有时使用 CFrameValue 更好(可以通过部件或相机更改)。您可以使用 Ray.new(cf.p, cf.lookVector * dist) 从 CFrame 重新构建一条射线,其中 cf 是给定的 CFrame,dist 是您要构建的射线的长度。
像所有 "-Value" 对象一样,这个单一值存储在 Value 属性中。此(以及其他类似对象)的 Changed 事件将在对象中存储的新值被更改时触发,而不是表示正在更改属性的字符串。
代码示例
这个代码示例演示了如何构造一个射线,将射线存储在一个 RayValue 中,并使用射线检测在两个名为“PartA”和“PartB”的部件之间查找其他部件。
local partA = workspace.PartA
local partB = workspace.PartB
local origin = partA.Position
local direction = partB.Position - partA.Position
local ray = Ray.new(origin, direction)
local rayValue = Instance.new("RayValue")
rayValue.Value = ray
rayValue.Name = "PartA到PartB的射线"
rayValue.Parent = workspace
-- 使用射线检测查找 PartA 和 PartB 之间的任何部件
local part = workspace:FindPartOnRay(ray)
if part then
print("击中部件: " .. part:GetFullName())
else
-- 这应该永远不会发生,因为我们的射线从 PartA 开始
-- 并指向 PartB,因此我们应该始终击中 PartB
-- 或者其他某个部件。
print("没有击中任何部件!")
end
概要
属性
方法
活动
Changed
此事件在 RayValue.Value 属性被更改时触发。它将使用存储在参数对象中的新值运行,而不是表示正在更改属性的字符串。
此事件与其他更改事件一样,可以用于跟踪 RayValue 何时更改,以及跟踪它可能更改为的不同值。
对于类似对象,例如 NumberValue 和 StringValue,根据最适合需求的对象类型,还存在等效的更改事件。
参数
更改后的值。
代码示例
以下示例假设所有引用的对象都存在,每当 RayValue 的值改变时,都会打印新的值。在以下示例中,它将打印 "{0, 0, 0}, {0.577350199, 0.577350199, 0.577350199}"。
local value = Instance.new("RayValue")
value.Parent = workspace
value.Changed:Connect(function(NewValue)
print(NewValue)
end)
local start = Vector3.new(0, 0, 0)
local lookAt = Vector3.new(10, 10, 10)
local ray = Ray.new(start, (lookAt - start).Unit)
value.Value = ray