메이플스토리월드 :: 인벤토리 구현 08

chooha·2026년 7월 28일

메이플스토리월드

목록 보기
8/15

📝 개발일지 - 스폰된 버프 아이콘의 OnBeginPlay 타이밍 버그

👨‍💻 오늘의 개발 작업

아이템 사용 시 화면에 버프 아이콘(아이콘 + 카운트다운 텍스트)을 띄우는 기능을 구현함. 아이콘 자체는 잘 스폰되고 보였는데, 카운트다운 숫자만 표시가 안 되고 에러가 발생함. 스폰(복제) 직후 코드 실행 순서에 숨어있던 문제였음


💡 오늘의 기록

1. 문제 상황 파악

UIBuffPanel.ShowBuff에서 버프 아이콘 템플릿을 스폰하고, 곧바로 UIBuffIcon:Init(iconRUID, durationSec)을 호출해 아이콘 이미지와 카운트다운을 세팅하도록 구현함. 실행하니 아이콘은 보이는데 아래 에러가 발생함

[CLIENT] [LEA-2007] AttemptToIndex : 'durationText'을 인덱싱할 수 없습니다. 'durationText'은 nil입니다.
UIBuffIcon.SetDuration (at MyDesk/UIBuffIcon:32)
UIBuffIcon.Init (at MyDesk/UIBuffIcon:21)
UIBuffPanel.ShowBuff (at MyDesk/UIBuffPanel:36)

2. 원인이 된 코드

local iconEntity = _SpawnService:SpawnByEntity(self.buffIconTemplateEntity, "BuffIcon", Vector3.zero, self.buffContentEntity)
iconEntity.UIBuffIcon:Init(itemData.iconRUID, durationSec)  -- ① 먼저 호출
iconEntity:SetEnable(true)                                  -- ② 그 다음 활성화

durationText는 UIBuffIcon.OnBeginPlay에서 GetChildByName으로 찾아 채워주는 값인데, 정작 Init(①)이 활성화(②)보다 먼저 호출되고 있었음

3. 원인 분석

이 프로젝트에서 이미 확인해뒀던 사실이 있었음 — "템플릿은 평소 Enable=false라 스폰된 복제본도 비활성 상태로 시작하고, OnBeginPlay는 SetEnable(true)로 활성화된 뒤에야 실행된다." 즉 ①번 시점엔 OnBeginPlay가 아직 안 돌아서 durationText가 nil인 채로 남아있었고, 그 상태에서 SetDuration이 durationText.Text = ...를 시도하다 터진 것

4. 해결

활성화와 데이터 주입 순서를 맞바꿈

local iconEntity = _SpawnService:SpawnByEntity(self.buffIconTemplateEntity, "BuffIcon", Vector3.zero, self.buffContentEntity)
iconEntity:SetEnable(true)
iconEntity.UIBuffIcon:Init(itemData.iconRUID, durationSec)

📚 성과와 개선 효과

  • ✅ 스폰 직후 초기화 패턴 확립: "템플릿이 비활성 상태로 스폰되고, 활성화 시점에 OnBeginPlay가 실행된다"는 조건이 있는 프로젝트에서는, 스폰 → 활성화 → 데이터 주입 순서를 항상 지켜야 한다는 걸 명문화함
  • ✅ 에러 로그로 호출 스택을 역추적하는 습관: SetDuration → Init → ShowBuff 순으로 찍힌 스택을 거슬러 올라가며 "어디서 최초로 nil이 만들어졌는가"를 찾는 방식으로 원인을 좁힘

0개의 댓글