148 lines
4.9 KiB
C#
148 lines
4.9 KiB
C#
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<SceneIdEnum>();
|
|
|
|
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<IOn{member.Name}SceneLoadedHandler>(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<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;
|
|
// ";
|
|
// 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>(""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);
|
|
}
|
|
}
|
|
} |