72 lines
5.8 KiB
Markdown
72 lines
5.8 KiB
Markdown
# Gemini To-Do List
|
|
## 작성 규칙
|
|
1. 날짜를 가장 상위에 작성한다.
|
|
2. 할일 - 상태를 순서대로 작성한다.
|
|
2. 다음 날의 To-Do 를 작성하기 전에 구분선을 작성해서 날짜별로 구분한다.
|
|
|
|
2025-09-23
|
|
1. `EnemyController.cs` 리팩토링 (상태 머신 적용) - 완료 (CurrentState 프로퍼티 사용)
|
|
2. `AI_State`를 상속받는 상태 클래스들 생성 (Idle, Patrol, Chase, Attack, Die) - 대기
|
|
3. `Movement_Ground.cs` 기능 확인 및 필요 기능 구현 - 대기
|
|
---
|
|
2025-09-24
|
|
1. `EnemyController.cs`의 `Init(EnemyData data)` 메서드 구현 - 대기
|
|
2. `EnemyData` 및 `Status_Enemy` 정의 확인 및 필요 시 구현 - 대기
|
|
3. `Assets/Scripts/AI/States/` 폴더 내에 상태 클래스들 생성 (`IdleState.cs`, `PatrolState.cs`, `ChaseState.cs`, `AttackState.cs`, `DieState.cs`) - 대기
|
|
4. `Movement` 기본 클래스/인터페이스 및 `Movement_Ground.cs` 기능 확인 (`MoveTo`, `Stop` 메서드) - 대기
|
|
|
|
-----------------------------------------------------------------------------------------------------------------------
|
|
# 상세
|
|
To-Do 리스트에 해야할 내용을 상세하게 작성한다.
|
|
|
|
### 1. `EnemyController.cs` 리팩토링 (완료)
|
|
- **목표:** 기존의 enum-switch 구조를 `AI_State` 기반의 상태 머신 패턴으로 변경하여, 코드의 확장성과 유지보수성을 높입니다.
|
|
- **세부 작업:**
|
|
- `EnemyBehavior` enum과 `Behavior` 프로퍼티를 제거합니다. (완료)
|
|
- `private AI_State _currentState;` 변수를 추가하여 현재 상태를 관리합니다. (완료)
|
|
- `public AI_State CurrentState { get; set; }` 프로퍼티를 구현하여 상태를 안전하게 전환합니다. (완료)
|
|
- `Update()` 메서드를 `_currentState?.Update();` 한 줄로 수정하여, 현재 상태의 로직만 실행되도록 합니다. (완료)
|
|
- `EnemyData`를 외부에서 받아 `Status_Enemy`를 포함한 각종 능력치를 초기화하는 `Init(EnemyData data)` 메서드를 구현합니다. (대기)
|
|
|
|
### 2. `EnemyController.cs`의 `Init(EnemyData data)` 메서드 구현
|
|
- **목표:** `EnemyController`가 외부에서 주입된 `EnemyData`를 기반으로 초기화될 수 있도록 합니다.
|
|
- **세부 작업:**
|
|
- `EnemyData` 클래스의 정의를 확인합니다. (필요 시 생성)
|
|
- `Status_Enemy` 클래스의 정의를 확인합니다. (필요 시 생성)
|
|
- `public void Init(EnemyData data)` 메서드를 `EnemyController.cs`에 추가하고, `data`를 사용하여 `_type` 및 `_status`를 초기화합니다.
|
|
- `_movement` 컴포넌트가 스포너에 의해 주입되는 방식에 따라 `_movement` 참조를 설정하는 로직을 추가합니다.
|
|
|
|
### 3. 상태 (State) 클래스 생성
|
|
- **목표:** 적의 각 행동 패턴(대기, 순찰, 추격 등)을 독립적인 클래스로 분리하여 관리합니다.
|
|
- **세부 작업:**
|
|
- `Assets/Scripts/AI/States/` 폴더 내에 아래의 클래스들을 생성합니다. 모든 클래스는 `AI_State`를 상속받습니다.
|
|
- **`IdleState.cs`**: 제자리에서 대기하며, `Update()`에서 플레이어 탐지 등 다른 상태로 전환될 조건을 확인합니다.
|
|
- **`PatrolState.cs`**: 지정된 경로를 따라 순찰합니다. `Movement` 컴포넌트를 사용하여 이동합니다.
|
|
- **`ChaseState.cs`**: 플레이어를 향해 추격합니다. `Movement` 컴포넌트를 사용하며, 플레이어와의 거리에 따라 `AttackState`로 전환될 수 있습니다.
|
|
- **`AttackState.cs`**: 플레이어를 공격합니다. 공격 쿨타임 등을 관리하며, 플레이어가 범위를 벗어나면 `ChaseState`로 다시 전환될 수 있습니다.
|
|
- **`DieState.cs`**: 사망 시 처리(애니메이션, 아이템 드랍 등)를 담당합니다.
|
|
|
|
### 4. `Movement` 기본 클래스/인터페이스 및 `Movement_Ground.cs` 기능 확인
|
|
- **목표:** 상태 클래스들이 적을 움직이는 데 필요한 기능이 `Movement` 기본 클래스/인터페이스와 `Movement_Ground`에 모두 준비되어 있는지 확인하고, 없다면 구현합니다.
|
|
- **세부 작업:**
|
|
- `Movement` 기본 클래스 또는 인터페이스의 정의를 확인합니다.
|
|
- `Movement_Ground.cs` 코드를 분석합니다.
|
|
- `PatrolState`와 `ChaseState`에서 사용할 기능이 있는지 확인합니다.
|
|
- 특정 지점으로 이동시키는 `MoveTo(Vector3 destination)`
|
|
- 이동을 멈추는 `Stop()`
|
|
- 만약 기능이 없다면, `NavMeshAgent`를 사용하는 등의 방식으로 해당 기능들을 구현할 것을 제안합니다.
|
|
|
|
|
|
-----------------------------------------------------------------------------------------------------------------------
|
|
# 기능 구현을 위한 고려 사항 및 질문
|
|
개발 과정에서 논의되었거나 추가적인 확인이 필요한 설계 결정, 구현 방식, 잠재적 문제점 등을 기록한다.
|
|
|
|
## 1. `EnemyController`의 `_movement` 변수 초기화 방식
|
|
|
|
* **현황:** `EnemyController`의 `_movement` 변수는 `Movement` 타입으로 선언되어 있으며, `EnemyController`의 `Awake()` 메서드에서는 초기화되지 않습니다.
|
|
* **계획:** 스포너 또는 외부 로직에서 `GameObject`에 적절한 `Movement` 컴포넌트(예: `Movement_Ground`, `Movement_Air`)를 추가하고, `EnemyController`의 `Movement` 프로퍼티(또는 필드)에 해당 인스턴스를 할당할 예정입니다.
|
|
* **확인 필요:**
|
|
* 스포너에서 `Movement` 컴포넌트를 `GameObject`에 추가한 후 `EnemyController`가 `GetComponent<Movement>()`를 통해 참조를 가져올 것인지,
|
|
* 아니면 스포너가 `EnemyController` 인스턴스에 직접 `_movement`를 할당할 것인지 명확히 해야 합니다.
|
|
* `EnemyController`의 `Init(EnemyData data)` 메서드 내에서 `_movement` 참조를 설정하는 로직이 필요할 수 있습니다.
|