Net.Like.Xue.Tokyo/Assets/Plugins/Character Controller Pro/Implementation/Scripts/Character/States/CharacterState.cs

162 lines
5.2 KiB
C#

using System.Collections.Generic;
using UnityEngine;
using Lightbug.CharacterControllerPro.Core;
using Lightbug.Utilities;
namespace Lightbug.CharacterControllerPro.Implementation
{
/// <summary>
/// This class represents a state, that is, a basic element used by the character state controller (finite state machine).
/// </summary>
public abstract class CharacterState : MonoBehaviour, IUpdatable
{
[SerializeField]
bool overrideAnimatorController = true;
[Condition("overrideAnimatorController", ConditionAttribute.ConditionType.IsTrue)]
[SerializeField]
RuntimeAnimatorController runtimeAnimatorController = null;
/// <summary>
/// Gets the hash value (Animator) associated with this state, based on its name.
/// </summary>
public int StateNameHash { get; private set; }
/// <summary>
/// Gets the state runtime animator controller.
/// </summary>
public RuntimeAnimatorController RuntimeAnimatorController => runtimeAnimatorController;
public bool OverrideAnimatorController => overrideAnimatorController;
/// <summary>
/// Gets the CharacterActor component of the gameObject.
/// </summary>
public CharacterActor CharacterActor { get; private set; }
/// <summary>
/// Gets the CharacterBrain component of the gameObject.
/// </summary>
// public CharacterBrain CharacterBrain{ get; private set; }
CharacterBrain CharacterBrain = null;
/// <summary>
/// Gets the current brain actions CharacterBrain component of the gameObject.
/// </summary>
public CharacterActions CharacterActions
{
get
{
return CharacterBrain == null ? new CharacterActions() : CharacterBrain.CharacterActions;
}
}
/// <summary>
/// Gets the CharacterStateController component of the gameObject.
/// </summary>
public CharacterStateController CharacterStateController { get; private set; }
protected virtual void Awake()
{
CharacterActor = this.GetComponentInBranch<CharacterActor>();
CharacterStateController = this.GetComponentInBranch<CharacterActor, CharacterStateController>();
CharacterBrain = this.GetComponentInBranch<CharacterActor, CharacterBrain>();
}
protected virtual void Start()
{
StateNameHash = Animator.StringToHash(this.GetType().Name);
}
/// <summary>
/// This method runs once when the state has entered the state machine.
/// </summary>
public virtual void EnterBehaviour(float dt, CharacterState fromState)
{
}
/// <summary>
/// This methods runs before the main Update method.
/// </summary>
public virtual void PreUpdateBehaviour(float dt)
{
}
/// <summary>
/// This method runs frame by frame, and should be implemented by the derived state class.
/// </summary>
public abstract void UpdateBehaviour(float dt);
/// <summary>
/// This methods runs after the main Update method.
/// </summary>
public virtual void PostUpdateBehaviour(float dt)
{
}
/// <summary>
/// This methods runs just before the character physics simulation.
/// </summary>
public virtual void PreCharacterSimulation(float dt)
{
}
/// <summary>
/// This methods runs after the character physics simulation.
/// </summary>
public virtual void PostCharacterSimulation(float dt)
{
}
/// <summary>
/// This method runs once when the state has exited the state machine.
/// </summary>
public virtual void ExitBehaviour(float dt, CharacterState toState)
{
}
/// <summary>
/// Checks if the required conditions to exit this state are true. If so it returns the desired state (null otherwise). After this the state machine will
/// proceed to evaluate the "enter transition" condition on the target state.
/// </summary>
public virtual void CheckExitTransition()
{
}
/// <summary>
/// Checks if the required conditions to enter this state are true. If so the state machine will automatically change the current state to the desired one.
/// </summary>
public virtual bool CheckEnterTransition(CharacterState fromState)
{
return true;
}
/// <summary>
/// This methods runs after getting all the ik positions, rotations and their respective weights. Use it to modify the ik data of the humanoid rig.
/// </summary>
public virtual void UpdateIK(int layerIndex)
{
}
public virtual string GetInfo()
{
return "";
}
/// <summary>
/// Checks if the Animator component associated with the character is "valid" or not.
/// </summary>
/// <returns>True if the Animator is valid, false otherwise.</returns>
public bool IsAnimatorValid() => CharacterActor.IsAnimatorValid();
}
}