# 캐릭터 리소스 규칙 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 |
