111 lines
3.6 KiB
C#
111 lines
3.6 KiB
C#
#if UNITY_EDITOR
|
|
using System.Linq;
|
|
using Unity.VisualScripting;
|
|
using UnityCodeGen;
|
|
using UnityEditor;
|
|
|
|
namespace Code.Infrastructure.Generators
|
|
{
|
|
[Generator]
|
|
public class ConfigGenerator : ICodeGenerator
|
|
{
|
|
public void Execute(GeneratorContext context)
|
|
{
|
|
var configs = TypeCache.GetTypesWithAttribute<Config>();
|
|
|
|
var configsCode = "";
|
|
var configAddCode = "";
|
|
var configReferencesCode = "";
|
|
var configReferencesUsingsCode = "";
|
|
var configOfConfigsCode = "";
|
|
|
|
foreach (var cfg in configs)
|
|
{
|
|
var configFields = "";
|
|
var configUsings = "";
|
|
|
|
var mem = cfg.GetFields();
|
|
var members = mem.Where(m => m.HasAttribute<ToConfig>()).ToList();
|
|
foreach (var m in members)
|
|
{
|
|
configUsings += $"using {m.FieldType.Namespace};\n";
|
|
configFields += $"public {m.FieldType.FullName} {m.Name};\n";
|
|
}
|
|
|
|
var attribute = cfg.GetAttribute<Config>();
|
|
|
|
configUsings += @"
|
|
using UnityEngine;
|
|
using UnityEngine.AddressableAssets;
|
|
";
|
|
var configCode = $@"
|
|
#pragma warning disable CS0105
|
|
{configUsings}
|
|
namespace {cfg.Namespace}{{
|
|
#pragma warning restore CS0105
|
|
[CreateAssetMenu(fileName = ""{cfg.Name}Config"", menuName = ""{attribute.MenuName}"")]
|
|
public class {cfg.Name}Config : ScriptableObject
|
|
{{
|
|
{configFields}
|
|
}}
|
|
}}
|
|
";
|
|
context.AddCode($"{cfg.Name}Config.Generated.cs", configCode);
|
|
|
|
configReferencesUsingsCode += $"using {cfg.Namespace};\n";
|
|
|
|
if (attribute.Multiple)
|
|
{
|
|
configReferencesCode += $"public string {cfg.Name};\n";
|
|
configAddCode += $@"
|
|
_multipleConfigReferences.Add(typeof({cfg.FullName}Config), systemConfigsReferences.{cfg.Name});
|
|
";
|
|
}
|
|
else
|
|
{
|
|
configReferencesCode += $"public AssetReference {cfg.Name};\n";
|
|
configAddCode += $@"
|
|
_singleConfigReferences.Add(typeof({cfg.FullName}Config), systemConfigsReferences.{cfg.Name});
|
|
";
|
|
}
|
|
}
|
|
configsCode += $@"
|
|
#pragma warning disable CS0105
|
|
{configReferencesUsingsCode}
|
|
using UnityEngine;
|
|
#pragma warning restore CS0105
|
|
|
|
namespace Code.Infrastructure.Configs
|
|
{{
|
|
|
|
public partial class ConfigLocator
|
|
{{
|
|
partial void LoadConfigs()
|
|
{{
|
|
SystemConfigsReferences systemConfigsReferences = Resources.Load<SystemConfigsReferences>(""SystemConfigsReferences"");
|
|
{configAddCode}
|
|
//_singleConfigReferences.Add(typeof(ScenesAssetReferences), systemConfigsReferences.scenesAssetReferences);
|
|
}}
|
|
}}
|
|
}}
|
|
";
|
|
context.AddCode($"ConfigLocator.Generated.cs", configsCode);
|
|
|
|
configOfConfigsCode += $@"
|
|
#pragma warning disable CS0105
|
|
{configReferencesUsingsCode}
|
|
using UnityEngine.AddressableAssets;
|
|
#pragma warning restore CS0105
|
|
|
|
namespace Code.Infrastructure.Configs{{
|
|
public partial class SystemConfigsReferences
|
|
{{
|
|
{configReferencesCode}
|
|
}}
|
|
}}
|
|
";
|
|
context.AddCode($"SystemConfigsReferences.Generated.cs", configOfConfigsCode);
|
|
}
|
|
}
|
|
}
|
|
#endif |