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.
CrowdControl/Assets/Plugins/Animancer/Utilities/State Machine/StateBehaviour.cs

74 lines
2.8 KiB
C#

// Animancer // Copyright 2020 Kybernetik //
using UnityEngine;
namespace Animancer.FSM
{
/// <summary>
/// Base class for <see cref="MonoBehaviour"/> states to be used in a <see cref="StateMachine{TState}"/>.
/// </summary>
[HelpURL(StateExtensions.APIDocumentationURL + "StateBehaviour_1")]
public abstract class StateBehaviour<TState> : MonoBehaviour, IState<TState>
where TState : StateBehaviour<TState>
{
/************************************************************************************************************************/
/// <summary>
/// Determines whether the <see cref="StateMachine{TState}"/> can enter this state. Always returns true
/// unless overridden.
/// </summary>
public virtual bool CanEnterState(TState previousState) { return true; }
/// <summary>
/// Determines whether the <see cref="StateMachine{TState}"/> can exit this state. Always returns true
/// unless overridden.
/// </summary>
public virtual bool CanExitState(TState nextState) { return true; }
/************************************************************************************************************************/
/// <summary>
/// Asserts that this component is not already enabled, then enable it.
/// </summary>
public virtual void OnEnterState()
{
Debug.Assert(!enabled, this + " was already enabled when entering its state", this);
enabled = true;
}
/************************************************************************************************************************/
/// <summary>
/// Asserts that this component is not already disabled, then disable it.
/// </summary>
public virtual void OnExitState()
{
if (this == null)
return;
Debug.Assert(enabled, this + " was already disabled when exiting its state", this);
enabled = false;
}
/************************************************************************************************************************/
#if UNITY_EDITOR
/// <summary>[Editor-Only]
/// Called by the Unity Editor in Edit Mode whenever an instance of this script is loaded or a value is changed
/// in the Inspector.
/// <para></para>
/// States start disabled and only the current state gets enabled at runtime.
/// </summary>
protected virtual void OnValidate()
{
if (UnityEditor.EditorApplication.isPlayingOrWillChangePlaymode)
return;
enabled = false;
}
#endif
/************************************************************************************************************************/
}
}