Workspace 的核心任务是保持在 3D 世界中存在的对象,有效地 BaseParts 和 Attachments 。虽然这些对象是 Workspace 的子孙,但它们将是活的。对于 BaseParts , 这意味着它们将被渲染, 并且物理地与其他部分和世界互动。对于 Attachments , 这意味着被装饰的对象, 例如 ParticleEmitters , Beams , 和 BillboardGuis , 将渲染。
了解此行为很重要,因为它意味着对象可以在不需要时从 Workspace 中删除。例如,当播放另一张地图时,可以移除地图 Models 。在 3D 世界中没有立即需要的对象通常存储在 ReplicatedStorage 或 ServerStorage 中。
在其作为活动 3D 对象持有人的角色中,Workspace 包含一系列与零件、其位置和之间的连接相关的有用功能。
访问工工作间
Workspace 可以通过多种方式访问,所有方式都有效。
- workspace
- game:GetService("Workspace")
- game.Workspace
注释
- 需要装饰的对象,例如 和 ,在没有设置装饰人时将在 位置上。
- 从 Model:MakeJoints() 和 Model:BreakJoints() 继承的方法,在 Model 类中被覆盖,只能在插件中使用 Workspace:MakeJoints() 和 Workspace:BreakJoints() 。
- 无法删除 Workspace 。
- 客户端的当前 Camera 对象可以使用 Workspace.CurrentCamera 属性访问。
- Terrain 对象可以使用Workspace.Terrain 属性访问。
概要
属性
在地面等级的空气密度,用于气动力模型。
决定是否可以在游戏中出售其他用户创建的资产。
为本地客户端指定动画限速模式。
本地玩家正在使用的 Camera 对象。
游戏运行的时间,以秒为单位,已经运行了。
决定物理引擎是否在 BaseParts 上计算气动力,其 EnableFluidForces 属性为真值。
指定动画地形草、动态云和粒子的全球风向量。
确定由重力引起的加速对落下的 BaseParts 应用。
启用对 IKControls 的约束支持。如果禁用,IKControls 将忽略物理约束。
设置角色头和配件是否应下载为网格部件。
控制使用任何移动约束时选择装配根部分的逻辑。
设置解决器如何在时间上向前推进物理模拟。
配置引擎恢复事件处理器时。
配置引擎何时向玩家传送内容的决策。
是否为场景方启用内容传输。
决定是否启用 StreamingIntegrityMode。
内容最低距离将流向优先级高的玩家。
内容将流向玩家的最大距离。
决定是否在不同组中设置 parts 不会碰撞会忽略碰撞和触碰事件。
将模型上的细节级别设置为启用实例流式传输的体验。
在启用实例流时控制模型传输行为在 Models 上,当实例流启用时。
Model 的主部分,或 nil 如果未明确设置。
仅用于编辑器的属性用于在模型周围缩放。设置此属性会将缩放移至如果 Model/ScaleTo 被调用在它上。
决定哪里是 Model 做 不 有设置 Model.PrimaryPart 的旋转点。
方法
返回被认为是由于最近受到物理影响而被认为是物理活跃的 BaseParts 数量。
返回一个整数,介于 0 和 100 之间,代表物理模拟当前被限制到实时的百分比。
返回物理当前正在模拟的每秒钟的帧数。
返回服务器的 Unix 时间以秒为单位。
根据零件的表面和指定的连接创建模式,创建指定的 Parts 和任何接触部件之间的连接。
返回 true 如果游戏启用了PGS物理解决器。
位置和缩放 Workspace.CurrentCamera 以显示目前在 BaseParts 中的 Workspace 范围。
如果任何给定的 BasePart 触碰到任何其他部分,返回真值。
在给定的方向投射块形状,并返回一个 RaycastResult 如果形状击中 BasePart 或 Terrain 细胞。
返回一个阵列的零件,其 边界盒 重叠了给定的方块子。
返回一个阵列的零件,其 边界盒 重叠了给定的球体。
返回一个阵列的零件,其占用空间与给定的零件共享。
- IKMoveTo(part : BasePart,target : CFrame,translateStiffness : number,rotateStiffness : number,collisionsMode : Enum.IKCollisionsMode):()
通过逆向动力学将指定部件移至指定位置,而不是直接移动到那里,以确保参与该部件的任何关节、约束或碰撞仍然物理上满意。
使用起源、方向和可选 RaycastParams 投射射线,然后返回一个 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 偏移值移动一个 Vector3 ,保留模型的方向。如果新位置上已存在另一个 BasePart 或 Terrain ,那么 Model 将覆盖该对象。
获取 PVInstance 的枢轴。
将 以及所有其子孙 转换为位于指定 的位置,使旋转点现在位于指定的 。
活动
当永久模型已发送到指定玩家时,发生火灾。
属性
AirDensity
在 RMU/stud³ 单位中的地面等级 ( Y 的 0) 空气密度 (见 Roblox 单位 ),用于计算如果 Workspace.FluidForces 是 Experimental 的空气动力力。默认值对应标准温度和压力下的实际海平面空气密度。空气密度随着 Y 高度增加而下降,在 100,000 格上达到其地面等级值的 5%。在 0 下 Y 的 0,空气密度固定在输入值上。
AllowThirdPartySales
这个 Workspace 属性决定是否可以在游戏中出售由其他使用创建的资产。
什么是第三方销售?
当此值为 false 时,由于默认值为 false,只有地点创建者 (无论是玩家还是群组) 和 Roblox 创建的资产才能使用 MarketplaceService 进行出售。
在大多数情况下,游戏不需要出售第三方资产。然而,一些游戏,例如交易聊天室,需要此功能,因此它作为选项提供。
我可以卖哪些第三方产品?
注意,开发者产品只能在与它们相关的游戏中出售,无论 AllowThirdPartySales 设置为什么。该属性影响游戏通行证和服装。
AvatarUnificationMode
ClientAnimatorThrottling
指定 Enum.ClientAnimatorThrottlingMode 用于本地客户端使用。
启用后,远程模拟的 Model 实例上的动画将开始限制。限制器使用以下计算限制强度:
- 游戏内 FPS
- 活动动画数量
CurrentCamera
本地玩家正在使用的 Camera 对象。
如何使用当前相机
当寻找客户端的 对象时,使用此属性而不是寻找名为 "Camera" 的子对象。
当你设置此属性时,所有其他 Camera 对象在 Workspace 中都被摧毁,包括以前的 CurrentCamera 。如果您将此属性设置为 nil 或为不是工作区子孙的相机(或 CurrentCamera 另外被摧毁),将创建并分配新的 Camera 。避免这些情况,因为摧毁相机可能会有意外后果。
了解更多信息,请参阅编写相机脚本。
DistributedGameTime
游戏运行的时间,以秒为单位,已经运行了。
尽管标题如此,此值目前不是“分布”在客户端和服务器上。相反,在服务器上它代表服务器运行了多久。在客户端上,它代表客户端与服务器连接的时间长度。
开发人员不应该依赖上述行为,并且这个属性可能在将来的客户端和服务器上同步。
寻找程序启动以来的时间的人应该使用“时间”函数代替。请参阅以下比较,了解 DistributedGameTime 与其替代方案之间的区别。
local Workspace = game:GetService("Workspace")print(Workspace.DistributedGameTime) -- Time the game started runningprint(os.time()) -- Time since epoch (1 January 1970, 00:00:00) UTCprint(tick()) -- Time since epoch (1 January 1970, 00:00:00) system timeprint(time()) -- Time the game started runningprint(elapsedTime()) -- Time since Roblox started running
FallHeightEnabled
FallenPartsDestroyHeight
该属性决定 Roblox 引擎在自动移除掉落的 BaseParts 和其祖先 Models 从 Workspace 时,将它们转移到 nil 以做父系。这是防止地图上掉下来的零件永远掉下去的。
如果由于这种行为而移除的零件是 Model 中的最后一零件,那么该模型也将被移除。这适用于零件的所有模型祖先。
该属性位于 -50,000 和 50,000 之间,因为 BaseParts 在很大距离的起源处由于浮点不准确而无法正确模拟或渲染。
此属性可以由脚本阅读,但只能由插件、命令栏或 Studio 的属性窗口设置。
FluidForces
启用此属性后,物理引擎会计算在 BaseParts 上的空气动力学力,其 EnableFluidForces 属性为真值。默认值、Default,关闭了空气动力力。请注意,此属性不能通过脚本设置,必须在 Studio 中切换。
Gravity
确定由重力引起的加速对落下的 BaseParts 应用。这个值以每秒钟的 studs 计算,默认值为 196.2 studs/秒 2 。通过更改此值,开发人员可以模拟游戏中低重力或高重力的效果。
代码示例
This script creates a touch pad in the workspace that, when touched, will reduce the game's gravity. Activating the pad again will switch back to normal gravity.
local MOON_GRAVITY_RATIO = 1.62 / 9.81
local DEFAULT_GRAVITY = 196.2
local MOON_GRAVITY = DEFAULT_GRAVITY * MOON_GRAVITY_RATIO
-- Create a touch pad
local pad = Instance.new("Part")
pad.Size = Vector3.new(5, 1, 5)
pad.Position = Vector3.new(0, 0.5, 0)
pad.Anchored = true
pad.BrickColor = BrickColor.new("Bright green")
pad.Parent = workspace
-- Listen for pad touch
local enabled = false
local debounce = false
local function onPadTouched(_hit)
if not debounce then
debounce = true
enabled = not enabled
workspace.Gravity = enabled and MOON_GRAVITY or DEFAULT_GRAVITY
pad.BrickColor = enabled and BrickColor.new("Bright red") or BrickColor.new("Bright green")
task.wait(1)
debounce = false
end
end
pad.Touched:Connect(onPadTouched)
IKControlConstraintSupport
启用对 IKControls 的约束支持。Default与Enabled相同。如果禁用,IKControls忽略物理限制。见 IKControl 获取额外细节。
InsertPoint
MeshPartHeadsAndAccessories
设置角色头和配件是否应下载为 MeshParts。Default与Enabled相同。如果启用此功能,内置虚拟形象将使用 MeshParts 为角色的头部和饰品。
ModelStreamingBehavior
MoverConstraintRootBehavior
控制使用以下限制之一的机制选择装配根部件的逻辑:
当此属性设置为 时,如果约束没有在两个部件之间传递力,这些约束将被忽略,当选择集装根部件时(一些例子是 设置为 , 设置为 或 设置为 )。
当此属性设置为 Enum.MoverConstraintRootBehaviorMode.Disabled 时,这些约束可能在选择装配根部件时被误认为是约束,导致在添加这些约束到机制时出现不一致的网络所有权和延迟。
PathfindingUseImprovedSearch
PhysicsImprovedSleep
PhysicsSteppingMethod
设置解决器如何在时间上向前推进物理模拟。此选项不可脚本化,必须从 PhysicsSteppingMethod 属性的 工作区 内设置。请参阅适应性时间步骤获取详细信息。
<th>描述</th></tr></thead><tbody><tr><td><b>适应性</b></td><td>引擎尝试为单个装配的最佳仿真速率分配 240 Hz、120 Hz 或 60 Hz。此设置优化了性能。</td></tr><tr><td><b>已修复</b></td><td>工作区内的所有模拟装配都会以 240 Hz 的速度前进。这个选项最适合最佳稳定性和模拟精度。</td></tr><tr><td><b>默认</b></td><td>当前默认值为 <b>固定</b>。</td></tr></tbody>
选项 |
---|
请注意,当不同模拟速率的组件通过 Constraints 或碰撞连接时,组合机制将默认为稳定性最高的模拟速率。
PlayerCharacterDestroyBehavior
PrimalPhysicsSolver
RejectCharacterDeletions
RenderingCacheOptimizations
ReplicateInstanceDestroySetting
Retargeting
SandboxedInstanceMode
SignalBehavior
该属性决定是否在事件触发时立即恢复事件处理程序,或暂停,然后在稍后的恢复点恢复。暂停点目前包括:
- 输入处理(每次输入处理一次,请参阅 UserInputService)
- 遗产等待脚本重新启动,例如 wait() , spawn() , 和 delay()
了解更多信息,请参阅延迟事件。
StreamOutBehavior
流出行为 控件是在设备内存条件或基于流传播半径的情况下,从内容中卸载的地方。
还见:
- Workspace.StreamingEnabled 用于控制是否启用内容传输,
StreamingEnabled
streamingEnabled 属性决定是否为该场景方启用游戏内容传输。该属性不可脚本化,因此必须在 Studio 中设置在 工作区 对象上。
还见:
StreamingIntegrityMode
如果实例 传播 启用,一个体验可能会以未预期的方式行动,如果玩家的角色移动到世界的区域尚未传播到他们的客户端。流媒体完整性功能提供了一种避免这些可能带来问题的情况的方法。
StreamingMinRadius
流媒体最小半径 属性表示玩家角色或当前内容在最高优先级下将被流媒体的半径。默认为 64 个钉子。
增加默认最小半径时,应注意安全,因为这将需要更多的内存和更多的服务器带宽,而忽略其他组件。
还见:
- Workspace.StreamingEnabled 用于控制是否启用内容传输,
StreamingTargetRadius
传输目标半径 属性控制最大距离离开玩家角色或当前内容将在其中传输的ReplicationFocus。默认为 1024 格。
请注意,引擎可以保留先前加载的内容超出目标半径,内存允许。
还见:
- Workspace.StreamingEnabled 用于控制是否启用内容传输,
TouchEventsUseCollisionGroups
TouchesUseCollisionGroups
该属性决定是否在不同组中设置为不会碰撞的 parts 将忽略碰撞和触碰事件。默认情况下,该属性的值设置为 false .
当此属性启用时,不同组中设置不会碰撞的零件也会忽略 CanTouch 属性,与 BasePart.CanCollide 被忽略的方式相似。了解有关 CanTouch 行为的更多信息,请访问其属性页面。
方法
GetNumAwakeParts
返回被认为是由于最近受到物理影响而被认为是物理活跃的 BaseParts 数量。
该函数提供了多少 BaseParts 受到物理力的影响或最近受到物理力影响的测量。
local Workspace = game:GetService("Workspace")print(Workspace:GetNumAwakeParts())
睡眠与醒来零件
为了确保良好的性能,Roblox 设置 BaseParts 中的物理不被应用到“睡眠”状态。 设置为真的,例如,将永远处于睡眠状态,因为物理对他们没有适用。当向未锚定的BasePart施加力时,将应用“醒来”状态。当一个 BasePart 醒来时,Roblox 物理引擎会进行连续计算,以确保物理力与零件正确交互。一旦 BasePart 不再受到物理力的影响,它将恢复到睡眠状态。
返回
醒来的零件数量。
GetPhysicsThrottling
返回一个整数,介于 0 和 100 之间,代表物理模拟当前被限制到实时的百分比。
该函数可用于确定是否,以及到什么程度,物理限制正在发生。
物理限制是什么?
物理限制发生时,物理引擎检测到无法在实时跟上游戏。当物理被限制时,它会更少地更新,导致 BaseParts 看起来移动速度更慢。
无需限制,物理模拟将落后于游戏,与游戏失去同步。这可能会导致更低的帧率和其他不良行为。
与 Humanoids 相关的对象免受物理限制。
还见 Workspace:SetPhysicsThrottleEnabled() 。
显示物理限制
开发人员应该总是避免创建超载物理引擎的地点,因为它会导致玩家的体验降低。然而,希望用于研究目的模拟物理限制的人只需要很快创建大量 Parts 就可以了。
local Workspace = game:GetService("Workspace")local i = 0while true doi += 1if i % 5 == 0 thentask.wait()endlocal part = Instance.new("Part", Workspace)end
返回
物理模拟当前被限制到实时的百分比。
GetRealPhysicsFPS
返回物理当前正在模拟的每秒钟的帧数。
使用 GetRealPhysicsFPS 来对抗漏洞利用者
常见的使用这个函数是检测是否恶意程序正在提高本地物理框架速率以更快移动。这通常通过将客户端的 GetRealPhysicsFPS 返回的结果与在正常情况下不会被侵犯的最大值进行比较来实现(通常为 65 或 70)。如果此限制被突破,开发者可以使用 Player:Kick() 函数来从游戏中删除那个 Player 。要记住,尽管这种实践有时可能有效,客户端反欺诈措施永远不会是 100% 可靠的。
返回
返回物理当前正在模拟的每秒钟的帧数。
代码示例
Speed exploiters commonly increase their local physics FPS in order to increase their character speed. This can be detected from a LocalScript by checking if the player's physics FPS is over the maximum:
local Players = game:GetService("Players")
local player = Players.LocalPlayer
while task.wait(1) do
if workspace:GetRealPhysicsFPS() > 65 then
player:Kick()
end
end
GetServerTimeNow
GetServerTimeNow() 返回客户端对服务器当前时间的最佳估计。这有助于创建同步体验,因为每个客户端都会获得相同的结果,无论其时区或本地时间如何。
这返回一个类似于 os.time() 的 Unix 时戳,可以与 os.date() 或与 DateTime.fromUnixTimestamp() 一起使用。
由此函数返回的时戳已被平滑,以便:
- 它是单调的;它的值永远不会下降。
- 它以与本地时钟相同的速度移至 0.6% 内。
GetServerTimeNow() 比 DateTime.now() 昂贵,精度较低于 os.clock() ,因此应用于确保事件在正确的现实世界时间开始或定期调整以保持一系列事件的同步。
这个函数依赖服务器,因此从未连接的客户端调用将抛出错误。请注意,此函数不适合用于定时奖励等事情,因为它不安全地跟踪服务器上的计时器。
还见:
- DistributedGameTime , 游戏时钟
返回
服务器上的估计 Unix 时戳。
JoinToOutsiders
这个函数会在指定的 Parts 和任何接触部件之间创建节点,取决于零件的表面和指定的节点创建模式。
这个函数创建了指定零件和任何平面接触表面之间的连接,取决于零件的表面和指定的连接创建模式。
- 胶水、钮扣、入口、通用、焊接和光滑表面都会创建焊接实例。
- 球体不会与任何东西表面焊接。圆柱的圆角侧不会表面焊接,但平面边侧会。
第一个参数是一个 BaseParts 阵列。关节只能在阵列中的部件之间创建,而不是在阵数组中。阵数组中的零件之间不会创建关节。
第二个参数是一个 Enum.JointCreationMode ,决定如何创建节点。传递枚举值 Enum.JointCreationMode.All 或 Enum.JointCreationMode.Surface 时,行为与“永远加入”相同
此函数由 Roblox Studio 移动工具在用户完成移动选择后使用。结合 Plugin:GetJoinMode() 和 Workspace:UnjoinFromOutsiders() 可用于开发自定义工作室构建工具时保留连接功能。请参阅下面的代码片段获取示例。
local Workspace = game:GetService("Workspace")
-- 完成选择移动;创建关节
local function finishedMovingParts(parts)
local joinMode = Plugin:GetJoinMode()
Workspace:JoinToOutsiders(parts, joinMode)
end
local Workspace = game:GetService("Workspace")
-- 开始移动选择;打破关节
local function startMovingParts(parts)
Workspace:UnjoinFromOutsiders(parts)
end
参数
一个由 BaseParts 组成的阵列,用于将节点连接起来。
要使用的 Enum.JointCreationMode 。传递 Enum.JointCreationMode.All 或 Enum.JointCreationMode.Surface 具有相同的行为,这相当于始终加入。
返回
PGSIsEnabled
返回 true 如果游戏启用了PGS物理解决器。
由于无法通过脚本访问 Workspace.PGSPhysicsSolverEnabled,PGSIsEnabled 函数允许开发人员告诉游戏正在使用哪个物理解决器。
返回
如果PGS解决器启用,为真。
UnjoinFromOutsiders
打破指定的 BaseParts 和其他 BaseParts 之间的所有关节。
此函数需要一个 BaseParts 阵列。注意,在这些 BaseParts (之间) 之间的连接不会被破坏,只有在这些 BaseParts 和其他 BaseParts 之间的数组列中不会被破坏。
此函数由 Roblox Studio 移动工具在用户开始移动选择时使用。结合 Plugin:GetJoinMode() 和 Workspace:JoinToOutsiders() 可用于开发自定义 Studio 构建工具时保留连接功能。请参阅下面的代码片段获取示例。
local Workspace = game:GetService("Workspace")
-- Finished moving a selection; make joints
local function finishedMovingParts(parts)
local joinMode = Plugin:GetJoinMode()
Workspace:JoinToOutsiders(parts, joinMode)
end
local Workspace = game:GetService("Workspace")
-- Started moving a selection; break joints
local function startMovingParts(parts)
Workspace:UnjoinFromOutsiders(parts)
end
参数
一个由 BaseParts 组成的阵列,用于破坏连接的人。
返回
ZoomToExtents
位置和缩放 Workspace.CurrentCamera 以显示目前在 BaseParts 中的 Workspace 范围。
此函数曾在 Roblox Studio 的,现已删除,“缩放到极限”按钮中使用。它具有与“缩放到”(F快捷键方式)精选能相似的行为,但显示的是 Workspace 而不是当前选定对象的范围。
此函数不能在脚本中使用,但会在命令栏或插件中运行。
返回
活动
PersistentLoaded
该事件每当玩家发送所有现有持久模型和零部分原子模型时触发。player 参数表示哪个玩家收到了所有适用的实例。
请注意,体验加载发生在永久加载之前,发射 DataModel.Loaded 事件不表示所有永久模型都存在。