【Roblox】Promiseを活用して待つ処理をエラーハンドリングする
はじめに
こんにちは、まつさこ です。
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秒後に、そのブロックの色を赤に変える処理です。
このコードを次のように書き換えてみます。
local model = workspace.Model
model.PrimaryPart.Touched:Connect(function()
task.wait(5)
model.PrimaryPart.BrickColor = BrickColor.Red()
end)
task.wait(3)
model:Destroy()
- ゲーム開始
- ブロックが何かに振れた時の処理をイベントリスニング
- 3秒待機を開始
- 3のカウント中にブロックが地面に触れ、5秒のカウント開始
- 3秒のカウントが終わり、ブロックが破壊される
- 5秒のカウントが終わり、ブロックの色を変える処理が実行される
という順番に処理がされます。しかしこの時、⑥でブロックの色を変えようとしても、すでにブロックが破壊されているので、処理が実行できずエラーが発生します。
こちら、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()
動画を見ると、ブロックが破壊された時に、promiseがキャンセルされていることがわかります。そして以前は5秒経ったところでエラーが発生していたのが、今回はエラーが発生していません。
まとめ
今回は、RobloxでPromiseを活用して待つ処理をエラーハンドリングする方法について解説しました。
RobloxStudioの標準機能だけでは、非同期処理のエラーハンドリングが難しい場合がありますが、Promiseを利用することで簡潔に記述することができます。
読んでくださりありがとうございました🤗
Discussion