82 lines
3.1 KiB
C#
82 lines
3.1 KiB
C#
// 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.AnimatorControllers.GameKit
|
|
{
|
|
/// <summary>
|
|
/// A centralised group of references to the common parts of a character and a state machine for their actions.
|
|
/// </summary>
|
|
///
|
|
/// <remarks>
|
|
/// <strong>Sample:</strong>
|
|
/// <see href="https://kybernetik.com.au/animancer/docs/samples/animator-controllers/3d-game-kit">
|
|
/// 3D Game Kit</see>
|
|
/// </remarks>
|
|
///
|
|
/// https://kybernetik.com.au/animancer/api/Animancer.Samples.AnimatorControllers.GameKit/Character
|
|
///
|
|
[AddComponentMenu(Strings.SamplesMenuPrefix + "Game Kit - Character")]
|
|
[AnimancerHelpUrl(typeof(Character))]
|
|
public class Character : MonoBehaviour
|
|
{
|
|
/************************************************************************************************************************/
|
|
|
|
[SerializeField]
|
|
private AnimancerComponent _Animancer;
|
|
public AnimancerComponent Animancer => _Animancer;
|
|
|
|
[SerializeField]
|
|
private CharacterMovement _Movement;
|
|
public CharacterMovement Movement => _Movement;
|
|
|
|
[SerializeField]
|
|
private CharacterParameters _Parameters;
|
|
public CharacterParameters Parameters => _Parameters;
|
|
|
|
/************************************************************************************************************************/
|
|
|
|
[SerializeField]
|
|
private CharacterState.StateMachine _StateMachine;
|
|
public CharacterState.StateMachine StateMachine => _StateMachine;
|
|
|
|
protected virtual void Awake()
|
|
{
|
|
StateMachine.InitializeAfterDeserialize();
|
|
}
|
|
|
|
/************************************************************************************************************************/
|
|
|
|
/// <summary>
|
|
/// Check if this <see cref="Character"/> should enter the Idle, Locomotion, or Airborne state depending on
|
|
/// whether it is grounded and the movement input from the <see cref="Brain"/>.
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// We could add some null checks to this method to support characters that don't have all the standard states,
|
|
/// such as a character that can't move or a flying character that never lands.
|
|
/// </remarks>
|
|
public bool CheckMotionState()
|
|
{
|
|
CharacterState state;
|
|
if (Movement.IsGrounded)
|
|
{
|
|
state = Parameters.MovementDirection == Vector3.zero && Parameters.ForwardSpeed < 0.1f
|
|
? StateMachine.DefaultState
|
|
: StateMachine.Locomotion;
|
|
}
|
|
else
|
|
{
|
|
state = StateMachine.Airborne;
|
|
}
|
|
|
|
return
|
|
state != StateMachine.CurrentState &&
|
|
StateMachine.TryResetState(state);
|
|
}
|
|
|
|
/************************************************************************************************************************/
|
|
}
|
|
}
|