【转载】做为 TA,如何让你提交的每个资源都正确无误

149 阅读3分钟

原文链接

做为TA,如何让你提交的每个资源都正确无误 | taecg

原文写得很好,但是主题格式我不太喜欢,所以我对文章的格式进行了修整,方便自己日后阅读

正文

前言

一般情况下,在项目整个开发进程中,是由 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 形象从此诞生....