WorldRoot

显示已弃用

*此内容使用人工智能(Beta)翻译,可能包含错误。若要查看英文页面,请点按 此处

无法创建

此基础类为处理 3D 空间查询和模拟的 API 提供 API,例如 WorkspaceWorldModel

概要

属性

继承自Model属性继承自PVInstance属性

方法

继承自Model方法继承自PVInstance方法

属性

方法

ArePartsTouchingOthers

ArePartsTouchingOthers 返回 true 如果至少一个给定的 BasePart 触摸任何其他部分。如果它们在距离门限内,两个部分被视为 "触摸",overlapIgnored

如果没有提供零件,将返回 false。

参数

partList: Instances

一个列表的零件检查来确定列表中的零件是否触摸到列表中的零件。

overlapIgnored: number

在零件被视为触摸时,零件之间的交叉门阈值在 studs 中被忽略。

默认值:0.000199999995

返回

parts 中,如果 partList 中的任何部分触摸到其他部分 (部分不在于部分列表) ,则为 真的情况下,如果没有部分通过。

代码示例

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.

Checking for Touching Parts

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

写入并联

以指定方向中的方块形状投射在一个给定的方向,并且在第一个碰撞时使用 BasePartTerrain 元素来返回。这与使用 WorldRoot:Raycast() 将直线射线投射到一个方向以寻找碰撞,但使用 3D 形而不是射线进行。

WorldRoot:GetPartsInPart() 不同,此方法不会检测到 BaseParts ,该 最初 交叉形状。

如果检测到命中,一个 RaycastResult 包含命中信息。Distance 代表形状需要前往的距离,Position 代表交叉点,导致命中。

此方法将抛出一个错误,如果它通过无效的 CFrame 、大小或方向输入。

参数

cframe: CFrame

初始位置和旋转方向的树形块的初始位置。

size: Vector3

方块的大小在 studs 中表示。最大大小是 512 studs。

direction: Vector3

方向 shapecast,用于表示形状可以旅行的最大距离。最大距离是 1024 格。

默认值:"RaycastParams{IgnoreWater=false, BruteForceAllSlow=false, RespectCanCollide=false, CollisionGroup=Default, FilterDescendantsInstances={}}"

返回

包含 shapecast 操作的结果,或 nil 如果没有适合的 BasePartTerrain 元素被击中。

代码示例

Casts a block and returns the first collision with a BasePart or Terrain. Prints the properties of the RaycastResult if a result was hit.

Blockcasting

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

void

此函数将一个BaseParts 的表移到一个CFrames 的表,而不需要先发射默认属性Changed 事件。 这提供了一个快速的方法来移动大量零件,因为您不需要为每个零件付费。

第三个参数允许您进一步优化移动操作。默认情况下,每个部分的 Changed 事件都会

注意,您只应该使用此函数,如果您确定零件移动是您的验证码中的瓶颈。 设置个别零件和焊接模型的 CFrame 属性是在大多数情况下足够快的。

参数

partList: Instances
cframeList: Array
默认值:"FireAllEvents"

返回

void

GetPartBoundsInBox

Instances
写入并联

WorldRoot:GetPartBoundsInBox() 返回一个包含零件的列表,其 边界箱 与描述了中心(CFrame)和大小(0> Datatype.Vector30>)的箱子交叉。

正如所述,此空间查询方法有效地考虑零件的边界盒的体积而不是其实际的填充体积。 在考虑圆柱体、球体、联接和 MeshParts (其形状不是块)时,可能需要使用 WorldRoot:GetPartsInPart() 或进一步过滤此方法的结果。 对于需要精确度

此方法使用一个 OverlapParams 对象描述空间查询的可重用部分,例如包含或排除列表、最大部件数量、要求的最大部件数量、是否使用 碰撞群组 和查询的最终 BasePart.CanCollide 值。

参数

cframe: CFrame

指定的音箱音量的中心位置。

size: Vector3

要查询的给定音箱音量。

overlapParams: OverlapParams

包含空间查询参数的可重用部分。

默认值:"OverlapParams{MaxParts=0, Tolerance=0, BruteForceAllSlow=false, RespectCanCollide=false, CollisionGroup=Default, FilterDescendantsInstances={}}"

返回

Instances

Class.BasePart|BaseParts 阵列,与空间查询匹配。

GetPartBoundsInRadius

Instances
写入并联

WorldRoot:GetPartBoundsInRadius() 返回一个包含零件的列表,其 边界箱 与描述使用中心 ( Vector3 ) 和半径 (number) 的球体交叉。

正如所述,此空间查询方法有效地考虑零件的边界盒的体积而不是其实际的填充体积。 在考虑圆柱体、球体、联接和 MeshParts (其形状不是块)时,可能需要使用 WorldRoot:GetPartsInPart() 或进一步过滤此方法的结果。 对于需要精确度

此方法使用一个 OverlapParams 对象描述空间查询的可重用部分,例如包含或排除列表、最大部件数量、要求的最大部件数量、是否使用 碰撞群组 和查询的最终 BasePart.CanCollide 值。

参数

position: Vector3

要查询的球体音量中心的位置。

radius: number

要查询的球体音量的半径。

overlapParams: OverlapParams

包含空间查询参数的可重用部分。

默认值:"OverlapParams{MaxParts=0, Tolerance=0, BruteForceAllSlow=false, RespectCanCollide=false, CollisionGroup=Default, FilterDescendantsInstances={}}"

返回

Instances

Class.BasePart|BaseParts 阵列,与空间查询匹配。

GetPartsInPart

Instances
写入并联

WorldRoot:GetPartsInPart() 返回一个拥有空间与指定部分共用的部分阵列(必须在同一个 WorldRoot 上存在)。此方法可以在 BasePart:GetTouchingParts() 的替代方法,通常是更好的选择。

您注意到,此空间查询方法考虑到 正确的音量 由指定的零件使用完整的几何碰撞检查占用的空间。 作为示例,一个凹状/空心状零件不会在其中与要求的零件匹配,除非它们实际上相互交叉/触摸。 对于更简单的零件,请

此方法使用一个 OverlapParams 对象描述空间查询的可重用部分,例如包含或排除列表、最大部件数量、要求的最大部件数量、是否使用 碰撞群组 和查询的最终 BasePart.CanCollide 值。

参数

part: BasePart

零件的音量是要与其他零件对比的。

overlapParams: OverlapParams

包含空间查询参数的可重用部分。

默认值:"OverlapParams{MaxParts=0, Tolerance=0, BruteForceAllSlow=false, RespectCanCollide=false, CollisionGroup=Default, FilterDescendantsInstances={}}"

返回

Instances

Class.BasePart|BaseParts 阵列,与空间查询匹配。

IKMoveTo

void
插件安全性

此函数将指定的部分移动到指定的位置,而不是直接移动到那里,以确保任何关联,Class.Plugin|constraints 或参与的部分在物理上满意。目前此函数仅在 Studio 中提供,因为它目前与运行中的游戏的物理学发生冲突。

翻译硬度 是一个数字,它之间的数字 0 和 1 指定要匹配零件的位置到目标 CFrame 的位置部分。 旋转硬度 是一个数字,它之间的数字 0 和 1 指定要匹配零件的旋转到旋转部分。

例如:

  • 如果将翻译和旋转硬度都设置为 1,零件将在不考虑物理限制的情况下正确移动到目标 CFrame 上。
  • 如果翻译硬度和旋转硬度都等同于0.5,零件将尝试移动到目标CFrame,但可能会被物理限制推出道路。
  • 如果将硬度翻译和旋转硬度都设置为 0 ,那么目标 CFrame 将被忽略,物理限制将解决在位置为它所在位置的对象。

参数

part: BasePart

正在移动零件。

target: CFrame

用于移动指定部件的位置。

translateStiffness: number

一个数字,在 0 和 1 之间,指定要求零件的位置与目标零件的位置的匹配程度 CFrame .

默认值:0.5
rotateStiffness: number

一个数字,在 0 和 1 之间,指定要求零件旋转到目标 CFrame 的旋转部分。

默认值:0.5
collisionsMode: Enum.IKCollisionsMode

允许您指定物理解析度对象的影响。

默认值:"OtherMechanismsAnchored"

返回

void
写入并联

使用原始、方向和可选的 RaycastParams 射线。 如果它找到有资格的 BasePartTerrain 细胞,将返回包含操作结果的

注意,方向向量的长度(大小)很重要,因为对象/地形远离其长度不会被测试。如果您使用 CFrame 来帮助创建射线部件,请考虑使用 CFrame.LookVector 作为方向向量并乘以所需长度。最大方向向量的长度为

此方法不使用 Ray 对象,但它的原始和方向组件可以从 Ray.Origin 和 1> Datatype.Ray.Direction1> 借鉴。

参数

origin: Vector3

射线的起始点。

direction: Vector3

射线的方向向量。注意,长度为该向量的长度,因此部件/地形远离它不会被测试。

raycastParams: RaycastParams

用于在射线投射操作中指定是否命中的对象。如果未提供,默认值将用于所有部分,并且 Terrain 水不会被忽略。

默认值:"RaycastParams{IgnoreWater=false, BruteForceAllSlow=false, RespectCanCollide=false, CollisionGroup=Default, FilterDescendantsInstances={}}"

返回

包含射线投射操作的结果,或 nil 如果没有适合的 BasePartTerrain 元素被击中。

代码示例

Casts a ray and returns the first collision with a BasePart or Terrain. Prints the properties of the RaycastResult if a result was hit.

Raycasting

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

参数

part: BasePart
direction: Vector3
默认值:"RaycastParams{IgnoreWater=false, BruteForceAllSlow=false, RespectCanCollide=false, CollisionGroup=Default, FilterDescendantsInstances={}}"

返回

Spherecast

写入并联

以给定的方向施放一个圆形形状,并且在第一次碰撞时使用 BasePartTerrain 元素来返回第一次碰撞。这与使用 WorldRoot:Raycast() 施放直线射线在方向施放时返回第一次碰撞的方式相似,但它使用 3D 形式而不是射线。

WorldRoot:GetPartsInPart() 不同,此方法不会检测到 BaseParts ,该 最初 交叉形状。

如果检测到命中,一个 RaycastResult 包含命中信息。Distance 代表形状需要前往的距离,Position 代表交叉点,导致命中。

此方法将抛出一个错误,如果输入了无效的范围或方向输入。

参数

position: Vector3

初始位置的投射球形。

radius: number

球面形状的半径在螺柱上。最大半径是 256 螺柱。

direction: Vector3

方向 shapecast,用于表示形状可以旅行的最大距离。最大距离是 1024 格。

默认值:"RaycastParams{IgnoreWater=false, BruteForceAllSlow=false, RespectCanCollide=false, CollisionGroup=Default, FilterDescendantsInstances={}}"

返回

包含 shapecast 操作的结果,或 nil 如果没有适合的 BasePartTerrain 元素被击中。

代码示例

Casts a sphere and returns the first collision with a BasePart or Terrain. Prints the properties of the RaycastResult if a result was hit.

Spherecasting

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

void
插件安全性

基于指定的时间增量和可选的 BasePart 集合,模拟

参数

dt: number

将要模拟的时间长度。此参数必须是正数。大于这个参数的值会增加此函数的运行时间。

parts: Instances

可选的零件阵列将被模拟。此集必须包含类型为 BasePart 的实例;任何其他类型都将被忽略。

默认值:"{}"

返回

void

代码示例

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.

StepPhysics

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)

活动