# 사전 과제 ## 파일 구성 | 파일 | 역할 | | --- | --- | | `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에는 읽기/구독 책임만 노출