2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

横国ゲーム制作部Advent Calendar 2022

Day 20

MessagePipeのハンドリング漏れを防止するAnalyzerの導入 [Unity]

Posted at

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以下の任意のディレクトリに配置します。

スクリーンショット 2022-12-20 235157.png

配置時点では例外が発生しますが問題ありません。
次にdllの設定をインスペクタ上で次のように変更します。

  • Select platforms for pluginsのチェックをすべて外す
  • Asset LabelsRoslynAnalyzerというタグを追加する

スクリーンショット 2022-12-20 235519.png

これで、ハンドリングが漏れている場合にエラーが発生するようになりました。

スクリーンショット 2022-12-20 235841.png

参考

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?