原文链接
原文写得很好,但是主题格式我不太喜欢,所以我对文章的格式进行了修整,方便自己日后阅读
正文
前言
一般情况下,在项目整个开发进程中,是由 TA 来负责整个美术的资源管理与 SVN 的提交(假设你们协同工具用的是 SVN , GIT 同理)。
那么问题就来了,在提交的过程中难免会出现失误,不小心提交了不太正确的资源(也许是没有配置好,也许是在提交前没有执行程序的一些功能等等),那么必然会给程序带来苦恼。一次两次还好,如果重复性的犯某些错误就不好了,程序们也会质疑我们 TA 的能力的。
解决思路
首先人工手动检查肯定是行不通的,一定要做自动化处理,那么什么时间点做自动化处理就是 最关键 的了,经验告诉我们,所有的资源都是要提交的,那么如果我们能在提交前做一次检测,如果不符合约定那么就提示警告,这样就万事大吉了,唯一的 缺点 就是你要保证你的所有提交行为 必须 是在 Unity 中进行操作的。
代码
几个 核心点 说明下:
- 通过
System.Diagnostics命名空间,来直接访问系统进程 cmd,并对其进行操作命令行以实现 svn 功能。 - 以下代码实现的是提交选中的文件目录下的所有资源。
- 在
PathHandle方法中进行检测,由于提交每个目录资源时约定的规则可能不一样,所以这里可以通过判断当前选中的文件夹来做检测与自动化功能。 - 直接复制到脚本中并放入工程可直接使用,只需改一下
PathHandle即可...
#if UNITY_EDITOR
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine;
namespace taecg.tools.myTools
{
public class MyToolsSVN
{
#region 数据成员
#endregion
#region 入口
[MenuItem ("WarWolf/taecg/Commit SVN #%E")]
public static void CommitPathToSvn ()
{
//svn 提交时的目录,通过当前选择的目录来决定,默认目录为整个 Unity 工程
string path = GetSelectedPath ("Assets");
if (!PathHandle (path)) return;
//closeonend 2 表示假设提交没错,会自动关闭提交界面返回原工程,详细描述可在 TortoiseSVN/help/TortoiseSVN/Automating TortoiseSVN 里查看
string cmdStr = string.Format ("/c tortoiseproc.exe /command:commit /path:"{0}" /closeonend 2", path);
//开启系统进程 cmd.exe,并执行 svn 相关的命令行操作
ProcessStartInfo info = new ProcessStartInfo ("cmd.exe", cmdStr);
info.WindowStyle = ProcessWindowStyle.Hidden; //隐藏cmd窗口
Process.Start (info);
}
public static string GetSelectedPath (string fallback)
{
string path = fallback;
foreach (Object obj in Selection.GetFiltered (typeof (Object), SelectionMode.Assets))
{
path = AssetDatabase.GetAssetPath (obj);
//如果路径不为空且存在的话,获取到该路径的目录名
if (!string.IsNullOrEmpty (path) && File.Exists (path))
{
return Path.GetDirectoryName (path);
}
}
return path;
}
#endregion
#region 提交前的检测处理
public static bool PathHandle (string path)
{
//示例,将 Characters 目录的所有 Prefab 的 Active 设置为 False
if (path.Contains ("Assets/Resources/Characters"))
{
var guids = AssetDatabase.FindAssets ("t:GameObject", new string[] { "Assets/Resources/Characters" });
foreach (var i in guids)
{
string _path = AssetDatabase.GUIDToAssetPath (i);
GameObject _go = (GameObject) AssetDatabase.LoadAssetAtPath (_path, typeof (GameObject));
//Active
_go.SetActive (false);
//坐标默认化
// _go.transform.SetPositionAndRotation (Vector3.zero, Quaternion.identity);
// _go.transform.localScale = Vector3.one;
//Animator
var _animator = _go.GetComponent<Animator> ();
if (_animator && _animator.runtimeAnimatorController == null)
{
EditorUtility.DisplayDialog ("Waring", _go.name + "此对象的Animator为空!!!", "OK");
Selection.activeGameObject = _go;
return false;
}
}
}
AssetDatabase.SaveAssets ();
return true;
}
#endregion
}
}
#endif
从此,完美的 TA 形象从此诞生....