player의 Update() 에서 CurState.Update() 호출
CurState.Update()에서 각 상태마다 메소드 처리 하는데
독특한건 다음 state로 전환하는 방식
만약 공격 자세로 이행 가능한 상태(Idle같이)면 IdleState.Update() 에서 player.Attack() 호출
player.Attack()에서는 foreach(state in AttackStates){if(checkTransit)change(state)} 사용
다시말하면 공격 가능한 state면 AttackState에 등록된 애들을 매 프레임 체크해서 조건에 맞는 AttackState로 상태 전환함
굳이 복잡하게 왜이러느냐?
새로운 스킬이나 공격을 추가하거나 맞을때 상황에 따라 다르게 반응하거나 할 때
ScriptableObject로 작성한 AttackState()나 HitState() 같은걸 player의 List<>에 추가하기만 하면 됨
굳이 변수로 boolean 체크 새로하고 어쩌고 할 필요없이 각 상태가 자신들의 enter()조건을 담고있고
List 형식으로 카테고리화 시켜놨기때문에 player script에서는 아무런 수정 없이도 새로운 스킬을 넣을 수 있음
기존의 Attack()이나 Deffense가능한 타이밍하고 다른 완전 새로운 타이밍에만 조건을 판별해야되는 애들이 있으면
List<SpecialState> specialStates; 에다가 걔네만 넣어서 State들의 부모인 PlayerState.Update()에다가 넣어놓으면 매 프레임 조건 체크 가능
더불어서 상태정보가 애니메이터 패러미터에 종속되지 않기때문에 애니메이션 클립의 이벤트 메소드 사용을 지양하는 식의 구현에 편함
애니메이터 컨트롤러 위주의 상태전환이 블렌드가 자연스러워서 좋을 수 있긴 한데 나는 캐주얼하고 빠른 액션게임 좋아해서 뭐...
언뜻 보기엔, 극단적으로 강화시킨게 gas같은데 싹다 태그화 시켜서 어떤건 되고 어떤건 안되게 만들어버리니깐..