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 將忽略物理限制。
設置角色頭和配件應否下載為網格零件。
控制使用任何移動限制時選擇裝配根部分的邏輯。
設定解決器將如何在時間上向前推進物理模擬。
配置引擎重新啟動事件處理器時間。
配置引擎何時決定向玩家傳送內容的方式。
是否為空間方啟用內容傳輸。
決定是否啟用串流完整性模式。
內容會以最低距離傳送給優先級高的玩家。
內容將傳送到玩家的最大距離。
決定不同群組中的 parts 是否設為不會碰撞和觸碰事件,將會忽略碰撞和觸碰事件。
為啟用實例傳輸的體驗設置模型的細節程度。
在啟用實例傳輸時,控制模型傳輸行為在 Models 上。
Model 的主要部分,或 nil 如果未明確設設定。
僅用於編輯器的屬性,用於擴展模型周圍的旋轉點。設置此屬性會將比例移至如果 Model/ScaleTo 被呼叫在它上面。
決定哪裡是 不具有設置的 軸心所在的地方。
方法
返回被認為最近受到物理學影響的 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必須設為 永久每個玩家 以便行為在添加後發生變更。
返回包含模型所有部分的卷的說明。
返回包含所有 BaseParts 在 Model 中最小綁定箱的尺寸,並與 Model.PrimaryPart 一起對齊,如果已設定。
返回此模型對象持有的所有 Player 對象。行為取決於此方法是否從 Script 或 LocalScript 中呼叫。
返回模型的正常比例,預設為新建模型的 1,並且在通過 Model/ScaleTo 縮放時會變更。
將 PrimaryPart 移動到指定位置。如果未指定主要零件,將使用模型的根部分。
使此模型對指定玩家不再持久。Model.ModelStreamingMode必須設為 永久每個玩家 以便在移除後變更行為。
設置模型的縮放因子,調整所有子模塊的大小和位置,使其具有與初始大小和位置相關的縮放因子,當縮放因子為 1 時。
以給定的 Model 偏移值移動 Vector3 ,保留模型的方向。如果另一個 BasePart 或 Terrain 已在新位置存在,那麼 Model 將覆蓋該對物件。
獲得 PVInstance 的軸心。
將 以及所有其子孫 轉換為指定的 位置,使旋轉點現在位於指定的 位置。
活動
當永久模型已傳送到指定玩家時,發生火災。
屬性
AirDensity
在 RMU/學³ 單位中的地面等級 ( Y 的 0) 空氣密度 (見 Roblox 單位 ),用於計算如果 Workspace.FluidForces 是 Experimental 時的空氣動力力。預設對應標準溫度和壓力下的實際海平面空氣密度。空氣密度會隨著 Y 高度增加而衰減,在 100,000 個單位上達到其地面等級值的 5%。在 0 下 Y 的 0,空氣密度被固定在輸入值上。
AllowThirdPartySales
這個 Workspace 屬性決定是否可以在遊戲中出售其他使用創建的資產。
第三方銷售是什麼?
當此值為假值時,即使預設值,只有位置創建者(是玩家或群組)和 Roblox 創建的資產才能使用 MarketplaceService 來出售。
在大多數情況下,遊戲不需要出售第三方資產。然而,一些遊戲,例如交易聊天室,需要此功能,因此它作為選擇選項存在。
我可以出售哪些第三方產品?
注意,開發者產品只能在與它們相關的遊戲中出售,無論 AllowThirdPartySales 設置為什麼。此特性影響 遊戲通行證 和 服裝 。
AvatarUnificationMode
ClientAnimatorThrottling
指定 Enum.ClientAnimatorThrottlingMode 用於本地客戶端。
啟用時,遠端模擬的 Model 實例上的動畫將開始限制。限制器使用以下計算來計算限制強度:
- 遊戲內的FPS
- 活動動畫數量
CurrentCamera
本地玩家使用的 Camera 對象。
如何使用現有相機
當尋找客戶的 對物件時,請使用此屬性,而不是尋找名為 "Camera" 的子對象。
當您設置此屬性時,所有其他 Camera 對象在 Workspace 中都被摧毀,包括以前的 CurrentCamera 。如果您將此屬性設為 nil 或屬於工作區的子孫的相機 (或 CurrentCamera 否則毀滅),將創建並分配一個新的 Camera 。避免這些情況,因為破壞相機可能會有未預期的後果。
欲了解更多信息,請參閱腦寫相機。
DistributedGameTime
遊戲運行的時間,以秒為單位,已經過了。
雖然標題如此,此值目前並未在客戶端和伺服器上「分佈」。相反,在服務器上代表服務器已運行多久。在客戶端上,它代表客戶端與伺服器連線的時間長度。
開發人員不應該依賴上述行為,並且這個屬性可能會在未來的客戶端和伺服器上同步。
尋找程式開始運行後的時間的人應該使用「time」函數取代。請參閱以下比較 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 應用。此值以每秒鐘厘米為單位,預設值為 196.2 厘米/秒 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
設定解決器將如何在時間上向前推進物理模擬。此選項無法腳本化,必須從 Studio 的 物理步驟方法 屬性中設置 工作區 內。請參閱適應時間步驟了解詳情。
<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
傳輸最小範圍 屬性指示玩家角色或目前的 ReplicationFocus 範圍內的內容將以最高優先級進行傳輸。預設為 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 在物理不被應用到「睡眠」狀態時。BaseParts 設為真實的,例如BasePart.Anchored,將永遠睡眠,因為物理學對他們不適用。當對未錨定的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() 返回客戶端對伺服器當前時間的最佳估計。這有助於創建同步體驗,因為每個客戶都會獲得相同的結果,無論時區或本地時間如何。
這會返回一個 Unix 時間戳,類似於 os.time() ,可以與 os.date() 或 DateTime.fromUnixTimestamp() 使用。
由此函數返回的時戳已被平滑,以便:
- 它是單調的;它的值永遠不會減少。
- 它以相同速度移至本地時間至 0.6% 內。
GetServerTimeNow() 比 DateTime.now() 昂貴,且精度低於 os.clock() ,因此應該用於確保事件在正確的實世時間開始或定期調整以保持一系列事件的同步。
這個功能依靠服務器,因此從未連線的客戶端呼叫它會發生錯誤。請注意,此功能不適合用於定時獎勵等事情,因為它不安全地跟蹤伺服器上的定時器。
也見:
- DistributedGameTime , 遊戲時間表
返回
伺服器上估計的 Unix 時戳。
JoinToOutsiders
這個功能會在指定的 Parts 和任何接觸部件之間創建聯結,取決於零件的表面和指定的聯結創建模式。
這個功能會創建特定零件和任何平面接觸表面之間的節點,取決於零件的表面和指定的節點創建模式。
- 膠水、螺柱、入口、通用、焊接和平滑表面都會創建焊接實例。
- 球體不會與任何物體表面焊接。圓柱的圓角側不會表面焊接,但平面端側會。
第一個參數是一個 BaseParts 陣列。關節只會在 array 中的零件之間創建,而不是在 array 中。在陣列中的零件之間不會創建聯結。
第二個參數是 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 (之間) 的節點不會在 array 中破碎,只能在這些 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 事件不表示所有永久模型都存在。