9
5

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 3 years have passed since last update.

【unityプロ技】Advent Calendar 2019

Day 20

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

Last updated at Posted at 2019-12-19

はじめに

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

できること

プロジェクト内の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には色々あるんだなと思いました。🙏

9
5
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
9
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?