Unity Project-2026/02/14-HITWAVES
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 호출 후에도 해당 프레임 내에서 다른 콜라이더의 트리거 이벤트가 계속 발생
[해결]
_isPickedUpbool 플래그 추가, 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분기 안으로 이동다른 타입은 해당 타입의 픽업 로직이 구현될 때까지 아무 동작 안 함
[회고]
아직 구현되지 않은 분기의 부작용을 미리 차단해야 함
"구현 안 된 타입 = 아무것도 안 함"이 올바른 기본 동작




