227 lines
7.3 KiB
C#
227 lines
7.3 KiB
C#
// ***********************************************************************
|
||
// Assembly : Game
|
||
// Author : Kimch
|
||
// Created : 2020-09-08
|
||
// Description :
|
||
// Last Modified By :
|
||
// Last Modified On :
|
||
// ***********************************************************************
|
||
// <copyright file= "EditorScriptsCreator" company="Kimch"></copyright>
|
||
// <summary></summary>
|
||
// ***********************************************************************
|
||
|
||
using System;
|
||
using System.IO;
|
||
using System.Text;
|
||
using System.Text.RegularExpressions;
|
||
using UnityEditor;
|
||
using UnityEditor.ProjectWindowCallback;
|
||
using UnityEngine;
|
||
|
||
namespace KF.ScriptHelper
|
||
{
|
||
internal class CreateAssetAction
|
||
{
|
||
/// <summary>
|
||
/// 添加Assets/Create/My C#子菜单并创建MonoBehaviour脚本
|
||
/// </summary>
|
||
[MenuItem("Assets/Create/My C#", false, 60)]
|
||
public static void CreateNormalCS()
|
||
{
|
||
//参数为传递给CreateEventCSScriptAsset类action方法的参数
|
||
ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0,
|
||
ScriptableObject.CreateInstance<CreateCSScriptAsset>(),
|
||
GetSelectPathOrFallback() + "/NewScript.cs", EditorGUIUtility.FindTexture("cs Script Icon"),
|
||
EditorScriptsConfig.Instance.templatePath + "81-C# Script-NewBehaviourScript.cs.txt");
|
||
}
|
||
|
||
[MenuItem("Assets/Create/My UI C#/Window", false, 61)]
|
||
public static void CerateUICS()
|
||
{
|
||
if (!Selection.activeObject)
|
||
{
|
||
return;
|
||
}
|
||
|
||
AutoCreatUIScript.CreateUIScripts();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 添加Assets/Create/My C#子菜单并创建MonoBehaviour脚本
|
||
/// </summary>
|
||
[MenuItem("Assets/Create/My UI C#/Widget", false, 62)]
|
||
public static void CreateUIItemCS()
|
||
{
|
||
//参数为传递给CreateEventCSScriptAsset类action方法的参数
|
||
ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0,
|
||
ScriptableObject.CreateInstance<CreateCSScriptAsset>(),
|
||
GetSelectPathOrFallback() + "/NewScript.cs", EditorGUIUtility.FindTexture("cs Script Icon"),
|
||
EditorScriptsConfig.Instance.templatePath + "81-C# Script-UIWidgetScript.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;
|
||
}
|
||
|
||
public string GetSelectUIPathOrFallback()
|
||
{
|
||
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方法
|
||
internal class CreateCSScriptAsset : 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);
|
||
while (fileNameWithoutExtension.Contains("."))
|
||
{
|
||
fileNameWithoutExtension = Path.GetFileNameWithoutExtension(fileNameWithoutExtension);
|
||
}
|
||
|
||
text = ReplaceRule(text, fileNameWithoutExtension);
|
||
|
||
//写入配置文件
|
||
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));
|
||
}
|
||
|
||
//将模板类中的类名替换成你创建的文件名
|
||
internal static string ReplaceRule(string text, string scriptName)
|
||
{
|
||
//将模板类中的类名替换成你创建的文件名
|
||
text = Regex.Replace(text, "#SCRIPTNAME#", scriptName);
|
||
text = Regex.Replace(text, "#AUTHOR#", EditorScriptsConfig.Instance.author);
|
||
text = Regex.Replace(text, "#COMPANY#", EditorScriptsConfig.Instance.company);
|
||
text = Regex.Replace(text, "#NAMESPACE#", EditorScriptsConfig.Instance.nameSpace);
|
||
text = Regex.Replace(text, "#DATE#", DateTime.Now.ToString("yyyy-MM-dd"));
|
||
return text;
|
||
}
|
||
}
|
||
|
||
internal class AutoCreatUIScript
|
||
{
|
||
public static void CreateUIScripts()
|
||
{
|
||
var obj = Selection.activeObject;
|
||
if (!obj)
|
||
{
|
||
EditorUtility.DisplayDialog("错误提示", "请先选择Prefab", "确认");
|
||
}
|
||
string directory = AssetDatabase.GetAssetPath(obj);
|
||
if (Directory.Exists(directory))
|
||
{
|
||
var files = Directory.GetFiles(directory);
|
||
if (files.Length < 2)
|
||
{
|
||
GenerateWindow(Path.Combine(directory, obj.name + ".cs"), obj.name);
|
||
GenerateView(Path.Combine(directory, obj.name + ".View.cs"), obj.name);
|
||
}
|
||
}
|
||
}
|
||
|
||
public static void GenerateWindow(string generateFilePath, string behaviourName)
|
||
{
|
||
var sw = new StreamWriter(generateFilePath, false, Encoding.UTF8);
|
||
|
||
var tFile = Path.Combine(EditorScriptsConfig.Instance.templatePath, "81-C# Script-UIScript.cs.txt");
|
||
|
||
StreamReader streamReader = new StreamReader(tFile);
|
||
string text = streamReader.ReadToEnd();
|
||
streamReader.Close();
|
||
|
||
text = CreateCSScriptAsset.ReplaceRule(text, behaviourName);
|
||
sw.Write(text);
|
||
|
||
sw.Flush();
|
||
sw.Close();
|
||
|
||
CreateCSScriptAsset.CreateScriptAssetFromTemplate(generateFilePath, generateFilePath);
|
||
AssetDatabase.SaveAssets();
|
||
AssetDatabase.Refresh();
|
||
}
|
||
|
||
public static void GenerateView(string generateFilePath, string behaviourName)
|
||
{
|
||
var sw = new StreamWriter(generateFilePath, false, Encoding.UTF8);
|
||
|
||
var tFile = Path.Combine(EditorScriptsConfig.Instance.templatePath, "81-C# Script-UIScript.View.cs.txt");
|
||
StreamReader streamReader = new StreamReader(tFile);
|
||
string text = streamReader.ReadToEnd();
|
||
streamReader.Close();
|
||
|
||
text = CreateCSScriptAsset.ReplaceRule(text, behaviourName);
|
||
|
||
sw.Write(text);
|
||
|
||
sw.Flush();
|
||
sw.Close();
|
||
|
||
AssetDatabase.SaveAssets();
|
||
AssetDatabase.Refresh();
|
||
}
|
||
}
|
||
}
|