RunService包含時間管理及管理體驗或腳本執行上下文的方法和事件。像是IsClient()、IsServer()、和IsStudio()這些方法可以幫助你確定程式碼正在何種上下文中執行。這些方法對於需要由客戶端和伺服器腳本都能使用的 ModuleScripts 非常有用。此外,IsStudio()可以用來為預覽測試添加特殊行為。
RunService還包含事件,允許你的程式碼遵循Roblox的逐幀循環,例如PreRender、PreAnimation、PreSimulation、PostSimulation和Heartbeat。選擇正確的事件以用於任何情況是很重要的,因此你應該閱讀任務計畫器來做出明智的決定。
上下文測試結果
環境 | IsStudio | IsClient | IsServer | IsEdit | IsRunning | IsRunMode |
---|---|---|---|---|---|---|
實況玩家 | false | true | false | |||
實況伺服器 | false | false | true | |||
編輯模式 | true | true | true | true | false | false |
共同編輯 | true | true | false | true | false | false |
執行模式 | true | true | true | false | true | true |
播放模式(客戶端) | true | true | false | false | true | false |
播放模式(伺服器) | true | false | true | false | true | true |
團隊測試(玩家) | true | true | false | false | true | false |
團隊測試(伺服器) | false | false | true | false | true | false |
概要
方法
給定一個函數的字串名稱和一個優先權,這個方法將函數綁定到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)
自定義函數與增量時間
最後一個參數(function)是要調用的自定義函數。此函數將傳遞一個名為deltaTime的參數,顯示從上一渲染步驟的開始到當前渲染步驟的開始之間經過了多少時間。
所有渲染更新將等到渲染步驟中的程式碼執行完畢。確保任何被BindToRenderStep()調用的程式碼都能快速且高效地運行;如果程式碼運行時間過長,體驗的視覺效果將會顯得遲緩。
參數
綁定的優先權作為整數;決定在渲染步驟中何時調用自定義函數。這個數字越低,自定義函數被調叫的越早。如果兩個綁定有相同的優先權,Roblox 引擎將隨機選擇一個先運行。
被綁定的自定義函數。
返回
範例程式碼
此代碼範例在其父物件內將 GuiObject 以圓形移動,使用
RunService 的 BindToRenderStep。它在一個函數中定義了參數方程式,
以協助定位 GuiObject。
要嘗試此代碼,請將 ScreenGui 放入 StarterGui。在 ScreenGui 內,
插入一個帶有 LocalScript 的 Frame。將此代碼粘貼到 LocalScript 中,然後
播放遊戲。看著框架在反時針方向移動。
local RunService = game:GetService("RunService")
-- 框架應該移動的速度
local SPEED = 2
local frame = script.Parent
frame.AnchorPoint = Vector2.new(0.5, 0.5)
-- 簡單的圓形參數方程式
-- 以 (0.5, 0.5) 為中心,半徑為 (0.5)
local function circle(t)
return 0.5 + math.cos(t) * 0.5, 0.5 + math.sin(t) * 0.5
end
-- 紀錄當前時間
local currentTime = 0
local function onRenderStep(deltaTime)
-- 更新當前時間
currentTime = currentTime + deltaTime * SPEED
-- ...以及框架的位置
local x, y = circle(currentTime)
frame.Position = UDim2.new(x, 0, y, 0)
end
-- 這只是視覺效果,因此使用 "Last" 優先級
RunService:BindToRenderStep("FrameCircle", Enum.RenderPriority.Last.Value, onRenderStep)
--RunService.RenderStepped:Connect(onRenderStep) -- 也可以使用,但不建議
這個範例展示如何將一個簡單的函式綁定到渲染步驟上。這個函式的作用是打印出上次渲染步驟與目前渲染步驟之間的時間。請注意,這段程式碼需要在 LocalScript 中執行。
local RunService = game:GetService("RunService")
local function checkDelta(deltaTime)
print("自上次渲染步驟以來的時間:", deltaTime)
end
RunService:BindToRenderStep("檢查時間距離", Enum.RenderPriority.First.Value, checkDelta)
此範例使用 RunService 來綁定和解除綁定一個名為 printHello 的函數。首先,我們將該函數綁定到 RenderStep,以便在每個 步驟 中觸發。然後,在我們等待 5 秒(wait(5))後,我們解除綁定該函數。
local RunService = game:GetService("RunService")
-- 第 1 步:聲明函數和名稱
local NAME = "打印你好"
local function printHello()
print("你好")
end
-- 第 2 步:綁定函數
RunService:BindToRenderStep(NAME, Enum.RenderPriority.First.Value, printHello)
-- 第 3 步:解除綁定函數
RunService:UnbindFromRenderStep(NAME)
IsClient
如果調用此方法的程式碼在客戶端上下文中運行(在LocalScript中,在被LocalScript要求的ModuleScript中,或在Script中且RunContext設為Enum.RunContext.Client),則此方法將返回true。在所有其他情況下,此方法將返回false。
如果此方法返回true,則當前環境可以訪問僅限客戶端的功能,例如RunService.PreRender或Players.LocalPlayer。
返回
當前環境是否在運行客戶端。
IsEdit
此方法返回當前環境是否在編輯模式下,例如在Studio中當體驗未運行時。
IsEdit()將返回IsRunning()的反值,除非模擬已暫停,否則兩個方法都將返回false。
返回
當前環境是否在編輯模式下。
IsRunMode
此方法返回運行按鈕是否被按下以運行Studio中的模擬。如果模擬已使用暫停按鈕暫停,則將繼續返回true;然而,一旦模擬被停止按鈕停止,它將恢復返回false。
請注意,Studio僅在按下運行按鈕時才進入"運行"模式,而不是按下播放按鈕。此外,如果模擬是使用RunService:Run()啟動而不是運行按鈕,則此方法將返回false。
返回
是否已按下運行按鈕以在Studio中運行模擬。
IsRunning
返回體驗目前是否在運行,這意味著模擬已使用運行或播放按鈕運行。
IsRunning()總是將返回IsEdit()的反值,除非模擬已暫停,否則兩個方法都將返回false。
返回
當前體驗是否正在運行。
IsServer
此方法返回當前環境是否在伺服器上運行。如果調用此方法的程式碼在伺服器上下文中運行(在Script中且RunContext設為Enum.RunContext.Server或Enum.RunContext.Legacy,或在ModuleScript中且被Script要求),則此方法將返回true。在所有其他情況下,將返回false。
如果此函數返回true,則當前環境可以訪問僅限伺服器的功能,如ServerStorage或ServerScriptService。
返回
當前環境是否在伺服器運行。
Stop
此方法如果模擬正在運行,則停止體驗的模擬。當模擬被停止時,IsRunning()將返回false,而IsEdit()將返回true。
與Studio中的停止按鈕相比,調用此方法不會將體驗恢復到模擬運行之前的狀態。這意味著物理模擬和腳本對體驗所做的任何更改都將在模擬結束後持續存在。
返回
UnbindFromRenderStep
給定傳送到BindToRenderStep()的函數名稱,此方法將解除函數在PreRender期間被調用的綁定。這用於解除那些不再需要的綁定函數,或在每一步不再需要觸發時使用。
如果沒有以指定名稱綁定函數,則此方法不會采取任何行動並繼續執行,而不會引發錯誤。
參數
要解除綁定的函數名稱。
返回
活動
Heartbeat
Heartbeat事件每幀觸發,在物理模擬完成後。deltaTime參數表示自上一幀以來已經過去的時間。
此事件是大多數腳本運行的時候。它在每幀的結尾發生,並且也是所有等待的腳本被執行的時候,例如那些通過task庫排定的腳本。Heartbeat通常用於定期任務,例如更新核心遊戲系統如生命值恢復。
在這個步驟之後,引擎將更新屬性並將事件發送到伺服器或客戶端,這些事件稍後作為複製接收步驟的一部分被接收。
參數
自上一幀以來已經過去的時間(以秒為單位)。
PostSimulation
PostSimulation事件每幀觸發,在物理模擬完成後。deltaTimeSim參數顯示當前幀走動物理模擬的時間,不考慮物理限制。
此事件對於對模擬的結果進行最後調整非常有用。在這個階段之後,引擎將觸發Heartbeat事件。
參數
當前幀走動物理模擬的時間(以秒為單位),不考慮物理限制。
PreAnimation
PreAnimation事件每幀觸發,在物理模擬之前但在渲染之後。deltaTimeSim參數表示當前幀走動動畫的時間。
此事件對於修改動畫物件非常有用,例如調整它們的速度或優先權。一旦PreAnimation事件完成,引擎將開始執行這些動畫,更新將在物理模擬期間使用的關節變換。
在動畫走動之後,引擎將觸發PreSimulation事件。
參數
當前幀走動動畫的時間(以秒為單位)。
PreRender
PreRender事件(取代RenderStepped)每幀觸發,在幀渲染之前。deltaTimeRender參數表示自上一幀以來已經過去的時間。
此事件允許你在畫面繪製之前運行程式碼和更新世界。這對於最後的調整非常有用,比如更改物件位置、更新動畫或準備視覺效果,但應該儘量少用,因為引擎在這個事件中的程式碼執行完成之前無法開始渲染幀。
由於PreRender是客戶端的,只能在LocalScript中、在被LocalScript需要的ModuleScript中,或者是在Script中且RunContext設為Enum.RunContext.Client。
PreRender階段之後,模擬階段將開始,觸發PreAnimation事件。
參數
自上一幀以來已經過去的時間(以秒為單位)。
PreSimulation
PreSimulation事件(取代Stepped)每幀觸發,在物理模擬之前。deltaTimeSim參數表示當前幀將要走動物理模擬的時間,不考慮物理限制。
此事件對於在應用屬性,如速度或力之前的最後調整非常有用。然後,模擬將運行,可能多次運行,因為物理解算器的運行頻率高於其他引擎系統。一旦完成,將觸發PostSimulation事件。
參數
當前幀將要走動物理模擬的時間(以秒為單位),不考慮物理限制。
Stepped
每幀觸發,在物理模擬之前。
遷移說明
此事件已被PreSimulation取代,應該用於新工作。
參數
RunService運行的持續時間(以秒為單位)。
自上一幀以來已經過去的時間(以秒為單位)。