在新的公司里面工作,发现在工作时候的编辑器没有拓展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安装过程中会自动配置环境,这里就直接引用这个路径了,代码会更加简洁