Unity 編輯器拓展 —— svn

在新的公司裏面工作,發現在工作時候的編輯器沒有拓展svn功能,每次都需要進入到工程文件夾中去提交修改過的代碼,這讓我感到很不爽,所以想拓展一下unity提供直接使用svn功能的工具。

在網上找了一下,都沒有寫全,所以決定自己動手,以下就是我寫這套工具的思路,最後奉上源碼供大家學習。


平臺:unity5.3

系統:win7


我要的功能僅僅是svn的commit和update命令,所以不想弄的太複雜,直接在project面板的右擊彈出框中做了拓展


爲什麼要把接口放在這裏來呢?橫向對比

如果把接口放在 菜單欄 裏面的話就會發現每次選中要上傳的資源然後去點擊菜單欄,這樣操作反倒不是很方便

如果直接拓展腳本,使svn提交入口在屬性面板中出現。這種操作方式就需要拓展所有的腳本,而且也不能提交整個文件夾和更新文件夾,操作反倒更加複雜

所以最後是決定svn的接口放在這裏



svn提交方式

起先我是覺得如果點擊相關的方法入口直接進行相關的操作,不需要再有彈出窗口之類的東西出現。

在本機上面安裝了win32svn,在執行相應的代碼的時候就能夠不經過任何的彈窗就可以完成操作了,這裏的經驗教訓供大家借鑑一下

可是當程序運行起來後就發現了一個很嚴重的問題,一個文件夾下面可能存在很多的文件不需要提交的,難道你要一個個去提交?太費勁了,所以還是該成了使用原生的提交方法彈出一個窗口讓你自行選擇需要上傳的文件。

核心代碼:


執行完代碼以後的彈窗:



可以自行選擇需要提交的代碼,選擇性更強,操作空間更廣。


最後附上源碼,供大家參考,寫的不好的地方也請大家指出

源碼:

/**
 *  本類是在Unity中直接調用SVN命令做相應的操作
 *  使用方法:右擊project面板中的物體
 *  如果操作沒有執行,檢查計算機環境有沒有配置svn路徑
 *  選擇svn 命令 相應的選項
 */

using UnityEngine;
using System.Collections;
using UnityEditor;
using System;
using System.IO;
using System.Threading;
public class SVNTools : Editor
{

    static class SVNCmd
    {
        public const string COMMIT = "commit";
        public const string UPTATE = "update";
    }

    /// <summary>
    /// exe的應用名稱。
    /// </summary>
    public const string SVN_APP_NAME = "TortoiseProc.exe";

    private static string cmdFormat = null;
    private static string GetCmdFormatString()
    {
        if(string.IsNullOrEmpty(cmdFormat))
        {
            cmdFormat =  SVN_APP_NAME + " " + "/command:{0} /path:{1} /closeonend:0";
        }
        return cmdFormat;
    }

    /// <summary>
    /// SVN 提交數據
    /// </summary>
    [MenuItem("Assets/SVN Operation/SVN Commit...")]
    public static void Commit()
    {
        var go = GetCurSelectionObj();
        if(go == null){ return; }
        var dir_path = GetObjPath(go);
        string cmd = string.Format(GetCmdFormatString(), SVNCmd.COMMIT, dir_path);
        Debug.Log(cmd);
        InvokeCmd(cmd);
    }

    /// <summary>
    /// SVN 更新數據
    /// </summary>
    [MenuItem("Assets/SVN Operation/SVN Update...")]
    public static void Update()
    {
        var go = GetCurSelectionObj();
        if (go == null) { return; }
        var dir_path = GetObjPath(go);
        string cmd = string.Format(GetCmdFormatString(), SVNCmd.UPTATE, dir_path);
        Debug.Log(cmd);
        InvokeCmd(cmd);
    }

    /// <summary>
    /// SVN 更新全部數據
    /// </summary>
    [MenuItem("Assets/SVN Operation/SVN UpdateALL...")]
    public static void UpdateALL()
    {
        var dir_path = Application.dataPath;
        string cmd = string.Format(GetCmdFormatString(), SVNCmd.UPTATE, dir_path);
        InvokeCmd(cmd);
    }


    /// <summary>
    /// 獲取當前選擇到的物體
    /// </summary>
    private static UnityEngine.Object GetCurSelectionObj()
    {
        if (Selection.objects.Length != 1)
        {
            return null;
        }
        var go = Selection.objects[0];

        return go;
    }

    /// <summary>
    /// 根據預設名稱獲取路徑
    /// </summary>
    private static string GetObjPath(UnityEngine.Object go)
    {
        string str = Application.dataPath.Replace("Assets", "");
        string path = AssetDatabase.GetAssetPath(go);
        string dir_path = System.IO.Path.GetFullPath(str + path);
        return dir_path;
    }


    /// <summary>
    /// 調用CMD 命令
    /// </summary>
    private static void InvokeCmd(string cmd)
    {
         //UnityEngine.Debug.Log(cmd);
        AssetDatabase.Refresh();
         new Thread(new ThreadStart(() =>
         {
             try
             {
                 System.Diagnostics.Process p = new System.Diagnostics.Process();
                 p.StartInfo.FileName = "cmd.exe";
                 p.StartInfo.Arguments = "/c " + cmd + "&exit";    //確定程式命令行  /c 執行字符串指定的命令然後終斷 詳細查詢CMD命令:CMD /?
                 p.StartInfo.UseShellExecute = false;    //是否使用操作系統shell啓動
                 p.StartInfo.RedirectStandardInput = true;//接受來自調用程序的輸入信息
                 p.StartInfo.RedirectStandardOutput = true;//由調用程序獲取輸出信息
                 p.StartInfo.RedirectStandardError = true;//重定向標準錯誤輸出
                 p.StartInfo.CreateNoWindow = true;//不顯示程序窗口
                 p.Start(); //啓動程序
                 p.WaitForExit();//等待程序執行完退出進程
                 p.Close();
             }
             catch (Exception e)
             {
                 Console.WriteLine(e.Message);
             }
         })).Start();
    }

}


//全文結束了,如果發現bug或者不足的地方,將持續在本文中改進,請大家留意。

//源代碼稍微改進了一下,

//改動點:直接執行svn的exe,在svn安裝過程中會自動配置環境,這裏就直接引用這個路徑了,代碼會更加簡潔


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章