Unityエディターそのものを拡張して作業を効率化する

# はじめに
マーベラスで作業の効率を向上させるためにUnityそのものを拡張した例を3つの記事に分けて紹介します。
この記事自体では詳細な内容には踏み込まず、ざっくりどんなことができるのかを紹介するので、気になるものがあればそれぞれの記事をご覧ください。

[**第1回タイトルバー拡張編**](https://qiita.com/marv_nakazawaka/items/6899c0a8137a63042446)
[**第2回公式EditorWindow拡張編**](https://qiita.com/marv_nakazawaka/items/6e3008140dfdef4c01ab)
[**第3回ツールバー拡張編**](https://qiita.com/marv_nakazawaka/items/7d50320c70d9560bc5d9)

ここで紹介しているツールはUnity2021.3.9f1を使用しています。
（検証していませんが、おそらくUIElementsがエディターで導入された2019.x以降であれば動作すると思います。）

# 概要
UnityではEditorWindowを継承して独自のエディターウィンドウでツールを作ることができます。
ですがウィンドウを追加するのはUnityエディターのレイアウトが窮屈になったり、開くまでにメニューバーやコンテキストメニューを開いて大量の項目の中から探し出すのがちょっと億劫だったり、そもそもちゃんと周知しないと拡張の存在が認知されなかったりします。
![AddMenu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118525/74159bd1-a11d-7c15-dc2e-d0b8cd709d61.png)


そこでわざわざ独自のエディターウィンドウを作るほどの機能でもないし、メニューバーに追加してもいいけどもっとわかりやすく使いやすくしたいといった場合にツールバーやプロジェクトウィンドウのような公式のエディターのUIを拡張する方法について紹介します。
![AddToUnity.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118525/1d67134e-53bd-ab6a-cfb4-8578c7ede7c9.png)

# 拡張例の紹介
内容が長くなったため、それぞれの拡張例について別々の記事に分けました。
ここではそれぞれの記事で解説するツールについて簡単に紹介しますので、気になるものがあればタイトルをクリックすることでその記事へと遷移します。
それぞれは独立しているので、順番に読まなくても興味のあるものだけ読んでも大丈夫なようになっています。
## １．タイトルバーを拡張して、プロジェクトのパスやブランチ名を表示する。
Unityエディターのタイトルバーにそのプロジェクトが配置されているローカルのパスや、現在チェックアウトしているブランチの名前を表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118525/d27bc2ef-b170-8171-f5b0-272fc03a5f1c.png)
同じプロジェクトをローカルに複数リポジトリ用意していて、同時に開いているときにどれがどの作業用のUnityエディターなのかがわかりやすくなります。

### このような人・プロジェクトにおすすめ
**複数のリポジトリをローカルに用意して開発している人たち。**
フルタイムのメンバーでチーム開発をしているようなプロジェクトは大体当てはまるのではないかと思います。

個人制作の場合などでもあって邪魔になることはないと思いますが、役に立つ場面は限定的だと思います。

## ２．プロジェクトウィンドウでファイルの編集権限の取得や解放が出来るようにする
Unityのプロジェクトウィンドウで現在自分が編集権限を持っているファイルはファイル名の左に青い丸を、他人が編集権限を持っているファイルは左に黄色い丸を、右にその人の名前を表示しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118525/d2c53319-8bda-a292-6681-bcb55eaf0d82.png)
また権限の取得や解放を行いたいファイル選択した状態で、右下に出ているUIから「確保」や「解放」ボタンを押すことで権限の取得や解放することもできるようにしています。

### このような人・プロジェクトにおすすめ
**チームで開発しており、コンフリクトがあり得る場合。**
この記事で紹介する内容はChatworkを使っていますが、Slack等他のチャットツールのAPIに置き換えれば他のプロジェクトでも適用可能だと思います。会社の設定にもよりそうですが、GASを使って管理することもできるかもしれません。

また、紹介している実例にはありませんが、ここで紹介している拡張をヒエラルキーウィンドウなどに応用することで、発想次第では個人制作を含む様々なプロジェクトで効率化が図れる可能性があります。

## ３．ツールバーを拡張して独自のUIを配置できるようにする
Unityのツールバーに独自のUI（ボタンやチェックボックスなど）を追加することが出来る拡張です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118525/26ca1af1-bd5f-f1cf-b303-7a6b12f440b2.png)
この画像では左側にタスク管理用のUIを、右側には選んだシーンからPlayすることの出来る拡張を追加しています。

### このような人・プロジェクトにおすすめ
これについてはUnityを利用している全プロジェクトで活用できると思います。
ただしツールバーの領域が狭いと同時に表示できるUIが少なくなるため、強いて言うならMacBook Airなどでは追加するUIを厳選する必要がでるかもしれません。

# おまけ
## これらのツールの共通化について
マーベラスでは社内専用のリポジトリにこれらのツールをパッケージとしてまとめ、パッケージマネージャーから「Add package from git URL...」でパスを入れることで個別に導入が出来るようにしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118525/b5f9820d-df80-cc54-229b-5fcadada8f72.png)

他のプロジェクトでも導入できるようにするためにはpackage.jsonとAssembly Definitionファイルを用意し、PreferenceやProject Settingsに独自の項目を追加して、プロジェクトやメンバーごとの設定を行えるようにしておくとスムーズです。

## 参考
- [カスタムパッケージの作成](https://docs.unity3d.com/ja/2021.3/Manual/CustomPackages.html#EmbedMe)
パッケージを作る方法の解説が書かれています。
- [パッケージレイアウト](https://docs.unity3d.com/ja/2021.3/Manual/cus-layout.html)
パッケージを作る際のフォルダ構成の参考に役立ちます。
- [Unityで独自の設定のUIを提供できるSettingsProviderの紹介と設定ファイルの保存について](https://qiita.com/sune2/items/a88cdee6e9a86652137c)
PreferenceやProjectSettingsに独自の項目を追加する場合に参考になります。