🏃‍♂️

【Roblox】 RunServiceについて

2024/05/27に公開

はじめに

今回はRobloxのRunServiceについて紹介します。

Robloxバージョン:0.625.0.6250509

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


1. RunServiceとは

RunServiceとは、HeartbeatやRenderSteppedなどイベントにConnectすることで毎フレーム呼ばれる処理を作成できるサービスです。
また、コードがどのようなコンテキストで実行されているかを判断するフラグなどもRunServiceにはあります。
非常に便利なのでよく使う機能の1つです。


2. ループ処理

RunServiceにはいくつかイベントが用意されており、Connectをすることでメソッドを毎フレーム呼ぶことができます。

下記はHeartbeatイベントを使用する例です。
引数stepは前のフレームからの経過時間が渡されます。

local RunService = game:GetService("RunService")

RunService.Heartbeart:Connect(function(step)
    -- 処理    
end)

下記はよく使用するイベントの実行タイミングの違いです。

  • RenderStepped:フレームがレンダリングされる前に呼ばれる。完了しない場合はレンダリング以降の処理が遅延するので注意。
  • Stepped:物理シミュレーションが行われる前に呼ばれる
  • Heartbeart:物理シミュレーションが完了した後に呼ばれる

またRenderSteppedに限って、クライアント側でのみ起動するので注意が必要です。

それぞれ、イベントに登録した順にメソッドが呼ばれるという保証はないです。
実行順を指定したい場合は「RunService:BindToRenderStep」を使用できます。
主にカメラの制御を行う際に使われます。


Connectは戻り値でRBXScriptConnectionを返します。
これを変数として持つことで任意のタイミングで削除できます。

下記はhpが0以下になるとHeartBeatが停止するコードです。
コード

local RunService = game:GetService("RunService")
local hp = 100
local heartBeat

heartBeat = RunService.Heartbeat:Connect(function(step)
	if hp < 0 then
		heartBeat:Disconnect()
	end
end)

また不要になった際にDisconnectする処理はメモリリーク予防にもつながるので
しっかりと覚えておくべきです。


3. コードの実行環境を取得する

フレーム毎の処理の他に、コードがどのコンテキストで実行されているかを確認することもできます。

Roblox Studioで起動時のみ処理をしたい場合のコード

if RunService:IsStudio() then
	-- Roblox Studio限定での処理
end

ゲーム中で使用する可能性があるのは下記だと思います。

  • IsClient:コードの実行環境がクライアント側かどうか
  • IsServer:コードの実行環境がサーバー側かどうか
  • IsStudio:コードの実行環境RobloxStudioかどうか

そのほかにも編集中かどうかやゲームが実行中かなどのフラグも存在します。
プラグインの作成やコマンドバーに入力するコマンドなどで使用できます。


4.まとめ

以上RunServiceについてでした。

  • ループの処理がいくつか用意されており、実行タイミングで選べる
  • コードの実行環境を返すフラグが用意されており、デバッグ用の機能などの追加に役立つ

RunServiceが輝くタイミングはたくさんあると思うので、ぜひ試してみてください!

ランド・ホー Roblox開発チーム

Discussion