Help us understand the problem. What is going on with this article?

Assembly Definitionの関係性を可視化するEditor拡張

はじめに

Unityのプロジェクトで使用されているAssembly Definitionの依存元/依存先を可視化するEditor拡張を開発しました。

image.png

開発するまでの経緯などを記事にまとめさせてもらいました。

Assembly Definition

Unityの機能にディレクトリ単位でアセンブリを分割できるAssembly Definitionがあります。
使い方や利点などの解説はこちらの記事が詳しいです。

関心の分離やビルド時間の短縮に効果があり、開発効率を上げるために使いこなしたい機能の1つです。

数が増えがち

こちらの記事ではClean Architectureの原則に基づいてAssembly Definitionを設定する試みを行いました。
この時、 11個の .asmdef ファイルが作られることになりました。

1プロジェクトに数個くらいであれば特にAssembly Definitionの関係性を気にする事なく使えると思いますが、真面目に .asmdef を切っていくと数が増えて管理が大変になり、意図しない参照の定義が入ってしまい最悪破綻する可能性も出てきます。(聞く話によると、3桁の .asmdef が存在する規模のプロジェクトもあるらいしいです)

Assembly Definitionの依存関係を可視化できることができると、管理の助けになると思い上記のEditor拡張を開発しました。

AsmdefGraph

https://github.com/naninunenoy/AsmdefGraph

できること

プロジェクト内のAssembly Definitionの関係を取得し、 GraphView のノードエディタベースで表示します。
あくまで表示するだけで、 .asmdef の編集/追加/削除には対応していません。

また、全てのノードを同じ初期位置に生成するため、見やすいように人間が移動させたり、デフォルトで入ってるプロジェクトに関係ないノードを削除するなどして、自力で見やすくしてもらう必要があります。 😅

やったこと

CompilationPipeline

最初はプロジェクトのルートディレクトリから GetFiles("*.asmdef", SearchOption.AllDirectories) みたいに取得して、Jsonを読み込んでましたが、専用のAPIがあることを知り、そっちに切り替えました。

CompilationPipeline.GetAssemblies() でプロジェクトに関係する .asmdef の情報を Assembly クラスの一覧として取得できます。その中に、assemblyReferences のフィールドがあるので、参照している .asmdef のフルパスが取得できます。
これによって .asmdef の関係を網羅したマップを作成できます。

GraphView

作成したマップをもとに可視化する訳ですが、UnityEditor.Experimental.GraphView を用いました。

こちらの記事のおかげで完成させることができました。🙏

  • EditorWindow の中に GraphView がある
  • GraphViewNode が属する(AddElement()する)
  • Node にはinとoutの Port がある
  • PortEdge で繋がる

という関係性になっています。
EdgecontentContainer.Add() してやらないと表示されないということを知るまで結構かかりました。。

やりたいこと

とりあえず見るだけなら今の機能でもできますが、特定の .asmdef の関係性にフォーカスする機能は欲しいかなと思っています。ノードを選んでそれに関係するノードとエッジをハイライトする(もしくは無関係なノードを見えなくする)イメージです。

やらないこと

.asmdef のパスがわかるので、Jsonファイルとして処理すれば編集できなくもないですが、プロジェクトをぶっ壊しそうなのでやるつもりはありません。😅
CompilationPipeline のAPIも get しか公開されていませんでした。

おわりに

Assembly Definition手軽で強力な機能なので、ぜひ試してみてください。
あとAPIとかEditor拡張用のクラスとか知らなかった便利な機能がUnityには色々あるんだなと思いました。🙏

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした