휴매너티 프로젝트 일지 - 9

May 16, 2026 (1d ago)

0 views

오늘 할 것

  • 가독성
    • BAPlayerCharacter 리팩토링하기
  • 움직임
    • Sprint Turn(Pivot) 적용
    • 메카닉스 프로젝트처럼 빙글빙글 도는 움직임 부드럽게 처리하기
    • Turnaround 시간 절반으로 줄이기
  • 카메라
    • Walk/Run/Sprint 카메라 화각 처리
    • 회전 각도 조정하기
  • 설계
    • 특수 동작 추가 기반 다지기(Action.xlsx, ActionAnimationData.xlsx, Moveset.xlsx)

큰 진행 계획

  1. 움직임 방향 보간 먼저 고정
    • WASD 입력 방향이 바로 적용돼서 snap처럼 꺾이는 문제부터 잡기
    • 입력 원본은 유지하되, 실제 이동/회전/애니메이션에 넘기는 방향을 별도 보간값으로 둠
    • 목표는 W -> D -> S -> A를 빠르게 눌러도 캐릭터가 각 방향으로 순간 전환하지 않고 원형으로 부드럽게 도는 상태
  2. Sprint Turn / Pivot 추가
    • 기본 방향 보간이 안정된 뒤, 스프린트 중 큰 각도 전환일 때만 pivot 판정을 넣음
    • 예: sprint 중 현재 방향과 입력 방향 차이가 120도 이상이면 pivot 상태 진입
    • 이건 일반 회전 보간과 분리해야 튜닝이 쉬움
  3. Turnaround 시간 절반 조정
    • pivot/turnaround의 실제 체감이 나온 뒤에 애니메이션 재생 속도나 데이터 값을 조정
    • 먼저 줄이면 회전 보간 수정 후 또 다시 튜닝하게 될 가능성이 큼
  4. 카메라
    • Walk/Run/Sprint별 FOV를 보간 처리
    • 회전 각도 조정은 움직임 보간이 끝난 뒤에 맞추는 게 좋음. 캐릭터 회전감이 바뀌면 카메라도 체감이 달라짐
  5. 특수 동작 데이터 기반
    • Action.xlsx, ActionAnimationData.xlsx, Moveset.xlsx는 마지막에 구조를 넓히는 쪽
    • 오늘 움직임 작업과 직접 엮이는 값이 있다면 최소한의 필드만 먼저 추가하고, 큰 설계 확장은 별도 커밋으로 분리

BAPlayerCharacter.cpp 정리

지금 문제점: 현재 BAPlayerCharacter는 .cpp 777줄, .h 258줄, 책임이 뒤죽박죽임

  • 캐릭터 생성/카메라 세팅
  • 데이터 테이블 초기화
  • 이동 상태 Walk/Run/Sprint
  • Free/Strafe 전환 정책
  • 스프린트 스태미나
  • 스프린트 진입 회전 락
  • Sprint Stop 요청
  • Turnaround 요청/재생 상태
  • AnimBP용 getter
  • HP/Stamina UI 알림

해결 방안

  1. 파일 책임별로 쪼개기
    • BAPlayerCharacter.cpp
      • BAPlayerCharacter.Locomotion.cpp
      • BAPlayerCharacter.Sprint.cpp
      • BAPlayerCharacter.Turnaround.cpp
      • BAPlayerCharacter.Stat.cpp
  2. 헤더 변수 덩어리들 구조체로 묶기(설정값과 런타임 상태 분리)
  3. b~~ 불리언 여러 개로 구성된 상태 조합 enum으로 합치기
  4. 주석으로 공개 API와 내부로직 분리
  5. 그 다음에 직접 컴포넌트로 분리하기
    • UBAPlayerLocomotionComponent
    • UBAPlayerSprintComponent
    • UBAPlayerTurnaroundComponent

1주차 셀프리뷰

프로젝트 리딩을 잘못했음을 깨달았다 지금 로코모션 부드럽게 깎고 있을 시간이 아닌데, 아직 핵심 경험인 전투는 아예 하나도 안돼있는데 이게 뭐하는건가 싶었음

PlayerCharacter.Movement 리펙토링

전력질주에 급정거, 방향전환을 넣으려고 하니까 캐릭터가 지랄발광하기 시작함. 더 문제인 것은 어디가 문제인지 예측이 불가능했음. 왜냐면 처음부터 공통 구조로 기능을 만든게 아니라 그 때 그 때 필요한 기능을 덧붙이는 방식으로 만들다보니 Walk, Run, Sprint가 동일 구조가 아니라 Sprint만 혼자 비대해지는 문제가 발생함.

그래서 아예 처음부터 돌아가서 Walk/Run/Sprint 상관없이 동일한 상태를 가지도록 재설계함

  • Locomotion Mode - Free/Strafe
  • Movement State - Walk/Run/Sprint
  • Movement Phase - None/Start/Loop/Stop/Turn