RunService 包含用於時間管理的方法和事件以及用於管理體驗或腳本運行的上下文。方法如 IsClient() , IsServer() 和 IsStudio() 可以幫助您確定在哪個上下文代碼運行。這些方法對於 ModuleScripts 有用,可能需要由客戶端和服務器端的腳本共同使用。此外,IsStudio() 可用於在 Studio 測試中添加特殊行為。
RunService 也包含允許您的代碼遵守 Roblox 框架循環的事件,例如 PreRender , PreAnimation , PreSimulation , PostSimulation 和 Heartbeat 。選擇適當的事件以在任何情況下使用是很重要的,因此您應該閱讀 任務排程器 來做出明智的決定。
上下文測試結果
<th><code>Class.RunService:IsStudio()|IsStudio</code></th><th><code>Class.RunService:IsClient()|IsClient</code></th><th><code>Class.RunService:IsServer()|IsServer</code></th><th><code>Class.RunService:IsEdit()|IsEdit</code></th><th><code>Class.RunService:正在執行()|正在執行</code></th><th><code>Class.RunService:IsRunMode()|IsRunMode</code></th></tr></thead><tbody><tr><td>實時玩家</td> <td><code>false</code> ></td> <td><code>真實</code> ></td> <td><code>假</code> ></td><td /><td /><td /></tr><tr><td>實時伺服器</td> <td><code>false</code> ></td> <td><code>false</code> ></td> <td><code>true</code> ></td><td /><td /><td /></tr><tr><td>編輯模式</td><td><code>真的</code></td><td><code>真的</code></td><td><code>真的</code></td><td><code>真的</code></td><td><code>否</code></td><td><code>否</code></td></tr><tr><td>合作編輯</td><td><code>真的</code></td><td><code>真的</code></td><td><code>否</code></td><td><code>真的</code></td><td><code>否</code></td><td><code>否</code></td></tr><tr><td>執行模式</td><td><code>真的</code></td><td><code>真的</code></td><td><code>真的</code></td><td><code>否</code></td><td><code>真的</code></td><td><code>真的</code></td></tr><tr><td>遊戲模式(客戶)</td><td><code>真的</code></td><td><code>真的</code></td><td><code>否</code></td><td><code>否</code></td><td><code>真的</code></td><td><code>否</code></td></tr><tr><td>遊戲模式(伺服器)</td><td><code>真的</code></td><td><code>否</code></td><td><code>真的</code></td><td><code>否</code></td><td><code>真的</code></td><td><code>真的</code></td></tr><tr><td>團隊測試(玩家)</td><td><code>真的</code></td><td><code>真的</code></td><td><code>否</code></td><td><code>否</code></td><td><code>真的</code></td><td><code>否</code></td></tr><tr><td>團隊測試(服務器)</td><td><code>否</code></td><td><code>否</code></td><td><code>真的</code></td><td><code>否</code></td><td><code>真的</code></td><td><code>否</code></td></tr></tbody>
環境 |
---|
概要
方法
給予一個函數名稱和優先級,此方法將函數綁定到 RunService.PreRender 。
返回目前環境是否在客戶端運行。
返回目前環境是否處於 Edit 模式。
返回是否按下了 執行 按鈕以在 Studio 中執行模擬。
返回體驗目前是否運行。
返回目前環境是否在伺服器上運行。
返回目前環境是否在 Studio 中運行。
如果體驗運行中,暫停模擬體驗的物理和腳本;如果體驗已停止運行,則暫停物理和腳本。
執行遊戲的模擬,執行物理和腳本。
停止運行中的體驗模擬。
解除使用 RunService:BindToRenderStep() 綁定渲染循環的功能的綁定。
活動
在物理模擬完成後,發射每一個框架。
在物理模擬完成後,發射每一個框架。
在物理模擬之前,每一個框架都會發生火災,但在渲染後。
在框架渲染之前,發射每個框架。
在物理模擬之前,發射每一個框架。
在框架渲染之前,發射每個框架。
在物理模擬之前,發射每一個框架。
屬性
ClientGitHash
RunState
方法
BindToRenderStep
BindToRenderStep() 函數會將自訂功能綁定到在渲染步驟期間特定時間呼叫。有三個主要論點:name、priority、以及要呼叫的內容function。
由於與客戶端的渲染過程相關,BindToRenderStep()只能在客戶端上呼叫。
名稱
name 參數是綁定的標籤,可以與 RunService:UnbindFromRenderStep() 一起使用,如果綁定不再需要。
local RunService = game:GetService("RunService")
local function functionToBind() end
-- 將上面的功能綁定到名為「tempBinding」的綁定中
RunService:BindToRenderStep("tempBinding", 1, functionToBind)
-- 取消「tempBinding」綁定的功能
RunService:UnbindFromRenderStep("tempBinding")
優先級
綁定的 priority 是整數;它決定在渲染步驟期間呼叫自訂函數的時間。數字越低,呼叫自訂函數的時間就越早。如果兩個綁定具有相同的優先級,Roblox 引擎將隨機選擇其中一個先執行。預設 Roblox 控制腳本會以下列優先級運行:
- 玩家輸入:100
當使用 Enum.RenderPriority 時,請記得在所需枚舉的結尾使用 .Value 。RunService:BindToRenderStep() 將無法運作,如果只使用枚舉本擁有。
local RunService = game:GetService("RunService")
local function beforeCamera(delta)
-- 這裡的代碼將在預設 Roblox 攝影機腳指令碼之前運行
end
RunService:BindToRenderStep("Before camera", Enum.RenderPriority.Camera.Value - 1, beforeCamera)
自訂功能和 Delta 時間
最後一個參數(function)是要呼叫的自訂函數。此功能將傳遞一個名為 deltaTime 的參數,該參數顯示從上一個渲染步的開始到當前渲染步的開始之間的時間。
所有渲染更新將等待直到渲染步驟中的代碼完成。確保任何由 BindToRenderStep() 呼叫的代碼快速且高效地運行;如果代碼花費太長時間,體驗視覺效果將會粗魯。
參數
綁定的優先級作為整數;它決定在渲染步驟期間呼叫自訂函數的時間。數字越低,呼叫自訂函數的時間就越早。如果兩個綁定具有相同的優先級,Roblox 引擎將隨機選擇其中一個先執行。
正在綁定的自訂函數。
返回
範例程式碼
This code sample moves a GuiObject in a circle within its parent object using RunService's BindToRenderStep. It defines a parametric equation in a function to help with positioning the GuiObject.
To try this code out, put a ScreenGui in the StarterGui. Inside the ScreenGui, insert a Frame with a LocalScript. Paste this code into the LocalScript, then play the game. Watch the Frame travel counterclockwise within.
local RunService = game:GetService("RunService")
-- How fast the frame ought to move
local SPEED = 2
local frame = script.Parent
frame.AnchorPoint = Vector2.new(0.5, 0.5)
-- A simple parametric equation of a circle
-- centered at (0.5, 0.5) with radius (0.5)
local function circle(t)
return 0.5 + math.cos(t) * 0.5, 0.5 + math.sin(t) * 0.5
end
-- Keep track of the current time
local currentTime = 0
local function onRenderStep(deltaTime)
-- Update the current time
currentTime = currentTime + deltaTime * SPEED
-- ...and the frame's position
local x, y = circle(currentTime)
frame.Position = UDim2.new(x, 0, y, 0)
end
-- This is just a visual effect, so use the "Last" priority
RunService:BindToRenderStep("FrameCircle", Enum.RenderPriority.Last.Value, onRenderStep)
--RunService.RenderStepped:Connect(onRenderStep) -- Also works, but not recommended
This example shows how to bind a simple function to the render step. All this function does is print how much time passed between the last render step and the current one. Note that this code will need to be in a LocalScript to run.
local RunService = game:GetService("RunService")
local function checkDelta(deltaTime)
print("Time since last render step:", deltaTime)
end
RunService:BindToRenderStep("Check delta", Enum.RenderPriority.First.Value, checkDelta)
This example uses the RunService to bind and unbind a function named printHello. First, we bind the function to the RenderStep so that fires every step. Then, after we wait 5 seconds (wait(5)), we unbind the function.
local RunService = game:GetService("RunService")
-- Step 1: Declare the function and a name
local NAME = "Print Hello"
local function printHello()
print("Hello")
end
-- Step 2: Bind the function
RunService:BindToRenderStep(NAME, Enum.RenderPriority.First.Value, printHello)
-- Step 3: Unbind the function
RunService:UnbindFromRenderStep(NAME)
IsClient
如果使用此方法的代碼在客戶端上運行(在 、在 由 要求、或在 設置為 ,則此方法將返回 。在所有其他情況下,此方法將返回 false 。
如果此方法返回 true,現有環境可以存取僅限於客戶端的功能,例如 RunService.PreRender 或 Players.LocalPlayer 。
返回
目前環境是否運行客戶端。
IsEdit
這個方法返回目前環境是否處於「編輯」模式,例如在 Studio 中,當體驗未運行時。
IsEdit() 將返回IsRunning()的反向,除非模擬已暫停,否則兩種方法都將返回false。
返回
目前環境是否處於「編輯」模式。
IsRunMode
這個方法返回是否按下了 執行 按鈕以在 Studio 中執行模擬。如果使用 true 暫停模擬,它將繼續返回 **** ;然而,一旦使用 停止按鈕 停止模擬,它將回到返回 false 的狀態。
請注意,Studio 只有在按下 執行 按鈕時才會進入「執行」模式,而不是按下 播放 按鈕。請注意,此方法會返回 如果模擬使用 而不是 執行 按鈕開始,則會返回 如果模擬使用 按鈕開始,則會返回 如果模擬使用 按鈕開始,則會返回 如果模擬使用 按鈕開始,則會返回 如果模擬使用 按鈕開始,則會返回 如果模擬使用 按鈕開始,則會返回 如果模擬使用 按鈕開始,則會返回 如果模擬使用 按鈕開始,則會返回 如果模擬使用 按鈕開始,則會返回 如果模擬使用 按鈕開始,則會返回 如果模擬使用 按鈕開始,則會返回 如果模擬使用 按鈕開始,則會返回 如果模擬使用 按鈕開始,則會返回 如果模擬使用 按鈕開始,則會返回 如果模擬使用 按鈕開始,則會返回 如果模擬使用 按鈕開始,則會返回 如果模擬使用 按鈕開始,則會返回 如果模擬使用 按鈕開始,則會返回 如果模擬使用 按鈕開始,則會返回 如果模擬使用按鈕開始按鈕開始,則會返回 如果模擬使用按鈕開始按鈕開始按鈕按鈕按鈕按鈕按鈕按鈕按鈕按鈕按鈕按鈕按鈕按鈕按鈕按鈕按鈕按鈕按鈕按鈕按鈕按鈕按鈕按鈕按鈕按鈕按鈕按鈕按鈕按鈕按鈕按鈕按鈕按按鈕按按按按按按鈕按按按按鈕按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按按
返回
無論 執行 按鈕是否已按下以在 Studio 中執行模擬。
IsRunning
返回體驗目前是否運行中,即模擬使用了 執行 或 播放 按鈕執行。
IsRunning() 將永遠返回IsEdit()的逆轉,除非模擬已暫停,否則兩種方法都將返回false。
返回
體驗目前是否運行中。
IsServer
此方法返回目前環境是否在伺服器上運行。如果使用此方法的代碼在伺服器上下執行(在 中設置為 或 或在 需要的伺服器上下執行),此方法將返回 。在所有其他情況下,此方法將返回 false 。
如果此功能返回真值,則當前環境可以存取僅限伺服器的功能,例如 ServerStorage 或 ServerScriptService 。
返回
目前環境是否在伺服器上運行。
Pause
此方法會暫停執行中的體驗模擬,停用物理和腳本,如果正在運行。模擬可以使用 Run() 或 Studio 的 執行 按鈕開始;當模擬暫停時,IsRunning() 將返回 false 。
返回
Stop
這個方法會停止執行中的體驗模擬,如果它正在運行。當模擬停止時,IsRunning()將返回false和IsEdit()將返回true。
與 Studio 中的 停止 按鈕不同,呼叫此方法不會將體驗恢復到模擬執行行前的狀態。這意味著物理模擬和腳本對體驗所做的任何變更將在模擬結束後保持。
返回
UnbindFromRenderStep
當傳送到 BindToRenderStep() 的函數名稱時,此方法將解除函數在 PreRender 期間被呼叫的綁定。這是用於在不再需要時解除綁定的函數,或當它們不再需要發射每一步時。
如果指定名稱沒有綁定函數,這個方法不會執行任何操作,並繼續無錯誤地進行。
參數
正在解除綁定的功能名稱。
返回
活動
Heartbeat
事件在物理模擬完成後,每一個框架都會發生。deltaTime 參數指示自上一個框架以來過去的時間。
這個事件是大多數腳本運行的時候。它發生在每個框架結束時,也是當任何等待腳本執行時,例如使用 task 圖形庫預定的腳本。Heartbeat 通常用於定期任務,例如更新核心遊戲系統,如生命重生。
在此步驟之後,引擎將屬性更新和事件傳送給服務器或客戶,這些更新和事件稍後會作為 複製步驟 的一部分收到。
參數
時間(秒),已過去自上一個框架。
PostSimulation
事件在物理模擬完成後,每一個框架都會發生。deltaTimeSim 參數指示當前框架已經步入物理模擬時間,不考慮物理限制。
這個事件對於做出模擬結果的最後調整有用。在此階段之後,引擎會觸發 Heartbeat 事件。
參數
當前框架已經步入物理模擬的時間(秒),不包括物理限制。
PreAnimation
事件在物理模擬之前,每一個框架發生,但渲染後。deltaTimeSim 參數指示當前框架已步入動畫的時間。
這個事件對於修改動畫對象,例如調整速度或優先級有用。一旦 PreAnimation 事件完成,引擎將繼續執行這些動畫,更新將在物理模擬期間用於更新對象的聯合變形。
動畫步過後,引擎會觸發 PreSimulation 事件。
參數
當前框架有步驟動畫的時間(秒)。
PreRender
PreRender(取代RenderStepped)在每個框架渲染之前發射,每個框架都會發生。deltaTimeRender 參數指示自上一個框架以來過去的時間。
這個事件讓您在代碼運行和更新世界之前在玩家的屏幕上繪製。這對於最後一刻的調整,例如變更對象位置、更新動畫或準備視覺效果來說有用,但應該盡量少使用,因為引擎不會在此事件中執行代碼直到完成執行為止。
因為 PreRender 是客戶端,只能在 LocalScript 、在 ModuleScript 由 LocalScript 要求,或在 Script 中設置 RunContext 為 Enum.RunContext.Client 。
在 PreRender 階段之後,模擬階段以 PreAnimation 事件開始。
參數
時間(秒),已過去自上一個框架。
PreSimulation
PreSimulation(取代Stepped)在物理模擬之前發射每一個框架。deltaTimeSim 參數指示當前框架將進行物理模擬的時間,不考慮物理限制。
這個事件對調整速度或力量等屬性很有用,在它們被用作模擬的一部分之前應用。模擬然後運行,可能多次,因為物理解決器的頻率比其他引擎系統高。一旦完成,PostSimulation將被發射。
參數
當前框架將進行物理模擬的時間(秒),不考慮物理限制。
Stepped
在物理模擬之前,發射每一個框架。
移轉記錄
此事件已被 PreSimulation 取代,該應用程式應用於新工作。
參數
RunService 已運行的時間(秒)。
時間(秒),已過去自上一個框架。