C#之拓展脚本模板支持版本化管理

本文阅读并整理自《Unity3D游戏开发》

一般修改脚本模板可以直接在unity包目录中模板文件进行修改
C#之拓展脚本模板支持版本化管理_第1张图片
但是这样会出现一个问题就是,无法进行版本化管理,项目中每个人都需要手动在本地修改这个模板,无法版本管理可能会出现不一致的问题。
推荐使用如下方法:
将C# Script-MyNewBehaviourScript.cs添加到Editor/ScriptTemplates中,
C#之拓展脚本模板支持版本化管理_第2张图片
在Editor文件夹中创建Script_04_01.cs

using UnityEngine;
using UnityEditor;
using System;
using System.IO;
using System.Text;
using UnityEditor.ProjectWindowCallback;
using System.Text.RegularExpressions;
 
public class Script_04_01
{
	//脚本模板所目录
	private const string MY_SCRIPT_DEFAULT = "Assets/Editor/ScriptTemplates/C# Script-MyNewBehaviourScript.cs.txt";

	[MenuItem("Assets/Create/C# MyScript", false, 80)]
	public static void CreatMyScript()
    {
        string locationPath = GetSelectedPathOrFallback();
        ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0,
        ScriptableObject.CreateInstance<MyDoCreateScriptAsset>(),
		locationPath + "/MyNewBehaviourScript.cs",
        null,MY_SCRIPT_DEFAULT);
    }
 
    public static string GetSelectedPathOrFallback()
    {
        string path = "Assets";
        foreach (UnityEngine.Object obj in Selection.GetFiltered(typeof(UnityEngine.Object), SelectionMode.Assets))
        {
            path = AssetDatabase.GetAssetPath(obj);
            if (!string.IsNullOrEmpty(path) && File.Exists(path))
            {
                path = Path.GetDirectoryName(path);
                break;
            }
        }
        return path;
    }
}    
 
 
class MyDoCreateScriptAsset : EndNameEditAction
{
 
    public override void Action(int instanceId, string pathName, string resourceFile)
    {
        UnityEngine.Object o = CreateScriptAssetFromTemplate(pathName, resourceFile);
        ProjectWindowUtil.ShowCreatedAsset(o);
    }
 
    internal static UnityEngine.Object CreateScriptAssetFromTemplate(string pathName, string resourceFile)
    {
        string fullPath = Path.GetFullPath(pathName);
        StreamReader streamReader = new StreamReader(resourceFile);
        string text = streamReader.ReadToEnd();
        streamReader.Close();
        string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(pathName);
		//替换文件名
        text = Regex.Replace(text, "#NAME#", fileNameWithoutExtension);
        bool encoderShouldEmitUTF8Identifier = true;
        bool throwOnInvalidBytes = false;
        UTF8Encoding encoding = new UTF8Encoding(encoderShouldEmitUTF8Identifier, throwOnInvalidBytes);
        bool append = false;
        StreamWriter streamWriter = new StreamWriter(fullPath, append, encoding);
        streamWriter.Write(text);
        streamWriter.Close();
        AssetDatabase.ImportAsset(pathName);
        return AssetDatabase.LoadAssetAtPath(pathName, typeof(UnityEngine.Object));
    }
} 

C#之拓展脚本模板支持版本化管理_第3张图片
核心:CreateScriptAssetFromTemplate,拿到用户输入的名称以及文件将创建的目录,进行简单的字符串替换,再创建新的模板类。

你可能感兴趣的:(Unity3D)