はじめに
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には色々あるんだなと思いました。🙏