using System.Linq; using Unity.VisualScripting; using UnityCodeGen; using UnityEditor; using UnityEngine; namespace Code.Infrastructure.Generators { [Generator] public class SceneLoaderGenerator : ICodeGenerator { public void Execute(GeneratorContext context) { var Enum = TypeCache.GetTypesWithAttribute(); var loaderCode = ""; var dictionaryCode = ""; var interfacesCode = ""; var interfacesUsingsCode = $@" using Code.Infrastructure.EventBus; "; foreach (var en in Enum) { if (!en.IsEnum) return; var members = en.GetFields(); foreach (var member in members) { if(member.FieldType.FullName != en.FullName) continue; interfacesCode += $@" public interface IOn{member.Name}SceneLoadedHandler : IGlobalSubscriber {{ void On{member.Name}SceneLoaded(); }} "; dictionaryCode += $@" _scenesActions.Add(SceneId.{member.Name},() => _eventBus.RaiseEvent(h=> h.On{member.Name}SceneLoaded())); "; } } loaderCode = $@" #pragma warning disable CS0105 {interfacesUsingsCode} #pragma warning restore CS0105 namespace Code.Infrastructure.SceneLoader {{ public partial class SceneLoader{{ partial void SetupScenesInfo(){{ {dictionaryCode} }} }} {interfacesCode} }} "; context.AddCode($"SceneLoader.Generated.cs", loaderCode); // var configsCode = ""; // var configCode = ""; // var configUsings = ""; // var configFields = ""; // var configAddCode = ""; // var configReferencesCode = ""; // var configReferencesUsingsCode = ""; // var configOfConfigsCode = ""; // // foreach (var cfg in configs) // { // 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; // "; // configCode = $@" // {configUsings} // namespace {cfg.Namespace}{{ // [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}), systemConfigsReferences.{cfg.Name}); // "; // } // else // { // configReferencesCode += $"public AssetReference {cfg.Name};\n"; // configAddCode += $@" // _singleConfigReferences.Add(typeof({cfg.FullName}Config), systemConfigsReferences.{cfg.Name}); // "; // } // } // configsCode += $@" // {configReferencesUsingsCode} // using UnityEngine; // // 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 += $@" // {configReferencesUsingsCode} // using UnityEngine.AddressableAssets; // // namespace Code.Infrastructure.Configs{{ // public partial class SystemConfigsReferences // {{ // {configReferencesCode} // }} // }} // "; // context.AddCode($"SystemConfigsReferences.Generated.cs", configOfConfigsCode); } } }