🐕
【Roblox開発】RunServiceを使ってみた
はじめに
今回はRunService
で使えそうなものを個人的に選別して共有します。
公式Reference
実装
毎フレーム実行される系
Stepped
local RunService = game:GetService("RunService")
local count = 0
local function onStep(_currentTime, deltaTime)
count += 1
print(count)
end
RunService.Stepped:Connect(onStep)
これは物理シミュレーションの前に毎フレーム発生するイベントになります。
BindToRenderStep
Stepped
以外にもBindToRenderStep
があり以下の画像のRender
パイプラインのどのタイミングで実行させるか指定して毎フレーム実行させることができるようです。
local RunService = game:GetService("RunService")
local count = 0
local function functionToBind()
count += 1
print(count)
end
RunService:BindToRenderStep("tempBinding", Enum.RenderPriority.Last , functionToBind)
どんな環境で実行しているか
if RunService:IsStudio() then
print("I am in Roblox Studio")
else
print("I am in an online Roblox Server")
end
if RunService:IsRunMode() then
print("Running in Studio")
end
if RunService:IsClient() then
print("I am a client")
else
print("I am not a client")
end
if RunService:IsServer() then
print("I am a server")
else
print("I am not a server")
end
if RunService:IsRunning() then
print("The game is running")
else
print("The game is stopped or paused")
end
- RunService:IsStudio(): スクリプトが Roblox Studio 内で実行されているかどうかを判定する。
- RunService:IsRunMode(): スクリプトが Roblox Studio 内で実行モードになっているかどうかを判定する。
- RunService:IsClient(): スクリプトがクライアント側で実行されているかどうかを判定する。
- RunService:IsServer(): スクリプトがサーバー側で実行されているかどうかを判定する。
- RunService:IsRunning(): ゲームが実行中かどうかを判定する。
まとめ
UnityのMonoBehaviorのもつUpdateのような使いかたができそうですね。
RunServiceのSteppedイベントやBindToRenderStep関数を使うことで、UnityのUpdate関数のように、毎フレーム処理を実行することができます。特にSteppedイベントは、物理シミュレーションの前など、特定のタイミングで処理を実行したい場合に便利です。
ただし、BindToRenderStepは、レンダリングパイプラインに深く関わるため、パフォーマンスへの影響や、将来の変更による互換性の問題が生じる可能性があります。そのため、頻繁に呼ばれる処理や、レンダリングに密接に関連する処理には、Steppedイベントの使用を検討することを推奨してるようです。
また、RunServiceの他のプロパティを利用することで、スクリプトがStudioで実行されているか、クライアント側かサーバー側かなどを判別し、実行環境に応じた処理を分岐させることができます。
Discussion