MessagePipe
はとても便利なライブラリですが、Subscribeした際の戻り値であるIDispose
は購読終了時に必ずDisposeする必要があります。
SampleMonoBehaviour.cs
using System;
using MessagePipe;
using UnityEngine;
using VContainer;
public class SampleMonoBehaviour : MonoBehaviour
{
[Inject] private ISubscriber<SampleEvent> sampleEventSubscriber;
private IDisposable disposable;
private void Start()
{
// 戻り値のIDisposableがDisposeされておらず、リークしている
sampleEventSubscriber.Subscribe(x => Debug.Log(x.Name));
// このようにハンドリングすることでリークを防ぐことができる
disposable = sampleEventSubscriber.Subscribe(x => Debug.Log(x.Name));
}
private void OnDestroy()
{
// 破棄時にDisposeを行う
disposable?.Dispose();
}
}
しかし、リークしているかどうかを目視()で確認するのは、漏れが発生する危険もありできれば避けたいところです。
幸い、Cysharp
から公開されているMessagePipe.Analyzer
というRoslyn Analyzerを活用すればハンドリング漏れをコンパイルエラーとして表示することができ、リークを100%防ぐことができます。
今回はこのMessagePipe.Analyzer
の導入方法を紹介します。
導入
まず、MessagePipe
のリポジトリのReleaseから、MessagePipe.Analyzer.dll
をダウンロードしてきます。
ダウンロードしてきたdllを、Assets
以下の任意のディレクトリに配置します。
配置時点では例外が発生しますが問題ありません。
次にdllの設定をインスペクタ上で次のように変更します。
- Select platforms for pluginsのチェックをすべて外す
-
Asset Labelsに
RoslynAnalyzer
というタグを追加する
これで、ハンドリングが漏れている場合にエラーが発生するようになりました。
参考