游戏蛮牛学习群(纯技术交流,不闲聊):159852603
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

教程分享

关注:791

当前位置:游戏蛮牛 技术专区 教程分享

查看: 213|回复: 1

[暂存] 在Unity项目中调用TortoiseSVN

[复制链接]  [移动端链接]
5熟悉之中
509/1000
排名
5444
昨日变化
3

1

主题

161

帖子

509

积分

Rank: 5Rank: 5

UID
245227
好友
0
蛮牛币
597
威望
0
注册时间
2017-9-21
在线时间
97 小时
最后登录
2018-11-16
发表于 2018-10-24 10:08:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
前言:
    最近网监有点严, 很多地方不能上传文章了, 把笔记暂时做到这里来......
    我们在开发项目时, 特别是上层UI开发人员, 在SVN上传东西的时候经常忘东忘西, 一个UI包含的引用资源, 不是图片忘传了就是代码忘传了, 或者meta文件忘传了...
    那么我们直接把SVN的一些功能集成到项目里就好了, 因为Unity提供了获取对象所有引用资源的方法, 我们通过它就能完成自动上传功能了.
    使用的是TortoiseSVN GUI的命令工具哦, BUG自理











[C#] 纯文本查看 复制代码
namespace MyEditor
{
    public class UnitySVN
    {
        public struct AssetPair
        {
            public string assetPath;
            public string assetMetaPath;[/p][p=30, 2, left]            public AssetPair(string assetPath)
            {
                this.assetPath = assetPath;
                this.assetMetaPath = assetPath + ".meta";
            }
        }
        private const string Add_CMD = "add";
        private const string COMMIT_CMD = "commit";
        private const string UPDATE_CMD = "update";
        private const string REVERT_CMD = "revert";[/p][p=30, 2, left]        #region Wrapped Funcs
        // add
        public static void Add(params string[] path)
        {
            WrappedCommadn(Add_CMD, path);
        }
        // update
        public static void Update(params string[] path)
        {
            WrappedCommadn(UPDATE_CMD, path);
            SaveAndRefresh();
        }
        // revert
        public static void Revert(params string[] path)
        {
            WrappedCommadn(REVERT_CMD, path);
            SaveAndRefresh();
        }
        // add->update->commit
        public static void Commit(string log, bool add = true, params string[] path)
        {
            if(add)
            {
                Add(path);
            }
            Update(path);
            string extMsg = log ?? string.Empty;
            WrappedCommadn(COMMIT_CMD, path, "/logmsg:\"Auto Upload : " + (extMsg) + "\"");
        }[/p][p=30, 2, left]        /// <summary>
        /// Wrap SVN Command
        /// </summary>
        /// <param name="command"></param>
        /// <param name="path"></param>
        /// <param name="extCommand"></param>
        public static void WrappedCommadn(string command, string[] path, string extCommand = null)
        {
            string allPath = string.Empty;
            foreach(var data in path)
            {
                allPath += data + "*";
            }
            string cmd = "/c tortoiseproc.exe /command:{0} /path:\"{1}\" {2} /closeonend 2";
            var commandString = string.Format(cmd, command, allPath, extCommand ?? string.Empty);[/p][p=30, 2, left]            ProcessStartInfo info = new ProcessStartInfo("cmd.exe", commandString);
            info.WindowStyle = ProcessWindowStyle.Hidden;
            Process p = null;
            try
            {
                using(p = Process.Start(info))
                {
                    p.WaitForExit();
                }
            }
            catch
            {
                if(p != null)
                {
                    p.Kill();
                }
            }
        }
        #endregion[/p][p=30, 2, left]        #region MenuItem Funcs
        [MenuItem("Assets/SVN/Update", false, 1001)]
        public static void SVN_Update()
        {
            var path = GetAssetPathList();
            if(path.Count > 0)
            {
                Update(path: path.ToArray());
            }
        }
        [MenuItem("Assets/SVN/Revert", false, 1002)]
        public static void SVN_Revert()
        {
            var path = GetAssetPathList();
            if(path.Count > 0)
            {
                Revert(path.ToArray());
            }
        }
        [MenuItem("Assets/SVN/Commit", false, 1003)]
        public static void SVN_Commit()
        {
            var path = GetAssetPathList();
            if(path.Count > 0)
            {
                Commit("UnitySVN Upload", true, path.ToArray());
            }
        }
      
        #endregion[/p][p=30, 2, left]        #region Help Funcs
        public static List<AssetPair> GetAssets()
        {
            Dictionary<string, AssetPair> allAssets = new Dictionary<string, AssetPair>();[/p][p=30, 2, left]            foreach(var data in Selection.objects)
            {
                var asset = GetAsset(data);
                allAssets[asset.assetPath] = asset;
                var dps = GetAssetDependences(data);
                foreach(var dp in dps)
                {
                    allAssets[dp.assetPath] = dp;
                }
            }
            List<AssetPair> retVal = new List<AssetPair>(allAssets.Values);
            return retVal;
        }
        public static AssetPair GetAsset(UnityEngine.Object obj)
        {
            var assetRelativePath = AssetDatabase.GetAssetPath(obj);
            var assetPath = System.IO.Path.Combine(System.Environment.CurrentDirectory, assetRelativePath);
            AssetPair asset = new AssetPair(assetPath);
            return asset;
        }
        public static List<string> GetAssetPathList()
        {
            var path = new List<string>();
            var list = GetAssets();
            foreach(var data in list)
            {
                path.Add(data.assetPath);
                path.Add(data.assetMetaPath);
            }
            return path;
        }
        public static List<AssetPair> GetAssetDependences(UnityEngine.Object asset)
        {
            List<AssetPair> retVal = new List<AssetPair>();
            var filePath = AssetDatabase.GetAssetPath(asset);
            var dps = AssetDatabase.GetDependencies(filePath);
            foreach(var path in dps)
            {
                if(string.Equals(filePath, path, System.StringComparison.Ordinal) == false)
                {
                    var assetPath = System.IO.Path.Combine(System.Environment.CurrentDirectory, path);
                    var assetPair = new AssetPair(assetPath);
                    retVal.Add(assetPair);
                }
            }
            return retVal;
        }
        public static void SaveAndRefresh()
        {
            AssetDatabase.SaveAssets();
            AssetDatabase.Refresh();
        }
        #endregion[/p][p=30, 2, left]    }[/p][p=30, 2, left]    /*
    / closeonend:0不自动关闭对话框[/p][p=30, 2, left]    / closeonend:1会自动关闭,如果没有错误[/p][p=30, 2, left]    / closeonend:2会自动关闭,如果没有发生错误和冲突[/p][p=30, 2, left]    / closeonend:3会自动关闭,如果没有错误,冲突和合并[/p][p=30, 2, left]    / closeonend:4会自动关闭,如果没有错误,冲突和合并
     */
}










结语:
    主程再也不会因为你们忘传meta文件导致图片资源巨大而砍人了
    项目经理再也不会因为发包以后UI上全是空白矩形而跳楼了

回复

使用道具 举报

5熟悉之中
576/1000
排名
5153
昨日变化
45

1

主题

130

帖子

576

积分

Rank: 5Rank: 5

UID
204004
好友
0
蛮牛币
422
威望
0
注册时间
2017-1-22
在线时间
179 小时
最后登录
2018-11-16
发表于 2018-10-24 10:41:52 | 显示全部楼层
感谢分享!!

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

关闭

站长推荐 上一条 /1 下一条

快速回复 返回顶部 返回列表