#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(); 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()).ToList(); foreach (var m in members) { configUsings += $"using {m.FieldType.Namespace};\n"; configFields += $"public {m.FieldType.FullName} {m.Name};\n"; } var attribute = cfg.GetAttribute(); 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""); {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