using System; using UnityEngine; namespace Unity.BossRoom.Gameplay.GameplayObjects.AnimationCallbacks { /// /// This is attached to each layer in the animator's state machines that needs to be able /// to trigger special effects (particles and sound effects). When an animation node begins or ends, this little /// script routes that info to an associated AnimatorTriggeredSpecialFX component, which is responsible for /// playing the sounds/particles appropriate for that character. /// /// /// /// While it's possible to attach this script to individual state-machine nodes, it's more efficient to attach /// this script to each Layer in the animator controller -- it will get called for all nodes in that layer. /// /// Note that we get a list of ALL the AnimatorTriggeredSpecialFX attached to the Animator's game object, and check /// to see which one is enabled. We need this trick for our multi-character graphics prefab: it has multiple /// AnimatorTriggeredSpecialFX for each of the different character classes, and only the relevant one will be /// enabled at any given time. /// public class AnimatorNodeHook : StateMachineBehaviour { private AnimatorTriggeredSpecialFX[] m_CachedTriggerRefs; override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { if (m_CachedTriggerRefs == null) m_CachedTriggerRefs = animator.GetComponentsInChildren(); foreach (var fxController in m_CachedTriggerRefs) { if (fxController && fxController.enabled) { fxController.OnStateEnter(animator, stateInfo, layerIndex); } } } override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { if (m_CachedTriggerRefs == null) m_CachedTriggerRefs = animator.GetComponentsInChildren(); foreach (var fxController in m_CachedTriggerRefs) { if (fxController && fxController.enabled) { fxController.OnStateExit(animator, stateInfo, layerIndex); } } } } }