PaperSloth’s diary

主にゲーム開発関連についての記事を書きます。

UE5 ON_SCOPE_EXITの話

この記事はUnreal Engine (UE) - Qiita Advent Calendar 2025 - Qiitaシリーズ 4の20日目の記事となります。

環境

概要

ON_SCOPE_EXITはスコープを抜けるときに必ず実行したい処理をラムダで簡潔に書ける便利マクロです。

利用例としては以下のケースが考えられます。
・早期returnが多い関数での失敗時処理の一元化
・リソース解放や状態復元の漏れ防止
 ファイルクローズ、ロック解放、フラグ復元、一時的に変更した内部状態のロールバック
・成功時のみキャンセルする形でのガード的なケース

具体的な利用例

例としてActorからHTTP Requestを投げてCallbackを受け取った際の処理を考えます。
・途中で失敗する可能性が複数ある
・失敗時には必ずDelegateを呼びたい
・成功した場合のみDelegate呼び出しを抑制したい
という、早期returnが増えがちなケースです。
gist.github.com

ON_SCOPE_EXITを使用した場合

以下はON_SCOPE_EXITを使った実装例です。
関数冒頭で失敗時に呼びたい処理を登録しています。
処理が最後まで正常に進んだ場合のみ失敗時の処理をキャンセルする構造になっています。
gist.github.com
このように書くことで、エラー時の早期return箇所が複数あっても
必ずDelegateが呼ばれることが保証される構造になっています。

ON_SCOPE_EXITを使用しない場合

実際にはこんなコードを書くことはまずありえないですが
早期returnが正義という思想で無理やり書いたコードになります。
gist.github.com
このように処理に失敗して早期returnを行いたいが
その時に登録したDelegateも実行したいという場合にON_SCOPE_EXITを使うとスッキリ出来ます。

まとめ

ON_SCOPE_EXITはスコープ終了時に実行したい処理を書くためのマクロです。
・早期returnが多い関数で効果が発揮できる
・失敗時処理 / 後処理 / 状態復元を一元管理できる
・成功時のみキャンセルするガードとして使える点も便利

UEではHTTP、非同期処理、リソース管理、フラグ制御などなど
ON_SCOPE_EXITを使えばコードの質を改善できるケースがあります。
実際にエンジンコード内でも解放処理が漏れないように使用されているケース等があります。
エンジンコードを見てより具体的な使用イメージを掴んでいただければと思います。