#if UNITY_EDITOR using System.Linq; using Unity.VisualScripting; using UnityCodeGen; using UnityEditor; namespace Code.Infrastructure.Generators { [Generator] public class StateMachineGenerator : ICodeGenerator { public void Execute(GeneratorContext context) { GenerateStates(context); GenerateStateMachine(context); } private void GenerateStateMachine(GeneratorContext context) { var stateMachines = TypeCache.GetTypesWithAttribute(); foreach (var sm in stateMachines) { var attribute = sm.GetAttribute(); var states = TypeCache.GetTypesWithAttribute() .Where(st => st.GetAttribute().StateMachineContext.FullName == attribute.StateMachineContextType.FullName); var statesCode = ""; var statesNamespacesCode = ""; foreach (var st in states) { statesNamespacesCode += $@" using {st.Namespace}; "; statesCode += $@" var state{st.Name} = new {st.Name}(StateMachineContext); States.Add(state{st.Name}.MyState, state{st.Name}); "; } var stateMachineCode = $@" // #pragma warning disable CS0105 using Code.Infrastructure.StateMachine; {statesNamespacesCode} #pragma warning restore CS0105 namespace {sm.Namespace} {{ public partial class {sm.Name} : AbstractStateMachine<{attribute.StateMachineEnumType.FullName},{attribute.StateMachineContextType.FullName}> {{ public {sm.Name}({attribute.StateMachineContextType.FullName} context) : base(context) {{ {statesCode} }} }} }} "; context.AddCode($"{sm.FullName}.Generated.cs", stateMachineCode); } } private void GenerateStates(GeneratorContext context) { var states = TypeCache.GetTypesWithAttribute(); foreach (var st in states) { var attribute = st.GetAttribute(); var genetics = ""; if (!attribute.ManualInherit) genetics = $@" : BaseState<{attribute.StateEnum.FullName}, {attribute.StateMachineContext.FullName}>"; var statesCode = $@" // retard-generated using Code.Infrastructure.StateMachine; namespace {st.Namespace} {{ public partial class {st.Name} {genetics} {{ }} }} "; context.AddCode($"{st.FullName}.Generated.cs", statesCode); } } } } #endif