/// /// 캐릭터가 지을 수 있는 몸짓. /// /// 와 일부러 분리했다. 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); }