코딩의 신 73

김동관·2026년 1월 19일

오늘 한 일

퀘스트 시스템 충돌 원인과 해결

1. 증상 요약

오늘 작업하면서 반복적으로 겪은 문제는 다음과 같았다.

같은 몬스터 / 아이템 / 오브젝트인데
A 씬에서는 정상 작동
B 씬(병합된 씬)에서는 작동 안 함

HP는 0이 되는데 몬스터가 안 죽음

CollectItem 퀘스트 진행도가 갑자기 안 오름

HUD 거리 표시가 어떤 퀘스트는 뜨고, 어떤 건 안 뜸

DestroyObject 퀘스트에서 타겟은 보이는데 연출이 어색함

결론적으로 “로직 문제 같아 보이지만, 실제로는 초기화 / 호출 순서 문제”였다.

핵심 원인 ① : Awake / OnEnable / Start 호출 순서

Unity에서 가장 자주 터지는 함정입니다.

호출 순서 정리

Awake
→ OnEnable
→ Start

그리고 씬 병합 시:

어떤 오브젝트는 이미 Enable 상태

어떤 오브젝트는 나중에 생성

Script Execution Order는 보장 안 됨

실제로 터졌던 케이스

QuestTargetRegistry

QuestTargetRegistry.Instance.Register(id, transform);

내 씬:

Registry 먼저 생성

대상 오브젝트 OnEnable → Register 성공

병합 씬:

대상 오브젝트 OnEnable 먼저 호출

Registry 아직 없음 → Register 실패

결과: 거리 표시 안 뜸

✔ 해결

Register는 OnEnable에서 하되

Instance != null 체크

혹은 Registry를 씬에 항상 존재하는 매니저로 고정

3. 핵심 원인 ② : 상태값 중복 관리 (IsAlive vs isDead)

문제가 된 구조

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();
}

→ 사망 판정은 단일 플래그로 통합

핵심 원인 ③ : 퀘스트 TargetID와 실제 이벤트 ID 불일치

특히 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 위치 정상

진행도 정상

아이템 시스템과 퀘스트 분리

profile
아이디어 뱅크

0개의 댓글