Unity整合TortoiseSVN
解决各种漏传 资源 / 代码 的疑难杂症.
因为Unity比较特殊的meta文件系统, 忘传漏传文件在后期可能导致重大引用丢失, 将SVN整合进项目势在必行. TortoiseSVN自带了命令行工具, 安装的时候选择了的话就能用了
直接代码:
using UnityEngine;
using UnityEditor;
using System.Diagnostics;
using System.Collections.Generic;namespace MyEditor
{public class UnitySVN{private const string Add_CMD = "add";private const string COMMIT_CMD = "commit";private const string UPDATE_CMD = "update";private const string REVERT_CMD = "revert";private static System.Text.StringBuilder ms_sb = new System.Text.StringBuilder();#region MenuItem Funcs[MenuItem("Assets/SVN/Update", false, 1001)]public static void SVN_Update(){var paths = GetAssetPathList();if(paths.Count > 0){Update(paths: paths.ToArray());}}[MenuItem("Assets/SVN/Revert", false, 1002)]public static void SVN_Revert(){var paths = GetAssetPathList();if(paths.Count > 0){Revert(paths.ToArray());}}[MenuItem("Assets/SVN/Commit", false, 1003)]public static void SVN_Commit(){var paths = GetAssetPathList();if(paths.Count > 0){Commit("UnitySVN Upload", true, paths.ToArray());}}#endregion#region Wrapped Funcs// addpublic static void Add(params string[] paths){WrappedCommadn(Add_CMD, paths, false);}// updatepublic static void Update(params string[] paths){WrappedCommadn(UPDATE_CMD, paths, false);SaveAndRefresh();}// revertpublic static void Revert(params string[] paths){WrappedCommadn(REVERT_CMD, paths, false);SaveAndRefresh();}// add->update->commitpublic static void Commit(string log, bool add = true, params string[] paths){if(add){Add(paths);}Update(paths);string extMsg = log ?? string.Empty;WrappedCommadn(command: COMMIT_CMD, paths: paths, newThread: true, extCommand: "/logmsg:\"Auto Upload : " + (extMsg) + "\"");}/// <summary>/// Wrap SVN Command/// </summary>/// <param name="command"></param>/// <param name="path"></param>/// <param name="extCommand"></param>public static void WrappedCommadn(string command, string[] paths, bool newThread = false, string extCommand = null){if(paths == null || paths.Length == 0){return;}ms_sb.Append(paths[0]);for(int i = 1; i < paths.Length; i++){ms_sb.Append("*");ms_sb.Append(paths[i]);}string cmd = "/c tortoiseproc.exe /command:{0} /path:\"{1}\" {2} /closeonend 2";string pathString = ms_sb.ToString();var commandString = string.Format(cmd, command, pathString, extCommand ?? string.Empty);ProcessStartInfo info = new ProcessStartInfo("cmd.exe", commandString);info.WindowStyle = ProcessWindowStyle.Hidden;if(newThread){System.Threading.ThreadPool.QueueUserWorkItem((_obj) =>{RunProcess(info);});}else{RunProcess(info);}}#endregion#region Help Funcspublic static HashSet<string> GetAssets(){HashSet<string> allAssets = new HashSet<string>();const string BaseFolder = "Assets";foreach(var obj in Selection.objects){var assetPath = AssetDatabase.GetAssetPath(obj);List<string> fullDirs = FullDirectories(assetPath, BaseFolder);allAssets.UnionWith(fullDirs);var dps = AssetDatabase.GetDependencies(assetPath, true);foreach(var dp in dps){if(dp != assetPath){List<string> dpsDirs = FullDirectories(dp, BaseFolder);allAssets.UnionWith(dpsDirs);}}}return allAssets;}public static List<string> GetAssetPathList(){var path = new List<string>(GetAssets());path.Sort((_l, _r) =>{if(_l.Length > _r.Length){return 1;}if(_l.Length < _r.Length){return -1;}return 0;});return path;}public static void SaveAndRefresh(){AssetDatabase.SaveAssets();AssetDatabase.Refresh();}public static List<string> FullDirectories(string path, string baseFolder){List<string> retVal = new List<string>();retVal.Add(path);retVal.Add(path + ".meta");baseFolder = baseFolder.Replace("\\", "/");var dir = System.IO.Path.GetDirectoryName(path).Replace("\\", "/");while(string.IsNullOrEmpty(dir) == false && dir != baseFolder){retVal.Add(dir);retVal.Add(dir + ".meta");dir = System.IO.Path.GetDirectoryName(dir).Replace("\\", "/");}return retVal;}private static void RunProcess(ProcessStartInfo info){Process p = null;try{using(p = Process.Start(info)){p.WaitForExit();}}catch(System.Exception ex){UnityEngine.Debug.LogError(@ex.ToString());if(p != null){p.Kill();}}}#endregion}/*/ closeonend:0不自动关闭对话框/ closeonend:1会自动关闭,如果没有错误/ closeonend:2会自动关闭,如果没有发生错误和冲突/ closeonend:3会自动关闭,如果没有错误,冲突和合并/ closeonend:4会自动关闭,如果没有错误,冲突和合并*/
}
主要的功能还是自动上传功能, 被选中物体的所有关联引用都会被加入上传列表, 并且所有文件夹也会被加入, 这样就保证了Add逻辑不会错误.
转载于:https://www.cnblogs.com/tiancaiwrk/p/10900173.html
Unity整合TortoiseSVN相关推荐
- 第七节:WebApi与Unity整合进行依赖注入和AOP的实现
一. IOC和DI 1. 通过Nuget引入Unity程序集. PS:[版本:5.8.6] 2. 新建DIFactory类,用来读取Unity的配置文件并创建Unity容器,需要注意的是DIFacto ...
- Unity下的ECS框架 Entitas简介
最近随着守望先锋制作组在gdc上发布的一个关于ecs的talk,ecs这个架构算是得到了一定的曝光度. 在这之前,github上就一直有一个C#的ecs框架名为Entitas,截止现在已经有1300+ ...
- unity 3d水的资源包_使用Apple LiDAR,一小时为你家量身打造3D游戏
小伙伴们大家好,我是普通工科男某典,佛系更新日常生活中有趣的科技小技巧. 苹果在今年发布的iPad Pro和iPhone 12 Pro中都内置了全新的LiDAR传感器,这个小东西除了在测距仪里提高 ...
- unity 和安卓互相交互
https://blog.csdn.net/u010407393/article/details/79423769 Unity和安卓交互 一:设置环境 1.安装Android Build Suppor ...
- Unity 使用 Behaviac (二)让unity的行为能执行behaviac搭建的树的逻辑
本人也是第一次使用behaviac做开发,可能有很多不对的地方和不明确的地方.希望各路大神能指点迷津或者指出错误.感谢!!! 本篇主要讲了: 使用behaviac编辑的行为树可以导出数据:xml文件和 ...
- Unity再更新AR Foundation套件拥有胜博发渲染工作管线
Unity对跨平台解决方案AR Foundation进行了重大更新,其最新版本增加支持ARKit中可提供多重用户AR体验的ARWorldMap功能,另外,新的轻量级渲染工作管线让开发者能更简单的自定义 ...
- 【三星官方教程】如何为Gear VR 开发应用(二):创建Unity项目
关于项目创建与Demo导入 本系列教程将介绍如何用 unity 为Gear VR开发一个360度照片查看器.在开始用Unity为Gear VR开发应用前,需要完成Unity和Oculus的整合,并导入 ...
- Unity 2D入门基础教程
作者:Christopher LaPollo 翻译:Xiaoke 写在前面的前面的话:首先感谢原作者和译者,这是一篇非常棒的文章! 写在前面的话:转载肯定会留原文链接,作者的署名,这是毋庸置疑的.而我 ...
- WebApi系列(从.Net 到 .Net Core)【更新】
一. 简介 1. 什么是WebApi? WebApi是一个很广泛的概念,在这里我们特指.Net平台下的Asp.Net WebApi框架,它是针对各种客户端(浏览器.APP等)来构建Http服务的一个 ...
最新文章
- spring data jpa 详解
- 在NOILINUX下的简易VIM配置
- 介绍一个Material设计风格的Chrome开发者工具增强扩展
- android adb 开机广播,Android中常用的adb指令
- 甲骨文Java 14来啦!
- SSH远程登录原理与运用
- CSS如何实现数字分页效果
- win10远程计算机或设备将不接收连接?
- ubuntu创建wifi热点(android可识别)亲测可用
- # 语音信号处理基础(十)——梅尔倒谱系数
- viewport就是这回事
- ftp协议是一种用于什么的协议_购房协议怎么写?签购房协议要注意什么
- 转】M1卡密钥破解,收藏
- 让你浏览器飞起来的电脑插件合集
- 高校自主招生计算机要求,2019各高校自主招生报名条件及考核内容
- win10老是弹出安全登录框
- 微信公众号页面中监听手机“返回”,并回到公众号里
- 类似易企秀的UI框架 整屏滑动
- 中国石油大学华东2013-2014-1c语言a卷_答案,中国石油大学(华东)2012—2013学年第二学期期中A卷试卷答案...
- 基于Hi3559A ARM64位嵌入式平台的OpenCV2.4.9+ffmpeg2.0.7移植及应用
热门文章
- Linux ENSP 搭建DHCP服务器并实现中继和Linux 下搭建DNS服务器(2个实验可跟做)
- linux耳机检测,Audio Jack 的耳机检测和按键检测
- BGP小实验(一)——小实验练练手走起来
- Linux内核判断大小端,linux kernel 如何处理大小端
- amd显卡风扇调节_非公版才是真爱 讯景XFX RX6800 XT海外版显卡评测
- sql 临时表_原创 | SQL优化之合理使用临时表
- python读写xlsx文件_python读写Excel文件--使用xlrd模块读取,xlwt模块写入
- linux使用jinja2模板_SaltStack配置管理工具jinja2模板的使用
- mysql256次利用_【案例】【MySQL】一次复杂的主从库数据不一致修复
- java 接口 签名机制_java – 当接口A在其方法签名中定义接口B时