10 KiB
10 KiB
캐릭터 리소스 규칙 v1 — 영구 SOT
목적: EerieVillage 플레이어 캐릭터 자산 네이밍 표준 + 모션 종류 + 상태 전환 룰 영구 SOT 작성: 총괄PM (2026-05-07 BT5-Dev Hero1 신규 지시 수령 시점) PD 지시 근거: 2026-05-07 BT5-Dev Hero1 캐릭터 교체 지시 + 리소스 규칙 7종 직접 명세 + 이슈 1·2 결정 (공백 제거·death 8종 확장) 적용 범위: 플레이어 캐릭터(C1~) 전 자산 — 신규 캐릭터 추가 시 동일 표준 의무
1. 네이밍 표준
1.1 형식
<캐릭터번호>_<모션><프레임>.png
1.2 구성 요소
| 요소 | 표기 | 설명 |
|---|---|---|
| 캐릭터 번호 | C1·C2·C3... |
캐릭터 식별자. 1번부터 순차 증가 |
| 구분자 | _ (언더스코어) |
캐릭터 번호와 모션 사이 단일 구분자 |
| 모션 | <motion> (소문자, 공백 없음) |
본 문서 §2 모션 카탈로그 8종 중 1개 |
| 프레임 | 01·02...·08... |
2자리 zero-padded 정수. 연속 프레임만큼 |
| 확장자 | .png |
무손실 압축 + 알파 채널 지원 |
1.3 예시
C1_attack01.png— 캐릭터 1번 공격 모션 1프레임C1_combatidle04.png— 캐릭터 1번 전투 대기 4프레임 (공백 미허용)C2_resurrection01.png— 캐릭터 2번 부활 1프레임 (향후 추가)
1.4 금지 사항
- 공백 포함 (예:
C1_combat idle01.png) — Unity asset 일관성 + 파싱 안정성 - 대문자 모션 (예:
C1_Attack01.png) — 케이스 정합성 - 0 padding 누락 (예:
C1_attack1.png) — 정렬 안정성
2. 모션 카탈로그 (8종)
2.1 모션 정의
| # | 모션 키 | 한글 명 | 발동 조건 | Loop | 재생 시 다음 상태 |
|---|---|---|---|---|---|
| 1 | attack |
공격 | 자동 발동 (공격 사이클 도래) | non-loop | 마지막 공격 시간 갱신 → 5초 카운트다운 시작 |
| 2 | combatidle |
전투 대기 | 공격 후 정지 + 마지막 공격 < 5초 | loop | 마지막 공격 ≥ 5초 → idle 전환 |
| 3 | idle |
일반 대기 | 정지 + 마지막 공격 ≥ 5초 (또는 attack 미발동) | loop | run·attack·hit·jump·resurrection 트리거 시 전환 |
| 4 | hit |
피격 | 적 데미지 수신 | non-loop · 인터럽트 보호 | 종료 후 직전 상태 복귀 (idle/combatidle/run/jump) |
| 5 | jump |
점프 | 점프 입력 + 공중 상태 | static (1 frame) | 착지 시 idle 또는 run 전환 |
| 6 | resurrection |
부활 | death 종료 후 부활 게임 룰 충족 시 | non-loop | 종료 후 idle 전환 |
| 7 | run |
이동 | 이동 입력 + 지면 상태 | loop | 정지 시 마지막 공격 시간 기준 idle 또는 combatidle 전환 |
| 8 | death |
사망 | HP 0 도달 | non-loop | resurrection 가능 시 대기·불가 시 게임 오버 |
2.2 모션 매핑 (Hero1 — C1)
| 모션 | 프레임 수 | 파일명 범위 |
|---|---|---|
| attack | 8 | C1_attack01~08.png |
| combatidle | 4 | C1_combatidle01~04.png (rename 후) |
| death | 2 | C1_death01~02.png |
| hit | 2 | C1_hit01~02.png |
| idle | 4 | C1_idle01~04.png |
| jump | 1 | C1_jump01.png |
| resurrection | 8 | C1_resurrection01~08.png |
| run | 8 | C1_run01~08.png |
| 합계 | 37 | — |
3. 상태 전환 룰
3.1 핵심 메커니즘
3.1.1 idle ⇄ combatidle 5초 타이머
[run 또는 attack 종료] → 마지막 공격 시간 t_attack 갱신
[정지 상태 진입]
if (현재시각 - t_attack) < 5초:
→ combatidle (loop)
else:
→ idle (loop)
[combatidle loop 중 (현재시각 - t_attack) ≥ 5초 도달]
→ idle (loop) 전환
3.1.2 hit 인터럽트 보호 (PD 명세 핵심)
[hit 발동 중 추가 데미지 수신]
if hit.isPlaying == true:
→ 현 hit 애니메이션 끝까지 재생 (재시작 X)
else:
→ hit 애니메이션 재생 시작
Unity 구현 영역: Animator State에서 m_HasExitTime: 1 + m_ExitTime: 1 설정으로 자기 자신으로의 재진입 차단. 또는 Animator Behaviour StateMachineBehaviour.OnStateEnter에서 IsInTransition 체크.
Health.cs 영역: 데미지 수신 시 hit Trigger 호출 전 currentState == "hit" 검증 후 진입.
3.1.3 attack 자동 발동 사이클
BT7-Plan 확정안 = VS 순수형 자동 발동 (공격 버튼 제거). PlayerAttackTicker.cs 주기 타이머가 attack Trigger 호출.
3.1.4 death → resurrection 시퀀스
[HP 0 도달]
→ death 애니메이션 재생 (non-loop)
[death 애니메이션 종료]
→ 부활 룰 검증 (게임 룰 영역 — BT7-Plan 또는 별건)
if 부활 가능:
→ resurrection 애니메이션 재생 (non-loop) → idle 전환
else:
→ 게임 오버 (death 마지막 프레임 정지)
3.1.5 jump 단일 프레임 정합
[점프 입력]
→ jump 자세 표시 (1 frame static)
[공중 → 지면 착지]
→ 이동 입력 유무에 따라 idle/run 전환
낙하·착지 별도 모션 없음. 점프 자세 1프레임 유지.
3.2 상태 전환 다이어그램 (요약)
[run]
↑↓ (이동 입력)
[idle] ⇄ (5초 타이머) ⇄ [combatidle]
↑ ↑
└── (resurrection) ←────┘
↑
[death]
↑
(HP=0)
전 상태에서 발동 가능:
- [hit] (인터럽트 보호 — 재진입 차단)
- [attack] (자동 발동 사이클)
- [jump] (점프 입력 시)
4. Unity 자산 구조 표준
4.1 폴더 구조
Assets/Character/
├── Sprites/
│ ├── Hero1/ ← C1 (현 캐릭터)
│ │ └── C1_*.png + .meta
│ └── _archive/ ← 폐기 자산 보존 (롤백 안전망)
│ └── PlayerTestGirl.png 등 9종
├── Animations/
│ ├── PlayerIdle.anim ← idle (Hero1 sprite 0~3 loop)
│ ├── PlayerRun.anim ← run (Hero1 sprite 0~7 loop)
│ ├── PlayerAttack.anim ← attack (Hero1 sprite 0~7 non-loop)
│ ├── PlayerCombatIdle.anim ← combatidle (Hero1 sprite 0~3 loop) [신설]
│ ├── PlayerHit.anim ← hit (Hero1 sprite 0~1 non-loop) [신설]
│ ├── PlayerJump.anim ← jump (Hero1 sprite 0 static) [신설]
│ ├── PlayerResurrection.anim ← resurrection (Hero1 sprite 0~7 non-loop) [신설]
│ ├── PlayerDeath.anim ← death (Hero1 sprite 0~1 non-loop) [신설]
│ └── Player.controller ← Animator Controller (전면 재설계)
└── ...
4.2 Animator Controller 파라미터
| 파라미터 | 타입 | 용도 |
|---|---|---|
Speed |
Float | 이동 속도 (idle ⇄ run 전환) |
Grounded |
Bool | 지면 상태 (jump 진입 차단) |
attack |
Trigger | 공격 발동 |
hit |
Trigger | 피격 발동 (인터럽트 보호 — Animator Behaviour 영역) |
combatidle |
Bool | 5초 타이머 영역 (true = combatidle, false = idle) |
dead |
Bool | 사망 상태 (death State 진입) |
resurrect |
Trigger | 부활 발동 (resurrection State 진입) |
jump |
Trigger | 점프 발동 |
5. 구현 영역 위임
5.1 본 SOT 적용 의무 영역
- 개발팀: Animator Controller 재설계 · Health.cs 부활 + hit 인터럽트 보호 · PlayerAttackTicker.cs 주기 타이머 · combatidle 5초 타이머 영역 (신규 컴포넌트 또는 PlayerController.cs 확장)
- 기획팀: 부활 게임 룰 (BT7-Plan 또는 별건 영역) · 모션 추가 발주 결정 (Land·Spawn·Victory 미사용 확정 = PD 결정 5)
5.2 본 SOT 갱신 영역
- 신규 캐릭터 추가 시 (C2·C3...) §2.2 모션 매핑 표 갱신
- 모션 추가·폐기 시 PD 결정 + 본 SOT 개정 (v1 → v1.1 등)
- 상태 전환 룰 변경 시 PD 결정 + §3 갱신
6. 관련 규칙·자산
- PD 지시 근거: 2026-05-07 BT5-Dev Hero1 신규 지시 + 이슈 1·2·3·4·5 A안 일괄 채택
- C32 결정·근거·기각안: 본 SOT 신설 자체가 PD 명세 직접 적용 — 별도 기각안 없음. 이슈 5건 기각안은 §7 참조
- C37 규칙 문서 관리: 영구 SOT (단일 위치 — 중복 금지)
- C39 작업 전 실측 의무: Hero1 폴더 37 PNG 실측 완료 (2026-05-07 본 PM)
- 연관 SOT:
프로젝트/EerieVillage/기획/04_전투_기본_스펙.md(i-frame 0.6s 등 전투 룰)프로젝트/EerieVillage/개발/spec/스킬_시스템_설계_v1.md(BT12-Dev 보류 영역)프로젝트/EerieVillage/개발/05_PlayerTestGirl_아틀라스_적용.md(폐기 영역 — 본 SOT가 대체)
7. 기각안 (이슈 5건 PD 결정 후 기각된 옵션)
7.1 이슈 1 — 파일명 공백
- 기각안 B — PD 명세 정정 (공백 허용) → Unity asset 공백 미허용 일반 관행 + 파싱 안정성 저해. PD 결정 A 채택 (rename)
7.2 이슈 2 — death 자산 처리
- 기각안 B — death 폐기 → resurrection만 사용 시 사망→부활 시퀀스 불완전. PD 결정 A 채택 (8종 확장)
- 기각안 C — death = resurrection 첫 2프레임 흡수 → 자산 의도 분리 위배 (death = 사망, resurrection = 부활)
7.3 이슈 3 — jump 1프레임
- 기각안 B — 추가 프레임 발주 (점프 상승·정점·낙하 분리) → 현 자산 정합 + 간소함 우선. PD 결정 A 채택
7.4 이슈 4 — 기존 Player*.png 9종
- 기각안 B — 즉시 삭제 → 롤백 안전망 상실. PD 결정 A 채택 (
_archive/백업) - 기각안 C — Hero1 미커버 영역(Land·Spawn·Victory)만 보존 → 부분 보존 일관성 저해
7.5 이슈 5 — Land·Spawn·Victory 미사용
- 기각안 B — resurrection 자산 일부 재활용 (Spawn 매핑) → 의미 혼동
- 기각안 C — PD 추가 자산 발주 → 현 시점 우선순위 외
8. 변경 이력
| 일자 | 버전 | 내용 |
|---|---|---|
| 2026-05-07 | v1 | 신설 — BT5-Dev Hero1 신규 지시 수령 + 이슈 5건 PD 결정 일괄 채택 + 모션 8종 영구 SOT |