はじめに
Unityのプロジェクトで使用されているAssembly Definitionの依存元/依存先を可視化するEditor拡張を開発しました。
開発するまでの経緯などを記事にまとめさせてもらいました。
Assembly Definition
Unityの機能にディレクトリ単位でアセンブリを分割できるAssembly Definitionがあります。
使い方や利点などの解説はこちらの記事が詳しいです。
関心の分離やビルド時間の短縮に効果があり、開発効率を上げるために使いこなしたい機能の1つです。
数が増えがち
こちらの記事ではClean Architectureの原則に基づいてAssembly Definitionを設定する試みを行いました。
この時、 11個の .asmdef ファイルが作られることになりました。
1プロジェクトに数個くらいであれば特にAssembly Definitionの関係性を気にする事なく使えると思いますが、真面目に .asmdef を切っていくと数が増えて管理が大変になり、意図しない参照の定義が入ってしまい最悪破綻する可能性も出てきます。(聞く話によると、3桁の .asmdef が存在する規模のプロジェクトもあるらいしいです)
Assembly Definitionの依存関係を可視化できることができると、管理の助けになると思い上記のEditor拡張を開発しました。
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がある -
GraphViewにNodeが属する(AddElement()する) -
NodeにはinとoutのPortがある -
PortはEdgeで繋がる
という関係性になっています。
Edge は contentContainer.Add() してやらないと表示されないということを知るまで結構かかりました。。
やりたいこと
とりあえず見るだけなら今の機能でもできますが、特定の .asmdef の関係性にフォーカスする機能は欲しいかなと思っています。ノードを選んでそれに関係するノードとエッジをハイライトする(もしくは無関係なノードを見えなくする)イメージです。
やらないこと
.asmdef のパスがわかるので、Jsonファイルとして処理すれば編集できなくもないですが、プロジェクトをぶっ壊しそうなのでやるつもりはありません。😅
CompilationPipeline のAPIも get しか公開されていませんでした。
おわりに
Assembly Definition手軽で強力な機能なので、ぜひ試してみてください。
あとAPIとかEditor拡張用のクラスとか知らなかった便利な機能がUnityには色々あるんだなと思いました。🙏
