🐕

【Roblox開発】RunServiceを使ってみた

2024/08/12に公開

はじめに

今回はRunServiceで使えそうなものを個人的に選別して共有します。

公式Reference

https://create.roblox.com/docs/reference/engine/classes/RunService

実装

毎フレーム実行される系

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で実行されているか、クライアント側かサーバー側かなどを判別し、実行環境に応じた処理を分岐させることができます。

Landelテックブログ

Discussion