此基础类为处理 3D 空间查询和模拟的 API 提供 API,例如 Workspace 和 WorldModel 。
概要
属性
继承自Model的属性设置模型的细节级别以实现启用实例流媒体的体验。
控制当实例串流启用时,Models 的模型传输行为。
Class.Model 或 nil 如果未设置。
仅用于编辑器的属性,用于在模型周围缩放。设置此属性会使缩放像 Model/ScaleTo 被调用。
确定Model的枢轴位置,其中 不 有设置Model.PrimaryPart。
方法
如果 BasePart 的任何部分触摸到其他部分,返回 true。
在指定方向中投射一个方块形状,并且如果形状触擊 RaycastResult 或 BasePart 元件,将返回一个 Terrain 。
返回一个包含 边界盒 的阵列部分的返方块。
返回一个包含 边界盒 的多个零件的阵列。
返回一个拥有与指定部分共用空间的阵列。
- IKMoveTo(part : BasePart,target : CFrame,translateStiffness : number,rotateStiffness : number,collisionsMode : Enum.IKCollisionsMode):void
通过逆时针 kinematics 将指定的部分移动到指定的位置,以确保任何参与该部分的关节、限制或碰撞都满足物理上的完整要求。
使用原始、方向和可选的 RaycastParams 射线,然后返回一个 RaycastResult ,如果可选的对象或地形与射线交叉,则返回一个 Datatype.RaycastResult。
- Spherecast(position : Vector3,radius : number,direction : Vector3,params : RaycastParams):RaycastResult?
在指定方向中投射一个球形,并且如果形状击中 RaycastResult 或 BasePart 细胞,将返回一个 Terrain 。
基于指定的时间增量和可选的 BaseParts 集合,为世界上的零件提供模拟。
将此模型设置为持久为指定玩家。 Model.ModelStreamingMode 必须设置为 PersistentPerPlayer 才能因为添加而导致行为的更改。
返回包含模型所有部分的音量的描述。
返回 BaseParts 在 Model 中所有内容的最小边界盒的大小,与 Model.PrimaryPart 如果设置。
返回所有 Player 对象,这个模型对象持续的。 行为由调用此方法是否来自 Script 或 LocalScript 决定。
返回模型的标准尺寸,默认为 1 对于新创建的模型,并且随着它在 Model/ScaleTo 通过缩放而改变。
将 PrimaryPart 移动到指定位置。如果未指定主要部分,模型的根部分将被使用。
该模型不再对指定的玩家持久。 Model.ModelStreamingMode 必须设置为 PersistentPerPlayer 才能因为移除而改变行为。
设置模型的缩放因素,调整所有子集实例的尺寸和位置,使其在缩放因素为 1 时,相对于其初始大小和位置拥有该缩放因素。
使用 Model 的给定 Offset,将模型的方向保偏移值,如果另一个 Vector3 或 BasePart 已经在新位置,那么 1> Class.Model1> 将覆盖该对象。
获得 PVInstance 的枢轴。
形成 PVInstance 与所有的后代 PVInstances ,使 pivot 现在位于指定的 CFrame 。
属性
方法
ArePartsTouchingOthers
ArePartsTouchingOthers 返回 true 如果至少一个给定的 BasePart 触摸任何其他部分。如果它们在距离门限内,两个部分被视为 "触摸",overlapIgnored 。
如果没有提供零件,将返回 false。
参数
一个列表的零件检查来确定列表中的零件是否触摸到列表中的零件。
在零件被视为触摸时,零件之间的交叉门阈值在 studs 中被忽略。
返回
代码示例
The code block below demonstrates how to use WorldRoot:ArePartsTouchingOthers() to check if parts in a list are touching any parts in the workspace not in the list.
First the script creates two square parts that overlap 1 stud, Part1 and Part2. Then, it prints the value returned by ArePartsTouchingOthers() when Part1 is passed in partList at three different overlap values: 0, 0.999, and 1. The first two times ArePartsTouchingOthers() is called return false because the overlap values are less than the distance that Part1 and Part2 overlap. The third call returns true because the overlap value is equal to the distance that the parts overlap.
local part1 = Instance.new("Part")
part1.Name = "Part1"
part1.Anchored = true
part1.Transparency = 0.5
part1.Color = Color3.fromRGB(185, 100, 38)
part1.Size = Vector3.new(2, 2, 2)
part1.Position = Vector3.new(0, 4, 0)
part1.Parent = workspace
local part2 = Instance.new("Part")
part2.Name = "Part2"
part2.Anchored = true
part2.Transparency = 0.5
part2.Color = Color3.fromRGB(200, 10, 0)
part2.Size = Vector3.new(2, 2, 2)
part2.Position = Vector3.new(0, 5, 0)
part2.Parent = workspace
local partList = { part1 }
print(workspace:ArePartsTouchingOthers(partList, 0)) -- True
print(workspace:ArePartsTouchingOthers(partList, 0.999)) -- True
print(workspace:ArePartsTouchingOthers(partList, 1)) -- False
Blockcast
以指定方向中的方块形状投射在一个给定的方向,并且在第一个碰撞时使用 BasePart 或 Terrain 元素来返回。这与使用 WorldRoot:Raycast() 将直线射线投射到一个方向以寻找碰撞,但使用 3D 形而不是射线进行。
与 WorldRoot:GetPartsInPart() 不同,此方法不会检测到 BaseParts ,该 最初 交叉形状。
如果检测到命中,一个 RaycastResult 包含命中信息。Distance 代表形状需要前往的距离,Position 代表交叉点,导致命中。
此方法将抛出一个错误,如果它通过无效的 CFrame 、大小或方向输入。
参数
初始位置和旋转方向的树形块的初始位置。
方块的大小在 studs 中表示。最大大小是 512 studs。
方向 shapecast,用于表示形状可以旅行的最大距离。最大距离是 1024 格。
返回
代码示例
Casts a block and returns the first collision with a BasePart or Terrain. Prints the properties of the RaycastResult if a result was hit.
local Workspace = game:GetService("Workspace")
local function castBlock()
-- The initial position and rotation of the cast block shape
local originCFrame = CFrame.new(Vector3.new(0, 50, 0))
-- The size of the cast block shape
local size = Vector3.new(6, 3, 9)
-- The direction the block is cast in
local direction = -Vector3.yAxis
-- The maximum distance of the cast
local distance = 50
-- Cast the block and create a visualization of it
local raycastResult = Workspace:Blockcast(originCFrame, size, direction * distance)
if raycastResult then
-- Print all properties of the RaycastResult if it exists
print(`Block intersected with: {raycastResult.Instance:GetFullName()}`)
print(`Intersection position: {raycastResult.Position}`)
print(`Distance between block's initial position and result: {raycastResult.Distance}`)
print(`The normal vector of the intersected face: {raycastResult.Normal}`)
print(`Material hit: {raycastResult.Material.Name}`)
else
print("Nothing was hit")
end
end
-- Continually cast a block every 2 seconds
while true do
castBlock()
task.wait(2)
end
BulkMoveTo
此函数将一个BaseParts 的表移到一个CFrames 的表,而不需要先发射默认属性Changed 事件。 这提供了一个快速的方法来移动大量零件,因为您不需要为每个零件付费。
第三个参数允许您进一步优化移动操作。默认情况下,每个部分的 Changed 事件都会
注意,您只应该使用此函数,如果您确定零件移动是您的验证码中的瓶颈。 设置个别零件和焊接模型的 CFrame 属性是在大多数情况下足够快的。
参数
返回
GetPartBoundsInBox
WorldRoot:GetPartBoundsInBox() 返回一个包含零件的列表,其 边界箱 与描述了中心(CFrame)和大小(0> Datatype.Vector30>)的箱子交叉。
正如所述,此空间查询方法有效地考虑零件的边界盒的体积而不是其实际的填充体积。 在考虑圆柱体、球体、联接和 MeshParts (其形状不是块)时,可能需要使用 WorldRoot:GetPartsInPart() 或进一步过滤此方法的结果。 对于需要精确度
此方法使用一个 OverlapParams 对象描述空间查询的可重用部分,例如包含或排除列表、最大部件数量、要求的最大部件数量、是否使用 碰撞群组 和查询的最终 BasePart.CanCollide 值。
参数
指定的音箱音量的中心位置。
要查询的给定音箱音量。
包含空间查询参数的可重用部分。
返回
Class.BasePart|BaseParts 阵列,与空间查询匹配。
GetPartBoundsInRadius
WorldRoot:GetPartBoundsInRadius() 返回一个包含零件的列表,其 边界箱 与描述使用中心 ( Vector3 ) 和半径 (number) 的球体交叉。
正如所述,此空间查询方法有效地考虑零件的边界盒的体积而不是其实际的填充体积。 在考虑圆柱体、球体、联接和 MeshParts (其形状不是块)时,可能需要使用 WorldRoot:GetPartsInPart() 或进一步过滤此方法的结果。 对于需要精确度
此方法使用一个 OverlapParams 对象描述空间查询的可重用部分,例如包含或排除列表、最大部件数量、要求的最大部件数量、是否使用 碰撞群组 和查询的最终 BasePart.CanCollide 值。
参数
要查询的球体音量中心的位置。
要查询的球体音量的半径。
包含空间查询参数的可重用部分。
返回
Class.BasePart|BaseParts 阵列,与空间查询匹配。
GetPartsInPart
WorldRoot:GetPartsInPart() 返回一个拥有空间与指定部分共用的部分阵列(必须在同一个 WorldRoot 上存在)。此方法可以在 BasePart:GetTouchingParts() 的替代方法,通常是更好的选择。
您注意到,此空间查询方法考虑到 正确的音量 由指定的零件使用完整的几何碰撞检查占用的空间。 作为示例,一个凹状/空心状零件不会在其中与要求的零件匹配,除非它们实际上相互交叉/触摸。 对于更简单的零件,请
此方法使用一个 OverlapParams 对象描述空间查询的可重用部分,例如包含或排除列表、最大部件数量、要求的最大部件数量、是否使用 碰撞群组 和查询的最终 BasePart.CanCollide 值。
参数
零件的音量是要与其他零件对比的。
包含空间查询参数的可重用部分。
返回
Class.BasePart|BaseParts 阵列,与空间查询匹配。
IKMoveTo
此函数将指定的部分移动到指定的位置,而不是直接移动到那里,以确保任何关联,Class.Plugin|constraints 或参与的部分在物理上满意。目前此函数仅在 Studio 中提供,因为它目前与运行中的游戏的物理学发生冲突。
翻译硬度 是一个数字,它之间的数字 0 和 1 指定要匹配零件的位置到目标 CFrame 的位置部分。 旋转硬度 是一个数字,它之间的数字 0 和 1 指定要匹配零件的旋转到旋转部分。
例如:
- 如果将翻译和旋转硬度都设置为 1,零件将在不考虑物理限制的情况下正确移动到目标 CFrame 上。
- 如果翻译硬度和旋转硬度都等同于0.5,零件将尝试移动到目标CFrame,但可能会被物理限制推出道路。
- 如果将硬度翻译和旋转硬度都设置为 0 ,那么目标 CFrame 将被忽略,物理限制将解决在位置为它所在位置的对象。
参数
正在移动零件。
用于移动指定部件的位置。
允许您指定物理解析度对象的影响。
返回
Raycast
使用原始、方向和可选的 RaycastParams 射线。 如果它找到有资格的 BasePart 或 Terrain 细胞,将返回包含操作结果的
注意,方向向量的长度(大小)很重要,因为对象/地形远离其长度不会被测试。如果您使用 CFrame 来帮助创建射线部件,请考虑使用 CFrame.LookVector 作为方向向量并乘以所需长度。最大方向向量的长度为
此方法不使用 Ray 对象,但它的原始和方向组件可以从 Ray.Origin 和 1> Datatype.Ray.Direction1> 借鉴。
参数
射线的起始点。
射线的方向向量。注意,长度为该向量的长度,因此部件/地形远离它不会被测试。
用于在射线投射操作中指定是否命中的对象。如果未提供,默认值将用于所有部分,并且 Terrain 水不会被忽略。
返回
代码示例
Casts a ray and returns the first collision with a BasePart or Terrain. Prints the properties of the RaycastResult if a result was hit.
local Workspace = game:GetService("Workspace")
local function castRay()
-- The origin point of the ray
local originPosition = Vector3.new(0, 50, 0)
-- The direction the ray is cast in
local direction = -Vector3.yAxis
-- The maximum distance of the ray
local distance = 50
-- Cast the ray and create a visualization of it
local raycastResult = Workspace:Raycast(originPosition, direction * distance)
if raycastResult then
-- Print all properties of the RaycastResult if it exists
print(`Ray intersected with: {raycastResult.Instance:GetFullName()}`)
print(`Intersection position: {raycastResult.Position}`)
print(`Distance between ray origin and result: {raycastResult.Distance}`)
print(`The normal vector of the intersected face: {raycastResult.Normal}`)
print(`Material hit: {raycastResult.Material.Name}`)
else
print("Nothing was hit")
end
end
-- Continually cast a ray every 2 seconds
while true do
castRay()
task.wait(2)
end
Shapecast
参数
返回
Spherecast
以给定的方向施放一个圆形形状,并且在第一次碰撞时使用 BasePart 或 Terrain 元素来返回第一次碰撞。这与使用 WorldRoot:Raycast() 施放直线射线在方向施放时返回第一次碰撞的方式相似,但它使用 3D 形式而不是射线。
与 WorldRoot:GetPartsInPart() 不同,此方法不会检测到 BaseParts ,该 最初 交叉形状。
如果检测到命中,一个 RaycastResult 包含命中信息。Distance 代表形状需要前往的距离,Position 代表交叉点,导致命中。
此方法将抛出一个错误,如果输入了无效的范围或方向输入。
参数
初始位置的投射球形。
球面形状的半径在螺柱上。最大半径是 256 螺柱。
方向 shapecast,用于表示形状可以旅行的最大距离。最大距离是 1024 格。
返回
代码示例
Casts a sphere and returns the first collision with a BasePart or Terrain. Prints the properties of the RaycastResult if a result was hit.
local Workspace = game:GetService("Workspace")
local function castSphere()
-- The initial position of the cast spherical shape
local originPosition = Vector3.new(0, 50, 0)
-- The radius of the cast spherical shape in studs
local radius = 10
-- The direction the sphere is cast in
local direction = -Vector3.yAxis
-- The maximum distance of the cast
local distance = 50
-- Cast the sphere and create a visualization of it
local raycastResult = Workspace:Spherecast(originPosition, radius, direction * distance)
if raycastResult then
-- Print all properties of the RaycastResult if it exists
print(`Sphere intersected with: {raycastResult.Instance:GetFullName()}`)
print(`Intersection position: {raycastResult.Position}`)
print(`Distance between sphere's initial position and result: {raycastResult.Distance}`)
print(`The normal vector of the intersected face: {raycastResult.Normal}`)
print(`Material hit: {raycastResult.Material.Name}`)
else
print("Nothing was hit")
end
end
-- Continually cast a sphere every 2 seconds
while true do
castSphere()
task.wait(2)
end
StepPhysics
基于指定的时间增量和可选的 BasePart 集合,模拟
参数
将要模拟的时间长度。此参数必须是正数。大于这个参数的值会增加此函数的运行时间。
可选的零件阵列将被模拟。此集必须包含类型为 BasePart 的实例;任何其他类型都将被忽略。
返回
代码示例
Simulates the parts in the workspace for a fixed period of time by calling the StepPhysics function once per frame until a specified time has elaspsed.
local RunService = game:GetService("RunService")
-- Optional array of parts to simulate; otherwise all parts will be simulated
local partsToSimulate = {
workspace.Part
}
local function simulateParts(duration)
local time = 0.0
local stepJob
stepJob = RunService.RenderStepped:Connect(function(dt)
if time + dt > duration then
dt = duration - time
end
workspace:StepPhysics(dt, partsToSimulate)
time = time + dt
if time >= duration then
stepJob:Disconnect()
end
end)
end
-- Simulate workspace parts for 5 seconds, stepping the parts once per frame
simulateParts(5.0)