Files
Hasebe/Library/PackageCache/com.annulusgames.unity-codegen@c93461327f0c/Editor/Utils/ScriptFileGenerator.cs
T
2026-09-21 12:15:57 +03:00

129 lines
3.7 KiB
C#

using System;
using System.Linq;
using System.Reflection;
using System.IO;
using UnityEditor;
namespace UnityCodeGen
{
internal static class ScriptFileGenerator
{
const string KEY_ISGENERATING = "UnityCodeGen-IsGenerating";
const string EXTENSION_META = ".meta";
static bool isGenerating
{
get
{
if (bool.TryParse(EditorUserSettings.GetConfigValue(KEY_ISGENERATING), out var result))
{
return result;
}
return false;
}
set
{
EditorUserSettings.SetConfigValue(KEY_ISGENERATING, value.ToString());
}
}
// static List<string> fileNames = new List<string>();
[InitializeOnLoadMethod]
static void Initialize()
{
if (isGenerating)
{
isGenerating = false;
}
else if (UnityCodeGenSettings.autoGenerateOnCompile)
{
Generate();
}
}
internal static void Generate()
{
if (isGenerating) return;
isGenerating = true;
// fileNames.Clear();
var generatorTypes = TypeCache.GetTypesDerivedFrom<ICodeGenerator>()
.Where(x => !x.IsAbstract && x.GetCustomAttribute<GeneratorAttribute>() != null);
var changed = false;
foreach (var t in generatorTypes)
{
var generator = (ICodeGenerator)Activator.CreateInstance(t);
var context = new GeneratorContext();
generator.Execute(context);
if (GenerateScriptFromContext(context))
{
changed = true;
}
}
// foreach (var file in Directory.GetFiles(FOLDER_PATH))
// {
// var name = Path.GetFileName(file);
// if (Path.GetExtension(name) != EXTENSION_META && !fileNames.Contains(name))
// {
// AssetDatabase.DeleteAsset(file);
// changed = true;
// }
// }
if (changed)
{
AssetDatabase.Refresh();
AssetDatabase.SaveAssets();
}
}
static bool GenerateScriptFromContext(GeneratorContext context)
{
var changed = false;
var folderPath = context.overrideFolderPath ?? UnityCodeGenUtility.defaultFolderPath;
if (!Directory.Exists(folderPath))
{
Directory.CreateDirectory(folderPath);
}
foreach (var code in context.codeList)
{
var hierarchy = code.fileName.Split('/');
var fileName = hierarchy[hierarchy.Length - 1];
var path = folderPath;
for (int i = 0; i < hierarchy.Length; i++)
{
path += "/" + hierarchy[i];
if (i == hierarchy.Length - 1) break;
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
}
if (File.Exists(path))
{
var text = File.ReadAllText(path);
if (text == code.text)
{
// fileNames.Add(code.fileName);
continue;
}
}
File.WriteAllText(path, code.text);
// fileNames.Add(code.fileName);
changed = true;
}
return changed;
}
}
}