Unity/Unity 개발

드롭 시스템 구현 및 디버깅

leedh1211 2025. 7. 11. 20:42

학습 동기

몬스터가 사망했을 때 아이템과 골드를 드롭하고, 일정 시간 후 플레이어에게 빨려들어가는 연출을 구현하고자 했다. 또한 드롭된 아이템을 자동으로 인벤토리에 추가하거나 골드를 증가시키는 시스템이 필요했다.

학습 내용

1. 드롭 시스템 기본 구조

  • EnemyDropHandler 스크립트에서 드롭 아이템과 골드 프리팹을 Instantiate()로 생성
  • 일정 시간 후 MoveToPlayer() 함수를 통해 아이템이 플레이어 방향으로 가속 이동
  • 도착 시 HandlePickup()에서 아이템 종류별 처리 (스킬북, 룬, 포션, 골드)

2. 드롭 애니메이션

  • DOTween을 사용하여 아이템이 사망 지점에서 살짝 튀어나온 뒤 1초 후 빨려들어감
  • AggressiveTrackPlayer()에서 속도를 점점 증가시켜 부드러운 연출 구현

3. 아이템 처리 방식

  • 아이템 종류별로 프리팹을 분리하여 DefaultSkillPrefab, DefaultRunePrefab, DefaultPotionPrefab에 할당
  • 아이템 획득 시 인벤토리 UI에 동적으로 생성 + DraggableItem.Setup(itemData) 호출

문제해결

문제 1: NullReferenceException

  • dropItemPrefab 또는 itemData가 null인 상태에서 접근함
  • 원인: 드롭 확률 결과로 itemData가 null일 수 있음
  • 해결: null 체크 및 로그 추가로 예외 방지

문제 2: ArgumentOutOfRangeException

  • 드롭 리스트가 비어 있음에도 Random.Range(0, count) 호출
  • 해결: 리스트가 비어있을 경우 null 반환하도록 방어 로직 추가

느낀점

처음에는 단순히 Instantiate()만으로 구현하면 끝날 줄 알았지만, 드롭 시스템은 디테일이 많았다.
특히 Inspector에서의 프리팹 할당이나 null 체크 같은 기본적인 실수가 많은 예외를 유발함을 다시 한번 깨달았다.
애니메이션과 플레이어 추적 로직이 잘 어울릴 때 몰입감이 올라가기 때문에, 단순한 시스템이라도 연출 완성도를 높이는 게 중요하다고 느꼈다.