using UnityEngine; using UnityEditor; using System.IO; using UnityEditor.ProjectWindowCallback; using System.Text; using System; namespace TFramework { public class CreateScriptFromTemplate { public static void Create(Type type, string templatePath, string destName, Texture2D icon) { ProjectWindowUtil.StartNameEditingIfProjectWindowExists( 0, ScriptableObject.CreateInstance(type) as EndNameEditAction, destName, icon, templatePath ); } public static void Create(string templatePath, string destName, Texture2D icon) where T : DoCreateScriptAsset { ProjectWindowUtil.StartNameEditingIfProjectWindowExists( 0, ScriptableObject.CreateInstance(), destName, icon, templatePath ); } } public abstract class DoCreateScriptAsset : EndNameEditAction { public virtual string Suffix { get; set; } = ".cs"; public override void Action(int instanceId, string pathName, string resourceFile) { UnityEngine.Object obj = CreateAssetFromTemplate(pathName, resourceFile); ProjectWindowUtil.ShowCreatedAsset(obj); } internal UnityEngine.Object CreateAssetFromTemplate(string pathName, string resourceFile) { string className = pathName.Remove(0, pathName.LastIndexOf('/') + 1); pathName += Suffix; string fullName = Path.GetFullPath(pathName); StreamReader reader = new StreamReader(resourceFile); string content = reader.ReadToEnd(); reader.Close(); content = ReplaceTemplateContent(className, content); StreamWriter writer = new StreamWriter(fullName, false, UTF8Encoding.UTF8); writer.Write(content); writer.Close(); AssetDatabase.ImportAsset(pathName); AssetDatabase.Refresh(); return AssetDatabase.LoadMainAssetAtPath(pathName); } /// /// 替换模版内容 /// /// 替换内容 /// public abstract string ReplaceTemplateContent(string className, string templateContent); } }