16:00 ~ 18:00 : 스크립트 하나씩 확인하며 Features ↔ 시스템 ↔ 스크립트 매핑
🍽️ 저녁시간
18:00 ~ 19:00 : 저녁시간
✅ 저녁
19:00 ~ 21:00 : 피드백 반영(프로젝트 구조 오표기 교정), 섹션별 문구 다듬기 및 체크리스트화
✅ 오늘 학습 키워드
README 구조화
프로젝트 폴더/스크립트 정합성 검증
Features–System–Script 매핑 테이블
Git 기반 파일 리스트 추출
✅ 오늘 학습 한 내용을 나만의 언어로 정리하기
문서는 코드와 동기화될 때 가치가 있다. 오늘은 스크린샷/파일트리/실제 폴더를 교차 확인하며 README 섹션을 재정비했다. 핵심은 ① 프로젝트 구조를 있는 그대로 보여주고, ② 사용자 관점의 Features를 개발자 관점의 시스템/스크립트에 정확히 매핑하는 것. 이때 용어·경로·클래스명을 실제 코드 기준으로 통일해야 팀원이 혼동하지 않는다. 앞으로는 문서 수정 전에 자동/반자동 파일 리스트 추출로 검증 단계를 습관화한다.
다시 만나면: 얇은 틈은 Voxel Size/Agent Radius/Step Height로 보정.
📝 메모
오늘은 회의-머지-버그 수정으로 꽉 찬 하루였다. 특히 NRE와 씬 가드, 코루틴 중복 같은 “초기화·수명주기 문제”를 다시 정리할 수 있어서 좋았다. 작은 방어 코드가 큰 사고를 막는다. 내일은 스폰 룰 튜닝과 UI 타이머 연동을 좀 더 깔끔하게 다듬어 보자. 꾸준히 한 걸음씩! 💪
StageManager 타이머/리젠 루프, HunterRule(AnimationCurve) 간격 제어
프리팹 능력치 주입(Stat Injection), NRE 방어
✅ 오늘 학습 한 내용을 나만의 언어로 정리하기
데이터 책임 분리개체 능력치(HP/공격력/이동속도/공속)는 StageStatsSet이 맡는다.
StageConfig.stageTier로 현재 스테이지(1/2/3)를 명시하고, statsSet.Get(kind, tier)로 필요한 스탯을 읽기 전용으로 가져와 프리팹에 주입한다.
스폰 수치·시간(Init/Max/Cooldown/목표 등)은 StageConfig가,
유연한 밸런싱 파이프라인
모든 스테이지가 한 개의 StatsSet을 공유하므로, 밸런서는 StatsSet만 수정해도 전 스테이지가 반영된다. 반대로 특수 스테이지는 별도 StatsSet 에셋을 가리키면 된다.
헌터 스폰의 난이도 곡선화
HunterRule.intervalByInfection 커브로 감염률→스폰간격을 매핑하니 난이도 체감이 부드럽다. 하드 스테이지는 커브 기울기만 바꿔도 된다.
운영 루프 간결화
CoTimer / CoHumanRegen / CoVipRegen / CoHunterControl로 역할이 분리돼 가독성이 좋아졌다. 스테이지 전환 시 StopAllCoroutines()로 누수 방지.
🧩 학습하며 겪었던 문제점 & 에러
1. StageStatsSet 미지정 시 NRE 위험
문제정의: StageConfig.statsSet이 비어 있으면 스탯 주입 코드에서 NRE 가능.
시도: 사용부에서만 null 체크.
해결 방법: 제공자와 사용자 모두 방어. StageConfig.GetStats()에서 null 대응, 사용부도 이중 가드.
// StageConfig.cs
public UnitStats GetStats(ActorKind kind) {
if (statsSet == null) return null;
return statsSet.Get(kind, stageTier);
}
// 사용부
var stat = cfg.GetStats(ActorKind.Human);
if (stat == null) return; // 안전 가드
새롭게 알게 된 점: SO 의존성은 “제공자 가드 + 소비자 가드”가 심리적 안정감을 준다.
다시 만나면: 에디터 Validate(예: OnValidate)에서 미지정 시 콘솔 경고 띄우기.
2. 스테이지별 스탯 매핑 실수(잘못된 Tier 선택)
문제정의: Tier 매핑 스위치문에서 default 처리를 안 하면 잘못된 값 사용 가능.
시도: 단순 스위치 반환.
해결 방법: 명시적 default와 에디터 노출 순서 일치.
// StatsByTier.cs
public UnitStats Get(StageTier tier) {
switch (tier) {
case StageTier.Stage1: return stage1;
case StageTier.Stage2: return stage2;
case StageTier.Stage3: return stage3;
default: return stage1; // 안전 기본값
}
}
새롭게 알게 된 점: Enum 확장 시 누락 위험이 있다.
다시 만나면: Dictionary로 전환하거나 switch에 _ 패턴 사용(C# 버전에 따라).
📝 메모
생각보다 데이터 책임 분리가 많은 걸 바꿔준다. “스테이지는 규칙과 수량”, “능력치는 별도 세트”로 나누니 머리가 한결 가벼워졌다. 오늘 스테이지 1·2·3을 끝까지 밀어 붙인 게 큰 수확! 모르는 걸 부끄러워하지 말고, 내일은 UI에서 현재 Tier/목표/남은 시간을 직관적으로 보여주는 패널까지 연결하자.
본격적으로 팀 프로젝트 시작하는 1일차이다 이번이 5번째인가.. 다음 마지막 프로젝트가 최종 프로젝트인데 그 전 마지막 프로젝트이다 이번 팀원들과도 마지막까지 힘내보자 화이티잉!!!!!