using Invector.vCharacterController.AI.FSMBehaviour; using UnityEngine; namespace DemonBoss.Summoner { /// /// FSM State Action that triggers minion spawning /// Calls SummonerAI.StartSpawning() on state enter /// [CreateAssetMenu(menuName = "Invector/FSM/Actions/Summoner/Spawn Minions")] public class SA_SpawnMinions : vStateAction { public override string categoryName => "Summoner"; public override string defaultName => "Spawn Minions"; [Header("Animation")] [Tooltip("Animator trigger parameter for summoning animation")] public string summonTriggerName = "Summon"; [Tooltip("Animator bool for summoning state")] public string summoningBoolName = "IsSummoning"; [Header("Behavior")] [Tooltip("Wait for spawning to complete before allowing state exit")] public bool waitForCompletion = true; [Header("Debug")] [Tooltip("Enable debug logging")] public bool enableDebug = false; private SummonerAI summoner; private Animator animator; private bool hasStartedSpawning = false; public override void DoAction(vIFSMBehaviourController fsmBehaviour, vFSMComponentExecutionType executionType = vFSMComponentExecutionType.OnStateUpdate) { if (executionType == vFSMComponentExecutionType.OnStateEnter) { OnEnter(fsmBehaviour); } else if (executionType == vFSMComponentExecutionType.OnStateUpdate) { OnUpdate(fsmBehaviour); } else if (executionType == vFSMComponentExecutionType.OnStateExit) { OnExit(fsmBehaviour); } } private void OnEnter(vIFSMBehaviourController fsmBehaviour) { summoner = fsmBehaviour.GetComponent(); animator = fsmBehaviour.GetComponent(); if (summoner == null) { Debug.LogError("[SA_SpawnMinions] No SummonerAI component found!"); return; } // Trigger animation if (animator != null) { if (!string.IsNullOrEmpty(summonTriggerName)) { animator.SetTrigger(summonTriggerName); } if (!string.IsNullOrEmpty(summoningBoolName)) { animator.SetBool(summoningBoolName, true); } } // Start spawning minions summoner.StartSpawning(); hasStartedSpawning = true; if (enableDebug) Debug.Log("[SA_SpawnMinions] Started spawning minions"); } private void OnUpdate(vIFSMBehaviourController fsmBehaviour) { // If waiting for completion, keep state active until spawning is done if (waitForCompletion && summoner != null && summoner.IsSpawning) { // State will continue until spawning is complete if (enableDebug && Time.frameCount % 60 == 0) // Log once per second { Debug.Log("[SA_SpawnMinions] Waiting for spawning to complete..."); } } } private void OnExit(vIFSMBehaviourController fsmBehaviour) { // Reset animation bool if (animator != null && !string.IsNullOrEmpty(summoningBoolName)) { animator.SetBool(summoningBoolName, false); } // If spawning was interrupted, stop it if (summoner != null && summoner.IsSpawning) { summoner.StopSpawning(); if (enableDebug) Debug.Log("[SA_SpawnMinions] Spawning interrupted on state exit"); } hasStartedSpawning = false; if (enableDebug) Debug.Log("[SA_SpawnMinions] State exited"); } /// /// Check if spawning is complete (for FSM decision nodes) /// public bool IsSpawningComplete() { if (summoner == null) return true; return hasStartedSpawning && !summoner.IsSpawning; } } }