오늘 한 일
오늘 작업하면서 반복적으로 겪은 문제는 다음과 같았다.
같은 몬스터 / 아이템 / 오브젝트인데
A 씬에서는 정상 작동
B 씬(병합된 씬)에서는 작동 안 함
HP는 0이 되는데 몬스터가 안 죽음
CollectItem 퀘스트 진행도가 갑자기 안 오름
HUD 거리 표시가 어떤 퀘스트는 뜨고, 어떤 건 안 뜸
DestroyObject 퀘스트에서 타겟은 보이는데 연출이 어색함
결론적으로 “로직 문제 같아 보이지만, 실제로는 초기화 / 호출 순서 문제”였다.
Unity에서 가장 자주 터지는 함정입니다.
Awake
→ OnEnable
→ Start
그리고 씬 병합 시:
어떤 오브젝트는 이미 Enable 상태
어떤 오브젝트는 나중에 생성
Script Execution Order는 보장 안 됨
실제로 터졌던 케이스
QuestTargetRegistry.Instance.Register(id, transform);
내 씬:
Registry 먼저 생성
대상 오브젝트 OnEnable → Register 성공
병합 씬:
대상 오브젝트 OnEnable 먼저 호출
Registry 아직 없음 → Register 실패
결과: 거리 표시 안 뜸
✔ 해결
Register는 OnEnable에서 하되
Instance != null 체크
혹은 Registry를 씬에 항상 존재하는 매니저로 고정
public bool IsAlive => currentHp > 0f;
protected bool isDead;
어떤 곳은 IsAlive 기준
어떤 곳은 isDead 기준
HP는 0인데 isDead가 false인 상태 발생
그래서:
데미지는 들어가는데
OnDie()가 호출되지 않거나
애니메이션/Destroy가 안 됨
if (currentHp <= 0)
{
if (isDead) return;
isDead = true;
OnDie();
}
특히 CollectItem 퀘스트에서 크게 터졌던 부분.
잘못된 구조 (초기)
퀘스트 JSON
"TargetID": 90001
아이템 획득 시
ReportProgress(CollectItem, itemKey, 1);
TargetID ≠ itemKey
→ 진행도 증가 안 됨
거리 표시용 ID와 진행 체크 ID 분리
"TargetID": 90001, // HUD 거리 표시용
"CollectItemID": 2002 // 실제 아이템 ID
case CompleteCondition.CollectItem:
if (quest.CollectItemID != targetId) continue;
✔ 이 구조로:
HUD 위치 정상
진행도 정상
아이템 시스템과 퀘스트 분리