56 lines
2.9 KiB
Markdown
56 lines
2.9 KiB
Markdown
# 사전 과제
|
|
|
|
## 파일 구성
|
|
|
|
| 파일 | 역할 |
|
|
| --- | --- |
|
|
| `Core/ComponentBase.cs` | Unity `MonoBehaviour`의 대역 |
|
|
| `Core/IHealthView.cs` | HP등을 읽을 수 있는 인터페이스 |
|
|
| `Core/Health.cs` | HP를 구현한 클래스. `IHealthView` 구현, `TakeDamage(피격데미지)`/`Revive(부활)`|
|
|
| `Battle/BattleManager.cs` | 게임 진행 시간(`CurrentGameSeconds`) |
|
|
| `Battle/AttackType.cs` | 공격 타입 |
|
|
| `Units/Unit.cs` | 모든 유닛의 추상 클래스ㅓ. `Health` 소유, `IHealthView` 노출 |
|
|
| `Units/Champion.cs` | 죽으면 **일정 시간 후 부활** |
|
|
| `Units/Minion.cs` | 죽으면 **소멸**, 생성 시 게임 시간 비례 공격력 |
|
|
| `Units/Tower.cs` | 죽으면 **영구 파괴**(잔해는 남음) |
|
|
| `UI/HPBar.cs` | 임의 대상의 HP를 **'보여주는'** UI. `IHealthView`만 참조 |
|
|
|
|
## 과제 (1) — 유닛 3종
|
|
|
|
공통점(HP 소유·데미지·사망 흐름)은 `Unit`에 모으고, 초기화는 `Awake → Init()
|
|
|
|
| 유닛 | 요구사항 | 구현 |
|
|
| --- | --- | --- |
|
|
| **Champion** | 죽으면 일정 시간 후 부활 | `Revive()`|
|
|
| **Minion** | 죽으면 소멸 / 생성 시 시간 비례 공격력 | `OnDied → Destroy()`(오브젝트 제거). `Init`에서 `GetAtkByGameTime(BattleManager.CurrentGameSeconds)`로 공격력 세팅 |
|
|
| **Tower** | 영구 파괴 여부를 저장 | `OnDied` 기능 정지/잔해 전환. 오브젝트(흔적)는 남고, 부활 로직이 없어 영구 파괴 |
|
|
|
|
## 과제 (2) — 분리
|
|
|
|
### 의존 방향을 한쪽으로만 (유닛 → HPBar 의존: 0)
|
|
|
|
```
|
|
Champion/Minion/Tower ──소유──▶ Health ──구현──▶ IHealthView ◀──구독──── HPBar
|
|
(Units) (Core) (Core) (UI)
|
|
|
|
의존 방향: UI → Core, Units → Core, Units → Battle
|
|
```
|
|
|
|
- **작동(코어) = `Health`** : 데미지/회복/사망을 실제로 처리하는 클래스. UI를 전혀 모르며, 상태 변화는 `HPChanged`/`Died` **이벤트로만** 알림.
|
|
- **표시 = `HPBar`** : `IHealthView`(읽기 전용)만 참조.
|
|
- **연결** : 유닛이 프로퍼티로 `IHealthView`를 노출하고, 유닛은 HPBar를 전혀 참조하지 않음.
|
|
|
|
### 이점
|
|
- **양방향 무의존** — 유닛은 UI를, UI는 구체 유닛을 모름
|
|
- **임의 대상 반영** — `IHealthView`만 만족하면 무엇이든 표시 가능.
|
|
- **항상 최신 상태** — `Bind` 시 1회 즉시 반영, 이후 변화 시점에만 갱신.
|
|
|
|
## 특이사항
|
|
- **`AttackType`** : **물리/마법 등 데미지 타입별 분기로 확장**할 것을 고려.
|
|
- **스탯은 외부 주입 전제** : `MaxHP`/`Atk` 등 실제 수치는 **외부에서 주입**하는 것을 전제.
|
|
|
|
## 적용 패턴
|
|
- **Template Method** — `Init` / `OnDied` / `GetAttackDamage`로 유닛별 차이만 분리
|
|
- **Observer** — `HPChanged` / `Died` 이벤트로 코어 → 표시 단방향 통지
|
|
- **Interface Segregation** — `IHealthView`로 UI에는 읽기/구독 책임만 노출
|