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

May 17, 2026 (1mo ago)

오늘 할 것

  • 움직임
    • Sprint 적용
  • 카메라
    • Walk/Run/Sprint 카메라 화각 처리
    • 회전 각도 조정하기
  • 설계
    • 특수 동작 추가 기반 다지기(Action.xlsx, ActionAnimationData.xlsx, Moveset.xlsx)
    • 구르기 회피 추가

메모

어제 너무 많은 시간을 리팩토링에 쏟았음(사실 주말답게 하다말다 반복해서 그런건 비밀) 어쨌든 리팩토링됐고 다시 불필요한 것들 싹 날리고 Free 상태 walk/run만 가능한 상태 sprint 넣고, strafe도 간단하게 넣고 마무리

오늘은 카메라 화각 처리랑 구르기/회피 넣어야 함

액션 설계

핵심 관계

  • Input
    • Moveset
      • ActionData
        • ActionAnimationData
          • ActionWindowData

1. Moveset: 지금 이 캐릭터가 어떤 입력으로 어떤 액션을 쓰는가

예를 들어 Dodge 입력이 들어왔을 때:

캐릭터: Player무기: None자세: Normal입력: Dodge방향: Back=> ActionTid = Backstep
캐릭터: Player무기: GreatSword자세: Combat입력: Dodge방향: Back=> ActionTid = HeavyBackstep

즉 Moveset은 입력과 상황을 ActionTid로 바꾸는 테이블 Moveset은 ActionData를 참조하고, ActionData는 Moveset을 몰라야 함

2. ActionData: 액션 자체의 규칙

Tid: 10021Name: DodgeRollActionType: DodgeCategory: MovementStaminaCost: 12MinRequiredStamina: 1Cooldown: 0.2bLocksMovement: truebUsesRootMotion: truebCanBeInterrupted: false

여기에는 애니메이션 파일을 직접 넣지 않는 게 좋음. 같은 DodgeRoll 액션도 방향, 무기, 자세에 따라 다른 애니메이션을 쓸 수 있기 때문

3. ActionAnimationData: 이 액션을 어떤 애니메이션으로 재생할 것인가

Tid: 20021ActionTid: 10021Direction: ForwardStance: NormalMontage: AM_Dodge_FPlayRate: 1.0bRootMotion: trueTid: 20022ActionTid: 10021Direction: BackwardStance: NormalMontage: AM_Dodge_BPlayRate: 1.0bRootMotion: true

구르기 액션은 하나지만, 방향별 애니메이션은 여러 개일 수 있음. ActionData 1개 → ActionAnimationData 여러 개

4. ActionWindowData: 액션 중 특정 시간대에 발생하는 윈도우

무적 상태는 “언제부터 언제까지 피격 판정을 무시할지”라는 게임플레이 규칙. 동시에 애니메이션 타이밍과 강하게 결합하므로 별도 window 테이블로 빼는 게 좋음

Tid: 30001ActionAnimationTid: 20021WindowType: InvincibleStartTime: 0.12EndTime: 0.42Tid: 30002ActionAnimationTid: 20021WindowType: MovementLockStartTime: 0.0EndTime: 0.55Tid: 30003ActionAnimationTid: 20021WindowType: CancelStartTime: 0.45EndTime: 0.65

5. 전투 상태 관리

EPlayerCombatStance{    Relaxed,   // 비전투    Combat     // 전투 자세}EPlayerGuardState{    None,    Guarding,    GuardBroken,    ParryWindow}EPlayerActionState{    None,    Dodging,    Attacking,    Guarding,    HitReact,    Dead}EPlayerMovesetType{    Unarmed,    SwordShield,    GreatSword...}

위와 같이 상태를 분리하면 아래와 같이 명확하게 표현이 가능해짐

  • CombatStance = Combat
  • ActionState = Guarding
  • GuardState = Guarding
  • MovesetType = SwordShield

또 다른 예시로 비무장 상태 백스텝 입력이 들어오면:

  • Input: Dodge
  • Current Moveset: Player_Unarmed
  • MoveInputDirection: Backward → Moveset에서 Dodge 입력에 해당하는 ActionTid 찾음 → ActionData에서 스태미너/쿨다운/락 검사 → ActionAnimationData에서 방향에 맞는 Dodge montage 선택 → ActionWindowData에서 Invincible window 등록 → Montage 재생 → Window 시간에 맞춰 CharacterState = Invincible → Montage 끝나면 ActionState = None