UnityからSVNを操作するエディタ拡張を作ってみた

**※最新版(git/Mercurial・プリファレンス対応)は、[こちらから取得](https://github.com/DandyMania/uVCSBridge)をお願いします。**

# はじめに
Unityで開発する際必須と言っても過言でないバージョン管理ソフトですが、残念ながらUnity本体にはSVNが操作できるような連動機能は用意されていないため

- アセットやmetaファイルの追加やコミット忘れでプロジェクトが動かせずチーム員に平謝り
- エクスプローラとUnityの行き来をしてたらわけが分からなくなって気づいたら作業ファイルの消失
- ついUnity上でリネーム or 移動してそのままコミットしてしまい大事なコミットログ消失

などイライラが有頂天に！！！１！！１！

[Unityとsvnを連動させるアセット](https://www.assetstore.unity3d.com/jp/#!/search/page=1/sortby=relevance/query=SVN)はいくつかあるけどほとんどものが有料だし、とりあえずエディタ拡張が楽しくて我慢できなかったので作ってしまいました(´∀｀)
***※ファイル移動の問題に関してはスマートな解決方法模索中。。。***


# ダウンロード
https://github.com/DandyMania/uVCSBridge

- TortoiseSVNインストール後、 uVCSBridge.cs を、Assets/Editorフォルダ以下に追加すれは動きます。(簡単！)

***TortoiseSVNのインストール時にcommand line client tools(コンソール版)を選択しておいてください。***

# とりあえずこんな感じの仕様

- Unityのアセットメニューにコマンドを追加し、右クリック&メニュー選択時にTortoiseProc.exe(TortoiseSVNのコマンドライン実装)を叩いてます。

　　※ **[最新版](https://github.com/DandyMania/uVCSBridge)では、Git/Mercurial・プリファレンスで設定変更にも対応しました。 2016/1/23追記**

- ついでに**プロジェクトウィンドウのアイコンオーバレイ**も対応しました。(今のところオーバーレイの更新タイミングは、起動時・フォルダ選択時）
 - ***svn.exe(コンソール版 TortoiseSVNについてるやつでOK) にパスが通ってる必要有り。***
![svn00.jpg](https://qiita-image-store.s3.amazonaws.com/0/31791/2ca53d4f-e9b5-1235-494e-9854e6032618.jpeg)

![svn02.jpg](https://qiita-image-store.s3.amazonaws.com/0/31791/e2b4c8af-c90c-4604-06a5-ccfd5b6f00e8.jpeg)

- TortoiseSVN/Subversion(コンソール)にパスが通ってる環境であれば勝手に連動***(なのでパスが通ってればMacとかでも動作可能)***
![svn01.jpg](https://qiita-image-store.s3.amazonaws.com/0/31791/54d3da7b-4ed8-1483-ea06-95f8eff4f172.jpeg)



# ざっくりと使ってるエディタ拡張について説明


 - プロジェクトビューで選択されてるファイル名がSelectAssetPath(ユニティの関数色々ラップした自前関数)で取れるので、svn/TortoiseProcのコマンドに渡してTortoiseSVNを起動したら状態取得したり。
 - OnGUI関数にプロジェクトビューのアイコン一個が表示されるたびコールバックが来るのでそのタイミングでGUI.Labelを使っていろいろ表示。
 - コレでカスタムメニュー追加。60と書いてるのは登録優先(低いほうが上になる)

```menu.cs
[MenuItem("Assets/uVCSBridge/Update", false, 60)]
public static void update()
{
  ... メニューが選択された時の処理をここに書く
}
```

- 初期化

```start.cs
/// <summary>
/// 初期化時コールバック
/// </summary>
[InitializeOnLoadMethod]
private static void Bridge()
{
 // プロジェクトウィンドウ更新時に呼ばれるコールバック登録
 EditorApplication.projectWindowItemOnGUI += OnGUI;
 ... エディタ起動時に呼ばれる処理
}
/// <summary>
/// ステータスアイコンをプロジェクトビューにオーバーレイ表示
/// </summary>
/// <param name="guid"></param>
/// <param name="selectionRect"></param>
private static void OnGUI(string guid, Rect selectionRect)
{
   // ShowStatusLabel関数でアイコン表示してます。
}

```
- プリファレンス

```preference.cs
[PreferenceItem("uVCSBridge")]
public static void DrawPreferences()
{
        // VCSの種類
        //EditorGUILayout.LabelField("VCS Type" + "  ");
        VCSType newVcs = (VCSType)EditorGUILayout.EnumPopup("VCS Type", Settings.VcsType);
        if (newVcs != Settings.VcsType)
        {
            Settings.VcsType = newVcs;
        }
}

// 設定保存
EditorPrefs.GetBool("固有名", "デフォルト値"));
EditorPrefs.SetBool("固有名", "値"); }
```

# 今後の課題

- アイコンオーバーレイの更新タイミングがあまりよろしくない。
 - 現状起動時とプロジェクトビューでアイコンを選択した時のみなので反映されるまでにラグがある。。。
 ***追記:最新版でたぶんちょっと改善されました(；´∀｀)***

- Unity上でファイルを移動によるコミットログ消滅問題をスマートに解決したい
 - svnにmoveコマンドがるのでファイル移動をフックしてゴニョゴニョすれば良さそうだけどUnityの事まだ良くわかってない。。。

- エディタ拡張の知識も殆ど無い状態で書きなぐったのでもっと深くエディタ拡張を理解し仕様&コード整理してちゃんと公開したい。

そんな感じです。フィードバックお待ちしております(´∀｀)
https://github.com/DandyMania/uVCSBridge

# 参考ページ
- [テラシュールブログ Unity開発者が複数人で開発を進める上で覚えておくと幸せになる９つの事](http://tsubakit1.hateblo.jp/entry/20140613/1402670011)
- [Unity エディタ拡張の作り方1](http://qiita.com/ysida/items/9e0c801b2353abc140b8)
- [コガネブログ 【Unity】Projectビューにファイル数を表示するエディタ拡張](http://baba-s.hatenablog.com/entry/2015/06/22/090000)
- [Editor拡張でショートカットキーをカスタマイズ](http://qiita.com/fujimisakari/items/36284ececdb06e3cdb4c)
- [TortoiseSVN の自動化](https://tortoisesvn.net/docs/release/TortoiseSVN_ja/tsvn-automation.html)
- [svn status](http://www.caldron.jp/~nabetaro/svn/svnbook-1.4-final/svn.ref.svn.c.status.html)
- [Unity AssetStore SVN連動関連アセット](https://www.assetstore.unity3d.com/jp/#!/search/page=1/sortby=relevance/query=SVN)
- [HierarchyビューとProjectビューを拡張！「UnityEditorEnhancements」](http://masa795.hatenablog.jp/entry/2013/03/21/125123)