🗓️ 오늘 하루 일정
✅ 오전
- 10:00 ~ 12:10 : Blood 프리팹 추가·수정, Stage4 머니스포너/철문/탈출구 배치, Title GIF 적용
🍽️ 점심시간
- 13:00 ~ 14:00 : 점심
✅ 오후
- 14:10 ~ 15:10 : 로딩 씬 디자인 변경 & 재업로드, UI 브랜치 머지 정리
- 15:10 ~ 16:10 : 상점 UI 개편, 무기 등급 데이터 연동, Gun 이미지 픽셀 크기/Point 교체, GunData 재적용
- 16:10 ~ 16:40 : 총구 위치 오류 수정, 타이틀 마지막 프레임 반짝임 Fix
- 16:40 ~ 17:10 : 벽/문/철문 & 플레이어 근접공격 사운드 추가·Fix, 에임 조준 시 카메라 크기 조정, 미니맵 라이트 씬 추가, FOW(전장의 안개) 수정, Stage2·3 스테이지 손질, 다수 브랜치 머지
🍽️ 저녁시간
- 18:00 ~ 19:00 : 저녁
✅ 저녁
- 20:00 ~ 21:00 : 팀원들과 저녁 스크럼
✅ 오늘 학습 키워드
Title GIF 루프, Blood Decal, LayerMask & 2D Trigger, GunPrefabInfo.firePointOffset 적용, UI Image Preserve Aspect, FOW 튜닝, Aim Zoom
✅ 오늘 학습 한 내용을 나만의 언어로 정리하기
- 데이터 파이프라인: 원격(Firebase) GunData + 로컬 GunPrefabInfo(SO) 를 합쳐 사용. 수치/메타는 GunData, 에셋·오프셋(아이콘/애니메이터/firePointOffset)은 SO 기준.
- 총구 위치는 Shooter 생성 후에도 gunPoint 교체 시 재적용 필요 → ApplyFirePointOffset()로 고정.
- 아이콘 찌부 현상은 UI Image의 Preserve Aspect로 해결(가능하면 Type=Simple).
🧩 학습하며 겪었던 문제점 & 에러
- 총알 충돌 사운드가 안 울림 (2D/LayerMask 비교 오류)
- 문제정의: OnTriggerEnter(3D 콜백) + LayerMask == layer 비교로 트리거 미동작.
- 시도: 충돌 레이어 로그만 찍힘.
- 해결방법: 2D 콜백으로 변경 + 비트마스크 포함 여부로 비교.
- 코드:
- private void OnTriggerEnter2D(Collider2D other) { int mask = 1 << other.gameObject.layer; if ( (wallSoundLayer.value & mask) != 0 ) StructSoundManager.Instance.PlayWallAttackSound(transform.position); else if ( (doorSoundLayer.value & mask) != 0 ) StructSoundManager.Instance.PlayDoorAttackSound(transform.position); else if ( (steelDoorSoundLayer.value & mask) != 0 ) StructSoundManager.Instance.PlaySteelDoorAttackSound(transform.position); }
- 배운점: 2D 물리는 2D 콜백, LayerMask는 비트 연산으로 판정.
- 다시 만나면: Physics2D Collision Matrix 먼저 체크 → 콜백/마스크 순으로 검증.
- firePointOffset이 실제 발사점에 반영되지 않음
- 문제정의: SO의 오프셋을 넣었지만 Shooter.gunPoint 교체 시 초기 오프셋이 유실.
- 해결방법: SO 값을 캐시하고 바인딩 직후 재적용.
- 코드:
- // Shooter.cs private Vector2? _prefabFireOffset; public void Initialize(GunData gd) { _prefabFireOffset = gd?.prefabInfo != null ? gd.prefabInfo.firePointOffset : (Vector2?)null; ApplyFirePointOffset(); } public void BindGunPoint(Transform t) { gunPoint = t; ApplyFirePointOffset(); } public void ApplyFirePointOffset() { if (gunPoint == null || !_prefabFireOffset.HasValue) return; var o = _prefabFireOffset.Value; gunPoint.localPosition = new Vector3(o.x, o.y, 0f); }
- 배운점: 데이터 출처는 SO 기준(Firebase 값과 분리). 바인딩 순서에 민감.
- 다시 만나면: Initialize → Bind → Apply 3단계 보일러플레이트 유지.
- 상점 아이콘 비율 깨짐
- 해결: Image.preserveAspect = true + Type=Simple, 필요 시 Compression=None/Low로 선명도 확보.
📝 메모
오늘은 **비주얼(Title GIF, 로딩 씬, 아이콘)**과 전투 감각(사운드, 총구 위치, 에임 카메라, FOW) 를 동시에 끌어올렸다. 특히 데이터 흐름을 다시 정리하면서 “SO가 외형/오프셋의 단일 진실원천”이라는 원칙을 확실히 박아넣은 게 큰 수확. 내일은 Stage 폴리싱과 상점 UX 마지막 마감까지 밀어보자. 한 걸음씩, 꾸준히! ✊
'스파르타 코딩클럽 > TIL작성' 카테고리의 다른 글
| 내일배움캠프 83일차 TIL [최종 프로젝트 Black Chamber] (0) | 2025.10.31 |
|---|---|
| 내일배움캠프 82일차 TIL [최종 프로젝트 Black Chamber] (0) | 2025.10.30 |
| 내일배움캠프 80일차 TIL [최종 프로젝트 Black Chamber] (1) | 2025.10.28 |
| 내일배움캠프 79일차 TIL [최종 프로젝트 Black Chamber] (0) | 2025.10.27 |
| 내일배움캠프 78일차 TIL [최종 프로젝트 Black Chamber] (0) | 2025.10.24 |
