🗓️ 오늘 하루 일정
✅ 오전
- 10:00 ~ 10:30 : 팀 회의(배포 테스트/분석 목표 확정)
- 10:30 ~ 11:30 : 이벤트 스키마 확정
- (player_death, stage_complete, stage_failed, mode_switch + 파라미터 정의)
- 11:30 ~ 12:30 : UGS 연결/대시보드 점검(패키지/프로젝트 연동 확인)
🍽️ 점심시간
- 13:00 ~ 14:00 : 점심
✅ 오후
- 14:00 ~ 15:00 : GA.cs 래퍼 구현(RecordEvent), 공통 파라미터/스냅 처리
- 15:00 ~ 16:00 : 초기화/업로드 파이프라인
- (UGSInitializer, AnalyticsAutoFlusher with UNITY_EDITOR Flush)
- 16:00 ~ 17:00 : 게임 로직 연동StageRunTracker, ModeSwitchTracker 구독)
- (PlayerHealthEventHandler·PlayerDeathHook, Bullet/Shooter.ReportAttacker,
- 17:00 ~ 18:00 : 트러블슈팅
- Event Browser 미표시(환경 불일치 → production 전환)
- Invalid(정의 안 된 build_version) → 코드 제거 후 재전송
🍽️ 저녁시간
- 18:00 ~ 19:00 : 저녁
✅ 저녁
- 19:00 ~ 20:00 : 로비에서 실패 찍힘 이슈 해결
- (트래커 게임씬 전용 배치/가드, PlayerDeathHook에서 트래커 없으면 실패 스킵)
- 20:00 ~ 21:00 : 이중 구독으로 인한 중복 전송 수정(인스펙터/코드 중 하나만 유지) 및 최종 검증
✅ 오늘 학습 키워드
UGS Analytics, Custom Event 스키마, Event Browser(Valid/Invalid), dev/prod 환경, RecordEvent(new CustomEvent), Flush 타이밍(WebGL/Editor), StageRunTracker, ModeSwitchTracker, Health 이벤트 구독, ReportAttacker(killer_id), Invalid 원인 분석(additional property), DDOL/씬 가드.
✅ 오늘 학습 한 내용을 나만의 언어로 정리하기
- UGS Analytics 흐름: 초기화(UnityServices.InitializeAsync → StartDataCollection) 후, 게임 로직에서 한 지점당 한 번 커스텀 이벤트를 RecordEvent(new CustomEvent(...))로 전송한다. WebGL/에디터는 중요한 순간에 Flush()를 호출하면 확인이 빨라진다.
- 스키마 우선: 이벤트/파라미터는 Event Manager에 먼저 정의·Publish하고, 코드가 그 이름/타입을 정확히 일치시켜야 한다. 하나라도 다르면 Invalid로 버려진다.
- 설계 포인트:
- player_death는 좌표(0.5 격자), killer_id, gameplay_mode가 핵심.
- stage_complete/failed는 attempt/시간/킬수를 한 번만.
- mode_switch는 전환 좌표 + 잠입 지속시간.
- 씬 생명주기: 애널리틱스용 컴포넌트는 게임씬 전용으로 두고, DDOL 오브젝트에는 초기화/플러셔만 둔다. 그렇지 않으면 로비/타이틀에서도 이벤트가 새어 나간다.
🧩 학습하며 겪었던 문제점 & 에러
1) Event Browser에 커스텀 이벤트가 안 보임
- 정의: 에디터에서 보냈는데 Event Browser에 player_death 등이 없음.
- 시도: smoke 이벤트 전송, Flush 주기 늘림.
- 해결: 환경 불일치(대시보드 production vs 코드 development) → production으로 통일.
- 배운 점: UGS는 환경 분리가 철저. 콘솔 로그로 UGS Initialized (env)를 항상 확인.
- 다시 만나면: 초기화 직후 환경/플러시 체크리스트부터 확인.
2) Invalid: Additional property 'build_version'
- 정의: Event Manager에 없는 파라미터를 코드에서 전송.
- 시도: 파라미터 추가/Publish vs 코드 제거 비교.
- 해결: 코드에서 전송 제거(가장 빠름).
- 배운 점: “스키마 ≠ 코드”면 데이터는 버려진다.
- 다시 만나면: Invalid 탭 Reason 확인 → 스키마/코드 중 하나를 즉시 정렬.
3) 로비만 가도 stage_failed가 찍힘
- 정의: DDOL 오브젝트에 붙은 StageRunTracker가 로비에서도 살아있음.
- 시도: 트래커 위치 조정.
- 해결: 트래커는 게임씬 전용 배치 + 비게임씬 가드(IsGameplayScene) + PlayerDeathHook에서 트래커 없으면 실패 스킵.
- 배운 점: 분석 로직은 씬 가드가 필수.
- 다시 만나면: DDOL에는 초기화만, 나머지는 씬별.
4) player_death 중복 전송
- 정의: OnPlayerDamaged/OnPlayerDie가 2번씩 호출.
- 시도: 로그로 호출 경로 추적.
- 해결: Health 이벤트 이중 구독(인스펙터 + 코드) → 한 방식만 남김(자동 구독 유지).
- 배운 점: UnityEvent는 AddListener 중복에 주의.
- 다시 만나면: _wired 플래그로 방지 또는 에디터 연결 제거.
5) player_death가 가끔 안 찍힘
- 정의: 사망 로그는 찍히는데 이벤트 미수신.
- 시도: 전송 직전 로그/널가드 추가.
- 해결: killer_id 기본값을 "unknown"으로 보정, OnDie()에서 SENT 로그와 Flush()로 확인.
- 배운 점: 보내는 값이 비어도 Invalid로 버려질 수 있음.
- 다시 만나면: 전송 레벨 로그(GA.Send …)를 항상 켜서 추적.
📝 메모
- Data Explorer 리포트 저장:
- player_death 히트맵용 CSV (stage_id, killer_id, x, y)
- 완료/실패 비교표(완료율, 평균 플레이타임, 평균 킬수)
- mode_switch 빈도·지점
- killer_id 네이밍 고정: guard_melee, guard_rifle, cctv_turret, trap_spike, mine 등 일관 키 사용.
- StageRunTracker는 게임씬에 하나만. 중복 생성/구독 주의.
- WebGL 배포 전: Ad-block off 가이드, 중요한 지점 Flush() 재확인.
'스파르타 코딩클럽 > TIL작성' 카테고리의 다른 글
| 내일배움캠프 74일차 TIL [최종 프로젝트 Black Chamber] (0) | 2025.10.20 |
|---|---|
| 내일배움캠프 73일차 TIL [최종 프로젝트 Black Chamber] (0) | 2025.10.17 |
| 내일배움캠프 71일차 TIL [최종 프로젝트 Black Chamber] (0) | 2025.10.15 |
| 내일배움캠프 70일차 TIL [최종 프로젝트 Black Chamber] (0) | 2025.10.14 |
| 내일배움캠프 69일차 TIL [최종 프로젝트 Black Chamber] (0) | 2025.10.13 |

