///
/// 캐릭터가 지을 수 있는 몸짓.
///
/// 와 일부러 분리했다. ClimbState 는 "몸이 어디에 있는가"이고
/// 이쪽은 "어떻게 보이는가"다. 서 있는 상태 하나에도 그냥 서기 / 걸터앉기 / 눕기가
/// 있으므로 일대일로 묶으면 이동 로직에 표현이 섞여 들어간다.
///
public enum CharacterMotionKind
{
Idle, // 서서 대기
Fall, // 떨어지는 중
Walk, // 걷는 중
Jump, // 다른 발판으로 뛰어오르는 중
Sit, // 발판에 걸터앉기
LieDown, // 눕기
}
///
/// 캐릭터 몸짓을 재생하는 계층의 창구.
///
/// 왜 인터페이스로 두는가:
/// 지금은 Unity Animator + Humanoid FBX 클립으로 간다. 전환(CrossFade)과 레이어를
/// 공짜로 얻을 수 있어서다. 하지만 나중에 "사용자가 자기 모션(.vrma)을 넣게 하고 싶다"가
/// 되면 VRM Animation 로더를 하나 더 붙이게 된다. 그때 이 인터페이스만 다시 구현하면
/// WindowClimber 와 상위 로직은 손대지 않는다. IChatBackend 와 같은 이유다.
///
/// 참고: .vrma 는 Vrm10Runtime.VrmAnimation 하나에 통째로 물리는 구조라
/// 크로스페이드가 없다. 그쪽으로 갈 때는 전환 처리를 구현체가 직접 해야 한다.
///
public interface ICharacterMotion
{
/// 재생할 준비가 됐는지. 클립이나 컨트롤러가 없으면 false.
bool IsReady { get; }
/// 해당 몸짓으로 넘어간다. 같은 것을 다시 줘도 안전하다.
void Play(CharacterMotionKind kind);
}