오늘 할 것
- 움직임
- Sprint 적용
- 카메라
- Walk/Run/Sprint 카메라 화각 처리
- 회전 각도 조정하기
- 설계
- 특수 동작 추가 기반 다지기(Action.xlsx, ActionAnimationData.xlsx, Moveset.xlsx)
- 구르기 회피 추가
메모
어제 너무 많은 시간을 리팩토링에 쏟았음(사실 주말답게 하다말다 반복해서 그런건 비밀) 어쨌든 리팩토링됐고 다시 불필요한 것들 싹 날리고 Free 상태 walk/run만 가능한 상태 sprint 넣고, strafe도 간단하게 넣고 마무리
오늘은 카메라 화각 처리랑 구르기/회피 넣어야 함
액션 설계
핵심 관계
- Input
- Moveset
- ActionData
- ActionAnimationData
- ActionWindowData
- ActionAnimationData
- ActionData
- Moveset
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.655. 전투 상태 관리
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