프로젝트 일지/Unity

[Unity/TIL] 개인 2DMetaverse 개발 일지 (1)

톰마토 2025. 2. 19. 22:23

복잡한 애니메이션 조건 분류 : Sub-State Machine, Blend Tree 사용해서 해결

캐릭터 애니메이션을 Idle, Move 각각 네 방향으로 구현하려니 애니메이션 전환을 어떻게 해줘야 할지 고민이 됐다. 움직이고 있는지를 의미하는 IsMoving 파라미터와 방향을 의미하는 Direction(0~3) 파라미터로 구분해줬다. 점점 transition 화살표만 늘어나고... 생각처럼 잘 되지 않았다.

기존 방식...

모든 방향과 이동 상태가 전환이 서로 되도록 해결하려면 이게 다가 아니고 make transition을 모든 애니메이션간 이어줘야 한다. (;;;)


코드 상에서 InputSystem에서부터 손 쓸 방법이 없을까 고민하게 되었다. 하지만 InputSystem 자체도 이해가 부족하니 생각하기 어려웠다.

튜터님께 여쭤봤다가 InputSystem이 누적된 힘의 값을 주는 것이 아니고, Vector2에 해당하는 방향에 대한 값만 전달해주고 있다는 것을 알게 되었다. 그리고 결정적으로 Sub-State MachineBlend Tree를 배웠다.

  1. Sub-State Machine으로 큰 조건을 분류했다. => IsMoving 기준으로 Idle, Move 구분
  2. Blend Tree로 InputSystem에서 받는 Vector2 값을 그대로 방향으로 사용

Idle과 Move State Machine을 따로 만들고
Idle, Move 내부에는 BlendTree를 만들었다
Move BlendTree 모습. Idle도 동일함.

BlendTree에 MoveX, MoveY값을 넣어준다. 이 값들은 InputSystem에서 알려준 방향값 그대로를 넣어주는 것이다. 그럼 BlendTree에서 들어온 Parameter 값을 토대로 각 방향의 애니메이션을 실행시켜준다. make transition으로 방향간 전환을 모두 이어주는 방식보다 훨씬 간편했다.

2D 탑다운 맵에서 캐릭터보다 위에 그려져야 하는 부분 처리

맵을 만들다가 캐릭터가 벽 뒤쪽에서 이동할 때 벽을 밟고 걸어다니니까 입체감&몰입감이 확 사라지는 일이 발생했다.

입체감 무시

몸 위로 보이는 것과 그렇지 않은것들은 어떻게 제작해야할까 고민했다. 처음에는 Collision맵에 벽도 막아서 해결할 수 있을거라고 생각했지만, 맵이 그렇게 단순하지 않았다! 

 

강의에서 맵에 계층을 줘서 만들어서 나도 Floor, BackDesign, ForeDesign, Collision으로 나눠 만들고 있었다. 이걸 활용해서!! 캐릭터보다 레이어 Order가 높은 맵을 따로 찍어주게 되었다.

ForeWall에는 플레이어를 가려야 하는 맵을 그려줬다.
벽 뒤에 가려져야 하는 부분이 만들어졌다.

 

TMP 한글 깨짐

한글 지원 되는 폰트로 Font Asset 을 만들어서 쓰면 안깨진다고 해서 따라해봤는데도 안됐다. 

TMP로 쓸 수 있는 Font Asset 만들기

만든 TMP 에셋에서 Generation Settings를 조금 수정해주니 해결됐다. 

Atlas Population Mode를 Dynamic으로, Sampling Point Size는 작게, Atlas Width/Height는 2048 이상으로 하니 됐음. 

 

프로퍼티와 필드 혼용 문제

갑자기 되던 게 안되는..흔한(ㅎ) 버그가 발생했다.

디버깅해보니 미니게임이 실행 중인지를 판단하는 데에 사용하는  IsRunning이 항상 false로 들어왔다. isRunning 변수를 바깥에서 get하고 싶어서 IsRunning 프로퍼티를 급하게 추가했더니 프로퍼티의 getter에 "get => isRunning"을 빼먹은 것이다... 다른 곳에서 이 프로퍼티를 사용할 때 항상 false였기 때문에 잘못 작동한 것이다.

wow 전에 팀플에서도 있었던 일인데, 나에게도 일어났다!!! 항상 조심해야겠다.

수정 전)잘못된 사용 모습
수정된 코드

728x90