// Animancer // https://kybernetik.com.au/animancer // Copyright 2018-2024 Kybernetik //
#pragma warning disable CS0649 // Field is never assigned to, and will always have its default value.
using UnityEngine;
namespace Animancer.Samples.Basics
{
///
/// Implements the same behaviour as
/// using s.
///
///
///
/// Sample:
///
/// Library Basics
///
///
/// https://kybernetik.com.au/animancer/api/Animancer.Samples.Basics/LibraryCharacterAnimations
///
[AddComponentMenu(Strings.SamplesMenuPrefix + "Basics - Library Character Animations")]
[AnimancerHelpUrl(typeof(LibraryCharacterAnimations))]
public class LibraryCharacterAnimations : MonoBehaviour
{
/************************************************************************************************************************/
// This script is almost identical to BasicCharacterAnimations, with a few differences:
// - It uses TransitionAssets instead of ClipTransitions.
// - It assigns the Action state's End Event after playing it instead of on startup.
/************************************************************************************************************************/
[SerializeField] private AnimancerComponent _Animancer;
[SerializeField] private TransitionAsset _Idle;
[SerializeField] private TransitionAsset _Move;
[SerializeField] private TransitionAsset _Action;
private State _CurrentState;
private enum State
{
NotActing,// Idle and Move can be interrupted.
Acting,// Action can only be interrupted by itself.
}
/************************************************************************************************************************/
protected virtual void Update()
{
switch (_CurrentState)
{
case State.NotActing:
UpdateMovement();
UpdateAction();
break;
case State.Acting:
UpdateAction();
break;
}
}
/************************************************************************************************************************/
private void UpdateMovement()
{
_CurrentState = State.NotActing;
float forward = SampleInput.WASD.y;
if (forward > 0)
{
_Animancer.Play(_Move);
}
else
{
_Animancer.Play(_Idle);
}
}
/************************************************************************************************************************/
private void UpdateAction()
{
if (SampleInput.LeftMouseUp)
{
_CurrentState = State.Acting;
// _Action is an asset that could be shared by multiple different characters
// as well as instances of the same character so we can't set up the events
// in the transition because the characters would conflict with each other.
// Instead, we add events to the state so each character's events are separate.
AnimancerState state = _Animancer.Play(_Action);
state.Events(this).OnEnd ??= UpdateMovement;
}
}
/************************************************************************************************************************/
}
}