🍳

【Roblox】Promiseを活用して待つ処理をエラーハンドリングする

2024/03/25に公開

はじめに

こんにちは、まつさこ です。

Robloxで非同期処理を行う際に、Promiseを活用することでコードをシンプルに記述できます。さらに、通常だと複雑になってしまう非同期処理のエラーハンドリングを、簡潔に記述することができます。

roblox-lua-promise の導入

Promiseを利用するためには、roblox-lua-promise というオープンソースのライブラリを導入します。

まず、下のリリースページから最新の Promise.lua をダウンロードしてください。

Roblox Studio で、 Replicated Storage 内に Promise モジュールを新規で作成します。

ダウンロードした Promise.lua をメモ帳等で開いて内容をコピーし、 Promise モジュールに貼り付けます。

これで Promise モジュールが利用できるようになりました。

Promiseを利用した非同期処理

wait() 関数を使って待機処理をする際、実行順などによって意図しない動作をしたりエラーが出てしまうことがあります。

例えば次のようなコードを考えてみましょう。

local model = workspace.Model

model.PrimaryPart.Touched:Connect(function()
	task.wait(5)
	model.PrimaryPart.BrickColor = BrickColor.Red()
end)

空中に配置したブロックが落ちて地面に触れてから5秒後に、そのブロックの色を赤に変える処理です。

https://youtu.be/1dDzROrFOaE

このコードを次のように書き換えてみます。

local model = workspace.Model

model.PrimaryPart.Touched:Connect(function()
	task.wait(5)
	model.PrimaryPart.BrickColor = BrickColor.Red()
end)

task.wait(3)
model:Destroy()
  1. ゲーム開始
  2. ブロックが何かに振れた時の処理をイベントリスニング
  3. 3秒待機を開始
  4. 3のカウント中にブロックが地面に触れ、5秒のカウント開始
  5. 3秒のカウントが終わり、ブロックが破壊される
  6. 5秒のカウントが終わり、ブロックの色を変える処理が実行される

という順番に処理がされます。しかしこの時、⑥でブロックの色を変えようとしても、すでにブロックが破壊されているので、処理が実行できずエラーが発生します。

https://youtu.be/Yu3yjyVwKaA

こちら、Promiseを利用することで以下のように記述することができます。
ブロックが破壊された時に、promiseをキャンセルすることで、エラーを回避できます。

local Promise = require(game:GetService("ReplicatedStorage").Promise)
local model = workspace.Model

model.PrimaryPart.Touched:Connect(function()
	local promise = Promise.delay(5):andThen(function()
		model.PrimaryPart.BrickColor = BrickColor.Red()
	end)
	
	model.PrimaryPart.Destroying:Connect(function()
		promise:cancel()
		print("promise has canceled")
	end)
	
end)

task.wait(3)
model:Destroy()

https://youtu.be/fHsyDxHf0Qo

動画を見ると、ブロックが破壊された時に、promiseがキャンセルされていることがわかります。そして以前は5秒経ったところでエラーが発生していたのが、今回はエラーが発生していません。

まとめ

今回は、RobloxでPromiseを活用して待つ処理をエラーハンドリングする方法について解説しました。
RobloxStudioの標準機能だけでは、非同期処理のエラーハンドリングが難しい場合がありますが、Promiseを利用することで簡潔に記述することができます。

読んでくださりありがとうございました🤗

moze テックブログ

Discussion