はじめに
Unityでコードをたくさん書いていくと、徐々にスクリプト間の関連性がわからなくなっていったりするものです。最近だとAssembly Definition File(asmdef)を入れるために、依存関係を断ち切る必要がでてきたりしますが、そのような場合に、クラスの関係を一目で見られるように可視化すると、作業がはかどります。
これを実現する Type Dependency Diagram
の便利な使い方についてご紹介します。
Type Dependency Diagramとは
クラスやインタフェース、enum等の型同士の関連性を可視化するのに便利なツールです。ReSharperの中に入っている1つの機能で、Visual Studio内で利用できます。C#向けです。
- ReSharperについて
- この記事で扱うType Dependency Diagramを表示するために必要です。
- Visual Studioに、様々な解析やリファクタの機能を追加することができるツールです。
- ReSharperは初回インストール時に限り30日間「評価」することもできます。
- Rider等JetBrainsのツールをお使いの場合、dotUltimateパックに入っているので、セットにするとお得に購入できます。
準備
- お使いのVisual StudioにReSharperをインストールしましょう。ここでは省略します。
- Visual Studioのバージョンは 2017/2019/2022 あたりなら良いはずです。
- Unityのスクリプト編集ツールとしてRiderなどを設定されている方は
Preferences
->External Tools
の項目から、External Script Editor
をVisual Studio ****
に設定しましょう。
最初の一歩
Unityでなにかプロジェクトを開いて、クラスを選んで Type Dependency Diagram
で見てみましょう。
ここでは、 Meta社の公開しているサンプルプロジェクト https://github.com/oculus-samples/Unity-TheWorldBeyond を例にします。
Scripts/VirtualPets.cs
のところで右クリックして、メニューから Show Type Dependency Diagram
を選択します。
そうすると、こちらのようなウィンドウが表示されると思います。
さて、VirtualPetクラスが、enum PetStateに依存していることがわかります。
ちなみに、PetStateクラス内に enum PetState が存在していますので、当然といえば当然です。
ここでは、関連している型をみていきたいので、VirtualPetの右クリックメニューから Add All Referenced Types
を実行しましょう。
そうすると、VirtualPetから参照されているクラスが追加され、このようになります!
便利でしょうか?いや、細かすぎて何がなにやらですね。
これから、これを見やすくしていきます。
左上にあるツールバーの右端でグルーピングを変更できます。 Group by Namespace
を選びましょう。
今度は突然すごいシンプルになりました。真ん中に {} とありますが、これはルートネームスペースを表しています。すべての親ということですね。
焦らずに左上の三角形を押しましょう。そうすると中身がでてきます。
中身が展開されました。
注目したいのは赤で囲ってあるところです。左の四角はSystem、下の四角はUnityEngineとあります。
SystemやUnityEngineネームスペースのクラスは、要するにStringやMonoBehaviourのようなものですが、一般的にはこれらは解析対象ではない、空気のような存在ですから、この図からは除外するのが妥当というものです。
それぞれ、選択した後キーボードの Delete
キーを押すと削除できます。
だいぶすっきりしてきました。これで十分の場合はここで止めても良いでしょう。
また、些末なクラスはここで選択して削除しても良いでしょう。
しかし、ここでもう一段、ツールバー右端のGroupingから Group by Project Structure
を選択しましょう。これはフォルダベースでグルーピングすることができます。
Oculus.VR
フォルダに属するクラスがあることがわかります。これらが解析に重要であれば残しても良いですが、ライブラリ側コードですから今回は除外しましょう。
Oculus.VR
の四角を選択して Delete
キーを押すか、または x
ボタンで除外することができます。
これで、だいぶ余分な型は消せたのではないかと思います。あとは見やすくしてみましょう。
真ん中の四角の ...\Scripts
のところが閉じているので、三角形を押して展開しましょう。
それなりに依存関係が見えてきた感じがしますね。たとえば、VirtualPet
クラスは、フォルダ外部の MultiToy
クラスや SpaceshipTrigger
クラスに依存していることが判明しました。
また、VirtualPet と MultiToy は、両方向の矢印がありますので、相互依存になっています。このままでは ScriptsフォルダやMultiToyをasmdef化できないかも、といったことがわかるでしょう。
※Unityでasmdef化すると、独立アセンブリ(DLL)となるため、片方向依存であることが必須要件となります。
また、見やすくする方法はいくつかあります。
何度か触っているツールバーのグルーピングのアイコンから Do Not Group
を選択すれば、すこしすっきりとするでしょう。
ちょっと矢印が混雑していていけてないな、と思った場合、左側のアイコンでレイアウトを変えることができます。
上側の Organic Layouter
の場合はこちらのようになります。
下側の Business Logic Layouter
の場合はこちらのようになります。
個々の要素を自分で並べかえることもできるので、見やすいレイアウトを探ってみましょう。
勘違いしてはいけない点としては、グラフ内に追加された要素すべてを可視化したとはいえない点です。ここまでの流れはあくまで VirtualPet
クラスが直接依存しているクラスについて可視化したものです。VirtualPets以外については、完全に可視化されたとは言い難い状況です。さらにほかのクラスについて着目したい場合は、そのクラスのメニューから Add All Refernced Types
を実行し、再度クリーンアップの手順を踏むと良いでしょう。
そのほかできること
-
特定のクラスを利用しているクラス・型をすべて図に追加する。
上記の手順では、あくまでクラスが参照している型を追加しましたが、逆に参照されているほうUsages
を追加することもできます。
クラスの上にカーソルをしばらくホバーするとでてくる画面から、Add All Usages to the Diagram
を選択しましょう。追加されました。
-
任意の型をソリューションエクスプローラーで選択して、Type Dependency Diagram にドラッグ&ドロップで追加することができます。
追加されました。
注意点
- コードの規模によっては、解析やレイアウト変更にかなりの時間がかかります。この場合でも、上で説明したテクニックで不要なファイルを削除するのがおすすめです。
おしまい
コードをリファクタするとき、asmdef化するときや、コードの全体像を明らかにしたいときなどに利用してみると良いと思います!
参照
公式の解説です
https://pleiades.io/help/resharper/Exploring_Type_Dependency_Graph.html
宣伝
Psychic VR Lab では、Unityエンジニアを募集しています!