解决各种漏传 资源 / 代码 的疑难杂症.

  因为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相关推荐

  1. 第七节:WebApi与Unity整合进行依赖注入和AOP的实现

    一. IOC和DI 1. 通过Nuget引入Unity程序集. PS:[版本:5.8.6] 2. 新建DIFactory类,用来读取Unity的配置文件并创建Unity容器,需要注意的是DIFacto ...

  2. Unity下的ECS框架 Entitas简介

    最近随着守望先锋制作组在gdc上发布的一个关于ecs的talk,ecs这个架构算是得到了一定的曝光度. 在这之前,github上就一直有一个C#的ecs框架名为Entitas,截止现在已经有1300+ ...

  3. unity 3d水的资源包_使用Apple LiDAR,一小时为你家量身打造3D游戏

    ​ 小伙伴们大家好,我是普通工科男某典,佛系更新日常生活中有趣的科技小技巧. 苹果在今年发布的iPad Pro和iPhone 12 Pro中都内置了全新的LiDAR传感器,这个小东西除了在测距仪里提高 ...

  4. unity 和安卓互相交互

    https://blog.csdn.net/u010407393/article/details/79423769 Unity和安卓交互 一:设置环境 1.安装Android Build Suppor ...

  5. Unity 使用 Behaviac (二)让unity的行为能执行behaviac搭建的树的逻辑

    本人也是第一次使用behaviac做开发,可能有很多不对的地方和不明确的地方.希望各路大神能指点迷津或者指出错误.感谢!!! 本篇主要讲了: 使用behaviac编辑的行为树可以导出数据:xml文件和 ...

  6. Unity再更新AR Foundation套件拥有胜博发渲染工作管线

    Unity对跨平台解决方案AR Foundation进行了重大更新,其最新版本增加支持ARKit中可提供多重用户AR体验的ARWorldMap功能,另外,新的轻量级渲染工作管线让开发者能更简单的自定义 ...

  7. 【三星官方教程】如何为Gear VR 开发应用(二):创建Unity项目

    关于项目创建与Demo导入 本系列教程将介绍如何用 unity 为Gear VR开发一个360度照片查看器.在开始用Unity为Gear VR开发应用前,需要完成Unity和Oculus的整合,并导入 ...

  8. Unity 2D入门基础教程

    作者:Christopher LaPollo 翻译:Xiaoke 写在前面的前面的话:首先感谢原作者和译者,这是一篇非常棒的文章! 写在前面的话:转载肯定会留原文链接,作者的署名,这是毋庸置疑的.而我 ...

  9. WebApi系列(从.Net 到 .Net Core)【更新】

    一. 简介  1. 什么是WebApi? WebApi是一个很广泛的概念,在这里我们特指.Net平台下的Asp.Net WebApi框架,它是针对各种客户端(浏览器.APP等)来构建Http服务的一个 ...

最新文章

  1. spring data jpa 详解
  2. 在NOILINUX下的简易VIM配置
  3. 介绍一个Material设计风格的Chrome开发者工具增强扩展
  4. android adb 开机广播,Android中常用的adb指令
  5. 甲骨文Java 14来啦!
  6. SSH远程登录原理与运用
  7. CSS如何实现数字分页效果
  8. win10远程计算机或设备将不接收连接?
  9. ubuntu创建wifi热点(android可识别)亲测可用
  10. # 语音信号处理基础(十)——梅尔倒谱系数
  11. viewport就是这回事
  12. ftp协议是一种用于什么的协议_购房协议怎么写?签购房协议要注意什么
  13. 转】M1卡密钥破解,收藏
  14. 让你浏览器飞起来的电脑插件合集
  15. 高校自主招生计算机要求,2019各高校自主招生报名条件及考核内容
  16. win10老是弹出安全登录框
  17. 微信公众号页面中监听手机“返回”,并回到公众号里
  18. 类似易企秀的UI框架 整屏滑动
  19. 中国石油大学华东2013-2014-1c语言a卷_答案,中国石油大学(华东)2012—2013学年第二学期期中A卷试卷答案...
  20. 基于Hi3559A ARM64位嵌入式平台的OpenCV2.4.9+ffmpeg2.0.7移植及应用

热门文章

  1. Linux ENSP 搭建DHCP服务器并实现中继和Linux 下搭建DNS服务器(2个实验可跟做)
  2. linux耳机检测,Audio Jack 的耳机检测和按键检测
  3. BGP小实验(一)——小实验练练手走起来
  4. Linux内核判断大小端,linux kernel 如何处理大小端
  5. amd显卡风扇调节_非公版才是真爱 讯景XFX RX6800 XT海外版显卡评测
  6. sql 临时表_原创 | SQL优化之合理使用临时表
  7. python读写xlsx文件_python读写Excel文件--使用xlrd模块读取,xlwt模块写入
  8. linux使用jinja2模板_SaltStack配置管理工具jinja2模板的使用
  9. mysql256次利用_【案例】【MySQL】一次复杂的主从库数据不一致修复
  10. java 接口 签名机制_java – 当接口A在其方法签名中定义接口B时