1、模板配置
/*******************************************************************************
* 版本声明:v1.0.0
* 类 名 称:EditorScriptsConfig
* 创建日期:2020-04-13 14:52:46
* 作者名称:末零
* 功能描述:脚本模板-配置
******************************************************************************/
using System.IO;
using UnityEditor;
using UnityEngine;
namespace LastZero.ScriptHelper
{
/// <summary>
/// 脚本模板
/// </summary>
public class EditorScriptsConfig : ScriptableObject
{
/// <summary>
/// 作者
/// </summary>
[Header("作者")]
public string Author = "Author";
/// <summary>
/// 命名空间
/// </summary>
[Header("名称空间")]
public string NameSpace = "NameSpace.Author";
/// <summary>
/// 模板路径
/// </summary>
[Header("模板路径")]
public string TemplatePath = "Assets/LastZeroFrame/Scripts/1.ScriptHelper/Template/";
private const string EditorScriptsConfigFile = "EditorScriptsConfigFile.asset";
private static string editorScriptsConfigCsPath;
public static string EditorScriptsConfigCsPath
{
get
{
if (!string.IsNullOrEmpty(editorScriptsConfigCsPath))
{
return editorScriptsConfigCsPath;
}
var result = Directory.GetFiles(Application.dataPath + "/LastZeroFrame/Scripts/1.ScriptHelper", "EditorScriptsConfig.cs", SearchOption.AllDirectories);
if (result.Length >= 1)
{
editorScriptsConfigCsPath = Path.GetDirectoryName(result[0]);
editorScriptsConfigCsPath = editorScriptsConfigCsPath.Replace('\\', '/');
editorScriptsConfigCsPath = editorScriptsConfigCsPath.Replace(Application.dataPath, "Assets");
editorScriptsConfigCsPath = editorScriptsConfigCsPath + "/" + EditorScriptsConfigFile;
}
return editorScriptsConfigCsPath;
}
}
private static EditorScriptsConfig instanceField;
public static EditorScriptsConfig Instance
{
get
{
if (instanceField != null)
{
return instanceField;
}
instanceField = (EditorScriptsConfig)AssetDatabase.LoadAssetAtPath(EditorScriptsConfigCsPath, typeof(EditorScriptsConfig));
if (instanceField == null)
{
instanceField = ScriptableObject.CreateInstance<EditorScriptsConfig>();
AssetDatabase.CreateAsset(instanceField, EditorScriptsConfigCsPath);
}
return instanceField;
}
}
}
}
2、模板设置
/*******************************************************************************
* 版本声明:v1.0.0
* 类 名 称:EditorScriptsConfigWindow
* 创建日期:2020-04-13 14:53:16
* 作者名称:末零
* 功能描述:脚本模板-设置
******************************************************************************/
using UnityEditor;
using UnityEngine;
namespace LastZero.ScriptHelper
{
/// <summary>
/// 脚本配置窗口
/// </summary>
public class EditorScriptsConfigWindow : EditorWindow
{
/// <summary>
/// 脚本配置菜单
/// </summary>
// Add a new menu item with hotkey ALT-F
[MenuItem("EditorTools/Template Config &F")]
static void ScriptsConfig()
{
EditorScriptsConfigWindow configWindow = new EditorScriptsConfigWindow();
configWindow.minSize = new Vector2(600, 300);
configWindow.maxSize = new Vector2(600, 300);
configWindow.Show();
}
private void OnGUI()
{
GUILayout.BeginVertical();
GUILayout.Space(30);
GUI.skin.label.fontSize = 15;
GUI.skin.label.alignment = TextAnchor.UpperLeft;
this.titleContent = new GUIContent("脚本生成配置");
EditorScriptsConfig.Instance.Author = EditorGUILayout.TextField("作者:", EditorScriptsConfig.Instance.Author);
GUILayout.Space(10);
EditorScriptsConfig.Instance.NameSpace = EditorGUILayout.TextField("名称空间:", EditorScriptsConfig.Instance.NameSpace);
GUILayout.Space(10);
EditorScriptsConfig.Instance.TemplatePath = EditorGUILayout.TextField("模板路径: ", EditorScriptsConfig.Instance.TemplatePath);
GUI.skin.label.alignment = TextAnchor.MiddleCenter;
GUILayout.Space(20);
GUI.color = Color.green;
if (GUILayout.Button("完成"))
{
if (!EditorScriptsConfig.Instance.TemplatePath.EndsWith("/"))
EditorScriptsConfig.Instance.TemplatePath += "/";
EditorUtility.SetDirty(EditorScriptsConfig.Instance);
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
this.Close();
}
GUILayout.EndVertical();
}
}
}
3、创建菜单
/*******************************************************************************
* 版本声明:v1.0.0
* 类 名 称:CreateAssetAction
* 创建日期:2020-04-13 14:49:14
* 作者名称:末零
* 功能描述:脚本模板-菜单
******************************************************************************/
using System;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using UnityEngine;
using UnityEditor;
using UnityEditor.ProjectWindowCallback;
namespace LastZero.ScriptHelper
{
public class CreateAssetAction
{
/// <summary>
/// 添加Assets/Create/LastZero C#子菜单并创建MonoBehaviour脚本
/// </summary>
[MenuItem("Assets/Create/LastZero C#", false, 60)]
public static void CreateNormalCS()
{
//参数为传递给CreateEventCSScriptAsset类action方法的参数
ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0,
ScriptableObject.CreateInstance<CreateEventCSScriptAsset>(),
GetSelectPathOrFallback() + "/NewScript.cs", EditorGUIUtility.FindTexture("cs Script Icon"),
EditorScriptsConfig.Instance.TemplatePath+ "C#Script.cs.txt");
}
/// <summary>
/// 获取路径
/// </summary>
/// <returns></returns>
public static string GetSelectPathOrFallback()
{
string path = "Assets";
//遍历选中的资源以获得路径
//Selection.GetFiltered是过滤选择文件或文件夹下的物体,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;
}
}
//要创建模板文件必须继承EndNameEditAction,重写action方法
class CreateEventCSScriptAsset : EndNameEditAction
{
public override void Action(int instanceId, string pathName, string resourceFile)
{
//创建资源
UnityEngine.Object obj = CreateScriptAssetFromTemplate(pathName, resourceFile);
ProjectWindowUtil.ShowCreatedAsset(obj);//高亮显示资源
}
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, "#ScriptName#", fileNameWithoutExtension);
text = Regex.Replace(text, "#Author#", EditorScriptsConfig.Instance.Author);
text = Regex.Replace(text, "#NameSpace#", EditorScriptsConfig.Instance.NameSpace);
text = Regex.Replace(text, "#NowTime#", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
//写入配置文件
bool encoderShouldEmitUTF8Identifier = true; //参数指定是否提供 Unicode 字节顺序标记
bool throwOnInvalidBytes = false;//是否在检测到无效的编码时引发异常
bool append = false;
UTF8Encoding encoding = new UTF8Encoding(encoderShouldEmitUTF8Identifier, throwOnInvalidBytes);
StreamWriter streamWriter = new StreamWriter(fullPath, append, encoding);
streamWriter.Write(text);
streamWriter.Close();
//刷新资源管理器
AssetDatabase.ImportAsset(pathName);
AssetDatabase.Refresh();
return AssetDatabase.LoadAssetAtPath(pathName, typeof(UnityEngine.Object));
}
}
}