Skip to main content

Command Palette

Search for a command to run...

Unity Project-2026/02/14-HITWAVES

Updated
•3 min read•View as Markdown

2026/02/14 - 기능개발 및 오류 일지

기능개발


흡수형 아이템 픽업 시스템

[목표]

  • 아이작 스타일 흡수형 아이템 — 밟으면 자동 획득, 스탯 영구 변경 후 소멸

  • 아이템 4분류 체계(흡수/장착/소모/소지) 중 가장 단순한 흡수형부터 구현

  • 기존 StatHandler.AddModifier()를 활용한 스탯 증감

[구현 요약]

  • ItemType enum 생성 (Absorb, Equipment, Consumable, Carry)

  • StatModifierEntry 구조체 — Inspector에서 스탯 타입 + 수치 편집 가능

  • ItemData ScriptableObject — 아이템 이름, 설명, 타입, 아이콘, 스탯 modifier 리스트, 즉시 효과 리스트

  • WorldItem 컴포넌트 — OnTriggerEnter2D로 픽업 감지, LayerMask로 Player만 필터링

  • Assets > Create > HitWaves > Item Data로 SO 에셋 생성 가능

[결과]

  • ItemData SO에서 MoveSpeed +3, Damage +5 같은 복수 스탯 변경을 리스트로 설정 가능

  • 플레이어가 밟으면 스탯 적용 + 아이템 소멸

  • 적은 LayerMask 필터링으로 픽업 불가

  • 플레이 검증 대기 중


즉시 효과 시스템 (InstantEffect)

[목표]

  • 흡수형 아이템에 "HP 20 회복", "HP 풀 회복" 같은 즉시 효과 지원

  • 영구 스탯 변경(StatModifier)과는 별개의 일회성 효과

[구현 요약]

  • InstantEffectType enum 생성 (HealFlat, HealFull)

  • InstantEffectEntry 구조체 — 효과 타입 + 값

  • ItemData에 List<InstantEffectEntry> 추가

  • WorldItem에서 HealthHandler.Heal() 호출로 즉시 회복 처리

  • HealFull은 MaxHealth만큼 Heal 호출

[결과]

  • 하나의 아이템에 스탯 변경 + 즉시 효과를 동시에 설정 가능

  • 향후 스태미나 회복, 정신력 회복 등 InstantEffectType 확장으로 대응

  • 플레이 검증 대기 중

BUG


흡수형 아이템 동일 프레임 중복 적용

[증상]

  • Destroy는 프레임 끝에 반영되므로, 같은 프레임에 OnTriggerEnter2D가 여러 번 호출되면 스탯 modifier가 중복 적용될 수 있음

[원인]

  • Destroy 호출 후에도 해당 프레임 내에서 다른 콜라이더의 트리거 이벤트가 계속 발생

[해결]

  • _isPickedUp bool 플래그 추가, OnTriggerEnter2D 진입 시 즉시 체크

  • true이면 early return, 최초 픽업 시 true로 설정 후 처리

[회고]

  • Unity의 Destroy는 즉시 파괴가 아닌 프레임 종료 시 파괴임을 항상 고려해야 함

  • 상태 변경이 일어나는 트리거 콜백에는 중복 실행 방지 플래그가 필수


콜라이더가 자식 오브젝트에 있을 때 픽업 실패

[증상]

  • 플레이어의 Collider2D가 자식 오브젝트에 있으면 GetComponent<StatHandler>()가 null을 반환하여 픽업이 동작하지 않음

[원인]

  • other.GetComponent<>()는 트리거에 접촉한 콜라이더의 오브젝트에서만 검색

  • StatHandler가 부모(루트)에 있고 Collider2D가 자식에 있으면 찾지 못함

[해결]

  • GetComponent<StatHandler>() → GetComponentInParent<StatHandler>()로 변경

  • InstantEffect에서도 동일하게 StatHandler 기준으로 HealthHandler를 GetComponent

[회고]

  • Unity에서 콜라이더와 주요 컴포넌트가 다른 계층에 있을 수 있음을 기본 전제로 설계해야 함

  • 특히 픽업/트리거 판정에서는 GetComponentInParent가 안전한 기본값


isTrigger 미설정 시 픽업 무반응 (설정 실수)

[증상]

  • WorldItem에 Collider2D가 있지만 isTrigger가 꺼져 있으면 OnTriggerEnter2D가 아예 호출되지 않아 픽업이 동작하지 않음

[원인]

  • RequireComponent로 Collider2D 존재는 강제하지만, isTrigger 값은 코드로 보장하지 않음

[해결]

  • Awake에서 col.isTrigger == false일 때 경고 로그 출력

  • 강제 설정 대신 경고로 처리 (의도적으로 isTrigger를 끄는 경우도 있을 수 있으므로)

[회고]

  • RequireComponent는 존재만 보장하고 설정값은 보장하지 않음

  • 중요한 설정 의존성은 Awake에서 검증 로그를 남기는 습관이 필요


비 Absorb 타입 아이템도 소멸되는 문제

[증상]

  • Absorb이 아닌 타입(Equipment, Consumable, Carry)의 WorldItem에 플레이어가 접촉하면 효과는 없지만 오브젝트가 Destroy됨

[원인]

  • Destroy(gameObject)가 Absorb 분기 바깥에 있어서 타입과 무관하게 실행

[해결]

  • Destroy와 로그 출력을 _itemData.Type == ItemType.Absorb 분기 안으로 이동

  • 다른 타입은 해당 타입의 픽업 로직이 구현될 때까지 아무 동작 안 함

[회고]

  • 아직 구현되지 않은 분기의 부작용을 미리 차단해야 함

  • "구현 안 된 타입 = 아무것도 안 함"이 올바른 기본 동작

More from this blog

O

ON VOID STUDIO

6 posts

💻 Indie Dev Studio — Emptiness is Possibility. ON VOID STUDIO builds games, apps, and digital experiences from scratch. One developer, turning nothing into something.