You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

53 lines
2.4 KiB
C#

using System;
using UnityEngine;
namespace Unity.BossRoom.Gameplay.GameplayObjects.AnimationCallbacks
{
/// <summary>
/// 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.
/// </summary>
///
/// <remarks>
/// 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.
/// </remarks>
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<AnimatorTriggeredSpecialFX>();
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<AnimatorTriggeredSpecialFX>();
foreach (var fxController in m_CachedTriggerRefs)
{
if (fxController && fxController.enabled)
{
fxController.OnStateExit(animator, stateInfo, layerIndex);
}
}
}
}
}