no image
내일배움캠프 66일차 TIL [최종 프로젝트 Black Chamber]
🗓️ 오늘 하루 일정✅ 오전09:00 ~ 10:30 : UIBase에 DOTween 프리셋(오픈/클로즈+유틸) 설계 정리10:30 ~ 12:00 : 로딩 화면 구조 재설계(전용 카메라/레이어 분리 초안)🍽️ 점심시간13:00 ~ 14:00 : 점심시간✅ 오후14:00 ~ 16:30 : LoadingCanvas 구현 보강(활성 보장, 최소 2초 노출) · UIRoot.HideAllSceneUIs() 추가16:30 ~ 18:00 : 로딩 전용 카메라 세팅(SS-Camera, CullingMask) 및 씬 전환 흐름 점검🍽️ 저녁시간18:00 ~ 19:00 : 저녁시간✅ 저녁19:00 ~ 20:30 : Dimmer 색감/알파 수정, 팝업들에 DOTween 적용20:30 ~ 21:00 : QA 피드백 반영..
2025.09.30
no image
내일배움캠프 65일차 TIL [최종 프로젝트 Black Chamber]
🗓️ 오늘 하루 일정✅ 오전10:00 ~ 11:00 : 최종 프로젝트 발제 진행11:00 ~ 12:00 : UI 버그 및 타이틀 사운드 버그 수정🍽️ 점심시간13:00 ~ 14:00 : 점심✅ 오후14:00 ~ 16:00 : NPC 대사 컨텍스트 설계(FirstMeet/Fail/Clear 등) 초안 → 보류/원복 결정16:00 ~ 18:00 : 씬 전환 로딩 흐름 검토SceneLoader/SceneInitializer로 2초 노출 후 전환 시나리오 작성최종적으로 로딩 씬 대신 “UI 오버레이” 방식으로 전환 결정✅ 저녁19:00 ~ 21:00 : 로딩 UI 연출 기획Shift 애니메이션 이벤트(AE_RunOn/AE_RunOff)로 Run 토글 + 스태미나 바 증감 데모 설계DOTween 트랜지션(암살..
2025.09.29
no image
내일배움캠프 64일차 TIL [최종 프로젝트 Black Chamber]
🗓️ 오늘 하루 일정✅ 오전09:00 ~ 11:30 : 인터랙션 정리(F 키 프롬프트 고정, Door/NPC 상호작용 로직 점검)11:30 ~ 12:00 : NPC 대화 트리거 구조 재정비(부모/자식 탐색 보강)🍽️ 점심시간13:00 ~ 14:00 : 점심시간✅ 오후14:00 ~ 16:30 : Pause/Setting UI 버그 트러블슈팅(Start 비활성화 이슈 제거)16:30 ~ 18:00 : 로비 씬에서 Lobby 버튼 자동 숨김 처리🍽️ 저녁시간18:00 ~ 19:00 : 저녁시간✅ 저녁19:00 ~ 21:00 : 팀 QA & 저녁 스크럼 / Fog of War 빛 새어 나옴 보정(팽창+충돌 스캔 튜닝)✅ 오늘 학습 키워드인터랙션 시스템OnTrigger 탐색월드 고정 UIPause/Setti..
2025.09.26
no image
내일배움캠프 63일차 TIL [최종 프로젝트 Black Chamber]
🗓️ 오늘 하루 일정✅ 오전09:00 ~ 12:00 : 탄약 로직 재정리(매거진/맥스아모 분리), Shooter 초기화·리로드 점검🍽️ 점심시간13:00 ~ 14:00 : 점심시간✅ 오후14:00 ~ 17:50 : 무탄 시 펀치(Animator Bool) 1회 펄스 구현, HUD 표기(왼쪽=매거진/오른쪽=리저브) 동기화17:50 ~ 18:00 : InputAction 네임스페이스 에러( CS0246 ) 수정🍽️ 저녁시간18:00 ~ 19:00 : 저녁시간✅ 저녁19:00 ~ 21:00 : 팀 저녁 스크럼(QA) 및 TODO 정리완료(–) : 로비 총 발사 불가진행 예정 : NPC 대화 힌트, 적 사망 시 라이트 끄기, 튜토 구역 탄 수급→사격, 인터랙션 F UI공통 이슈 메모 : 튜토 시작 방향/문..
2025.09.25
no image
내일배움캠프 62일차 TIL [최종 프로젝트 Black Chamber]
🗓️ 오늘 하루 일정✅ 오전09:00 ~ 10:30 : AudioMixer 정리(Expose: MasterVolume / BGMVolume / SFXVolume), 그룹 라우팅 점검10:30 ~ 12:00 : SoundManagerBase 간소화(매니저별 outputGroup 1개만 유지, 풀 AudioSource 라우팅)🍽️ 점심시간13:00 ~ 14:00 : 점심시간✅ 오후14:00 ~ 16:30 : BGMManager 리팩토링(Title/Lobby/Game 컨텍스트 + A/B 교차페이드)16:30 ~ 18:00 : 씬 진입 훅 연결 — SceneInitializer.Start() → BGMManager.SetUiContext(activeUI, true) 적용, 전환 테스트🍽️ 저녁시간18:00..
2025.09.24
no image
내일배움캠프 61일차 TIL [최종 프로젝트 Black Chamber]
🗓️ 오늘 하루 일정✅ 오전09:00 ~ 09:30 : 데일리 스크럼(AM) — 오늘 목표 정리09:30 ~ 11:30 : BGMManager SoundData 연동, 교차 페이드(2 AudioSource) 적용11:30 ~ 12:50 : VolumeSettings(BGM/SFX 마스터) 도입 및 저장/이벤트 확인🍽️ 점심시간13:00 ~ 14:00 : 점심시간✅ 오후14:00 ~ 16:00 : SoundManagerBase에서 SFX 마스터 볼륨 일원화(PlayOne/PlayRandom)16:00 ~ 17:30 : UI 슬라이더(배경/효과음) 연동 — 실시간 반영/PlayerPrefs 동작 점검17:30 ~ 18:00 : GameManager 페이즈 연동(잠입↔난전) BGM 전환 테스트🍽️ 저녁시..
2025.09.23
no image
내일배움캠프 60일차 TIL [최종 프로젝트 Black Chamber]
🗓️ 오늘 하루 일정✅ 오전09:00 ~ 10:00 : 전날 회의록 다시보기, 오늘 목표 정리10:00 ~ 13:00 : WeaponManager(현재 무기 타입 단일 소스) 설계/구현, BulletManager 단순화(타입은 조회만)🍽️ 점심시간13:00 ~ 14:00 : 점심시간✅ 오후14:00 ~ 16:30 : 무기 전환 플로우 정리WeaponSwitchCoordinator를 리스너 전용으로 변경(이벤트 구독 → 애니 스왑)HUD를 보기 전용으로 변경(OnWeaponChanged/OnAmmoChanged 구독)16:30 ~ 18:00 : Shooter 리팩토링(피스톨/라이플 완전 분기: 총구/데이터/쿨다운/사운드)🍽️ 저녁시간18:00 ~ 19:00 : 저녁시간✅ 저녁19:00 ~ 21:00 ..
2025.09.22
no image
내일배움캠프 59일차 TIL [최종 프로젝트 Black Chamber]
🗓️ 오늘 하루 일정✅ 오전09:00 ~ 10:00 : 전날 회의록 다시보기10:00 ~ 13:00 : 팀 오전 스크럼 진행 & 개발🍽️ 점심시간13:00 ~ 14:00 : 점심시간✅ 오후14:00 ~ 16:30 : 팀원 작업 상황 체크 & 지원(이슈 파악·우선순위 정리)16:30 ~ 18:00 : 사운드 매니저 제작 및 리팩토링(캐릭터/웨폰 구조 정리)🍽️ 저녁시간18:00 ~ 19:00 : 저녁시간✅ 저녁19:00 ~ 21:00 : 팀 데일리 스크럼(저녁) — 진행 상황 공유, 내일 작업 정리✅ 오늘 학습 키워드AudioSource 풀(라운드로빈) / SFX 랜덤 재생캐릭터·웨폰 사운드 분리(걷기/뛰기/피격/사망/권총/라이플/장전)인터랙션 인터페이스 적용(문 열기 리팩토링)ESC 일시정지(현재 ..
2025.09.19
반응형

🗓️ 오늘 하루 일정

✅ 오전

  • 09:00 ~ 10:30 : UIBase에 DOTween 프리셋(오픈/클로즈+유틸) 설계 정리
  • 10:30 ~ 12:00 : 로딩 화면 구조 재설계(전용 카메라/레이어 분리 초안)

🍽️ 점심시간

  • 13:00 ~ 14:00 : 점심시간

✅ 오후

  • 14:00 ~ 16:30 : LoadingCanvas 구현 보강(활성 보장, 최소 2초 노출) · UIRoot.HideAllSceneUIs() 추가
  • 16:30 ~ 18:00 : 로딩 전용 카메라 세팅(SS-Camera, CullingMask) 및 씬 전환 흐름 점검

🍽️ 저녁시간

  • 18:00 ~ 19:00 : 저녁시간

✅ 저녁

  • 19:00 ~ 20:30 : Dimmer 색감/알파 수정, 팝업들에 DOTween 적용
  • 20:30 ~ 21:00 : QA 피드백 반영/커밋
    • [Fix] Loading 2초로 수정
    • [Fix] UI Dimmer 색 수정
    • [Fix] UIBase 두트윈 추가

✅ 오늘 학습 키워드

  • DOTween 프리셋(Scale/Fade/Slide/Drop, Pulse/Shake/Punch)
  • CanvasGroup · Dimmer(블록/페이드 분리)
  • LoadingCanvas(독립 카메라/레이어, 최소 노출, 비동기 로드)
  • UIRoot.HideAllSceneUIs() · 씬 전환 시 UI 상태 관리
  • SceneManager.sceneLoaded 훅 · DontDestroyOnLoad 싱글톤 초기화
  • 카메라 Culling Mask / Screen Space - Camera

✅ 오늘 학습 한 내용을 나만의 언어로 정리하기

  • UI 연출을 공통화하면 개별 UI 스크립트가 단순해진다. UIBase에서 프리셋만 바꿔도 일관된 퀄리티를 유지할 수 있다.
  • 로딩 화면은 씬 카메라와 분리해야 안정적이다. 전용 카메라 + 전용 레이어로 그리면 어떤 씬/카메라 구도에서도 동일한 연출을 보장한다.
  • 씬 이동 중에는 현재 씬 UI를 일괄 숨김 → 로딩만 노출 → 새 씬 SceneInitializer가 ShowOnly(activeUI)로 정리.
  • Dimmer는 입력 차단(blocksRaycasts)시각(Fade) 을 분리해 제어하면 버그가 줄어든다.

🧩 학습하며 겪었던 문제점 & 에러

1) Coroutine couldn't be started ... 'LoadingCanvas' is inactive!

  • 문제 정의: 비활성 오브젝트에서 코루틴 시작 시 예외 발생.
  • 시도: OpenUI() 호출 순서 조정, SetActive(true) 보장.
  • 해결 코드:포인트: 로딩 GO는 비활성로 숨기지 말고 CanvasGroup.alpha=0로 숨기는 편이 안전.
  • public static Coroutine LoadScene(string name) { if (!Instance.gameObject.activeSelf) Instance.gameObject.SetActive(true); if (!Instance.enabled) Instance.enabled = true; return Instance.StartCoroutine(Instance.CoLoad(name)); }
  • 새롭게 알게 된 점: StartCoroutine은 활성 컴포넌트에서만 동작.
  • 다시 만나면: 공용 오버레이는 항상 활성 유지 + 알파로 제어.

2) 로딩 화면 구도가 씬마다 달라서 오브젝트가 화면 밖으로 벗어남

  • 문제 정의: 로딩 중 월드 오브젝트(플레이어 스프라이트/타일)가 메인 카메라 구도에 의존.
  • 해결: 로딩 전용 카메라로 분리, 해당 오브젝트는 LoadingWorld 레이어로 렌더.
  • // Awake in LoadingCanvas overlayCanvas.renderMode = RenderMode.ScreenSpaceCamera; overlayCanvas.worldCamera = loadingCamera; loadingCamera.cullingMask = LayerMask.GetMask("LoadingWorld"); loadingCamera.depth = 1000; // 항상 최상단
  • 새롭게 알게 된 점: 오버레이는 카메라 독립성이 핵심.
  • 다시 만나면: 전용 카메라 + 전용 레이어 설계부터 시작.

3) 로딩 중 플레이어 공격 SFX가 들림

  • 문제 정의: 씬 교체 중 입력/애니메이션 잔재로 SFX 출력.
  • 해결(믹서 파라미터 뮤트):
    • UIRoot.HideAllSceneUIs()로 UI 정리, 필요 시 PlayerInput.enabled = false 병행.
  • // OnOpen / OnClose in LoadingCanvas mixer.GetFloat("SFXVol", out prev); mixer.SetFloat("SFXVol", -80f); // 로딩 시작 시 // ... mixer.SetFloat("SFXVol", prev); // 로딩 종료 시
  • 새롭게 알게 된 점: 오디오는 스냅샷/파라미터 방식이 가장 안정적.
  • 다시 만나면: 로딩 시작 훅에서 입력/사운드 모두 차단.

📝 메모

오늘은 UI 공통화(DOTween)로딩 파이프라인 안정화 두 축을 확실히 잡았다.

디테일(딤머 색·알파, 최소 노출 2초)까지 손보고 나니 화면 전환이 훨씬 매끈해졌다.

내일은 로딩 중 SFX 완전 차단과 스태미나 초기화, 커서 정책을 마무리하고 스테이지2 잔업을 닫자.

내일도 화이팅!!!


 

반응형
반응형

🗓️ 오늘 하루 일정

✅ 오전

  • 10:00 ~ 11:00 : 최종 프로젝트 발제 진행
  • 11:00 ~ 12:00 : UI 버그타이틀 사운드 버그 수정

🍽️ 점심시간

  • 13:00 ~ 14:00 : 점심

✅ 오후

  • 14:00 ~ 16:00 : NPC 대사 컨텍스트 설계(FirstMeet/Fail/Clear 등) 초안 → 보류/원복 결정
  • 16:00 ~ 18:00 : 씬 전환 로딩 흐름 검토
    • SceneLoader/SceneInitializer로 2초 노출 후 전환 시나리오 작성
    • 최종적으로 로딩 씬 대신 “UI 오버레이” 방식으로 전환 결정

✅ 저녁

  • 19:00 ~ 21:00 : 로딩 UI 연출 기획
    • Shift 애니메이션 이벤트(AE_RunOn/AE_RunOff)로 Run 토글 + 스태미나 바 증감 데모 설계
    • DOTween 트랜지션(암살/어두움/거친) 구상, Laser Wipe(좌→우) 프로토타입 → 내일 적용으로 연기

✅ 오늘 학습 키워드

  • UI 오버레이 기반 로딩 연출(비동기 로드 + 최소 노출 시간 보장)
  • 애니메이션 이벤트로 상태 연동(Run Bool, 스태미나 증감)
  • RectMask2D 와이프 연출의 앵커/피벗 설계(좌측 고정)
  • DOTween 시퀀스 SetUpdate(true)(unscaled 타임) 활용
  • 씬 전환 설계 의사결정: 로딩 씬 vs 로딩 UI

✅ 오늘 학습 한 내용을 나만의 언어로 정리하기

  • 로딩은 씬 갈아타기보다 UI 오버레이가 유지보수에 유리했다. 동일 씬 내에서 비동기 로드를 돌리고 최소 2초 노출만 보장하면, 전역 상태나 입력 차단도 한 곳에서 관리 가능했다.
  • 입력 없이도 애니메이션 이벤트만으로 Run 상태와 스태미나 바를 자연스럽게 연동할 수 있었다. 로딩 데모엔 이게 가장 단순하고 견고했다.
  • Laser Wipe(좌→우 채움)는 본체가 아니라 마스크 컨테이너anchorMin(0,0) / anchorMax(0,1) / pivot(0,0.5) 가 핵심이었다. 이걸 틀리면 “가운데에서 양쪽 확장”으로 보인다.
  • unscaledDeltaTime 기반으로 트윈을 돌리면 로딩/일시정지에서도 연출이 끊기지 않는다.

🧩 학습하며 겪었던 문제점 & 에러

1) Laser Wipe가 중앙에서 양쪽으로 벌어짐

  • 정의: 좌→우 채움이 아닌, 중앙 기준으로 확장되는 현상
  • 시도: 트윈 이징/스케일 조정, 마스크 크기 수동 세팅
  • 해결: RectMask2D 컨테이너를 좌측 고정(anchorMin=(0,0), anchorMax=(0,1), pivot=(0,0.5)) 으로 강제. Edge 이미지는 우측 고정으로 이동
  • 새롭게 알게 된 점: 와이프 방향은 마스크 컨테이너의 기준점에 의해 결정된다
  • 다시 만나면: 초기화 단계에서 앵커/피벗을 코드로 강제 세팅하고, LayoutRebuilder.ForceRebuildLayoutImmediate로 치수 확정 후 트윈 시작

2) 로딩 흐름(로딩 씬 vs UI) 의사결정 충돌

  • 정의: SceneInitializer 코루틴 방식(로딩 씬 2초 노출)과 UI 오버레이 방식 중 무엇을 쓸지 혼선
  • 시도: SceneLoader + SceneInitializer로 2초 보장 구현 → 호출부 치환 부담 발생
  • 해결: 로딩 UI 오버레이로 전환(입력 차단/연출/최소 노출을 한 곳에서 처리)
  • 새롭게 알게 된 점: 씬 간 공용 규칙이 많을수록 UI 오버레이가 변경 비용이 낮다
  • 다시 만나면: 초기에 전역 오버레이 1개를 DontDestroyOnLoad로 두고, 라우팅은 유지하되 UI가 최종 제어

📝 메모

  • 내일: 로딩 오버레이 실제 적용(2초 보장 + allowSceneActivation 타이밍), Laser Wipe(좌→우/우→좌) 트윈 값 튜닝, “암살/거친/느와르” 톤 프리셋화
  • 대사 컨텍스트 로직은 스펙 유지, 구현은 배치 안정화 후 재개
  • 오버레이에서 CanvasGroup.blocksRaycasts로 입력 차단 표준화, 사운드/블룸으로 연출 보강

반응형
반응형

🗓️ 오늘 하루 일정

✅ 오전

  • 09:00 ~ 11:30 : 인터랙션 정리(F 키 프롬프트 고정, Door/NPC 상호작용 로직 점검)
  • 11:30 ~ 12:00 : NPC 대화 트리거 구조 재정비(부모/자식 탐색 보강)

🍽️ 점심시간

  • 13:00 ~ 14:00 : 점심시간

✅ 오후

  • 14:00 ~ 16:30 : Pause/Setting UI 버그 트러블슈팅(Start 비활성화 이슈 제거)
  • 16:30 ~ 18:00 : 로비 씬에서 Lobby 버튼 자동 숨김 처리

🍽️ 저녁시간

  • 18:00 ~ 19:00 : 저녁시간

✅ 저녁

  • 19:00 ~ 21:00 : 팀 QA & 저녁 스크럼 / Fog of War 빛 새어 나옴 보정(팽창+충돌 스캔 튜닝)

✅ 오늘 학습 키워드

인터랙션 시스템

OnTrigger 탐색

월드 고정 UI

Pause/Setting UI, 씬 분기 UI

Fog of War, 텍스처 필터(Point)

장애물 팽창(Inflate)

밀폐공간 채우기(Flood Fill)


✅ 오늘 학습 한 내용을 나만의 언어로 정리하기

  • 인터랙션: 트리거가 자식, 인터랙션 스크립트가 부모에 있을 수 있으므로, 플레이어 측에서 GetComponent뿐 아니라 Parent/Children까지 탐색해야 안정적이다.
  • F 키 프롬프트: 플레이어가 회전해도 월드 좌표 오프셋(x,y) 로만 배치하고 회전은 0도로 고정하면 깔끔하다.
  • Pause/Setting UI: 다른 스크립트가 켠 UI를 Start()에서 다시 끄는 이중 토글 실수가 잦다. UI 초기 상태는 프리팹/씬에서 관리하고, 열고 닫는 책임은 열람 함수로 일원화한다.
  • 씬 분기 UI: 현재 씬이 Lobby라면 Lobby 버튼 숨김, 그 외 씬에선 표시 — 씬 의존 UI는 열릴 때 한 번 판단해서 상태 맞춘다.
  • Fog of War: 빛이 벽 너머로 번지는 건 주로 텍스처 보간(Bilinear)스캔 간극 때문이다. 표시용 텍스처를 FilterMode.Point로 고정하고, 장애물은 연속 반경 팽창 + 밀폐 공간 채우기로 누수를 줄인다.

🧩 학습하며 겪었던 문제점 & 에러

1) NPC 대화가 뜨지 않음

  • 문제 정의: Door는 잘 뜨는데 NPC만 대화 UI가 안 열림.
  • 시도: 태그/콜라이더 확인. GetComponent<Iinteraction>()만 사용.
  • 해결 방법:→ 부모/자식까지 탐색하도록 보강. NPC 트리거 오브젝트에 Interaction 태그, IsTrigger 확인.
  •  
  • 새롭게 알게 된 점: 아트/콜라이더 구조가 바뀌면 접점 오브젝트가 달라진다. 탐색 폭을 넓혀 방어적으로 처리.
  • 다시 만나면: 인터랙션 공용 헬퍼(확장 메서드)로 캡슐화해 재사용.
var interactable =
    other.GetComponent<Iinteraction>() ??
    other.GetComponentInParent<Iinteraction>() ??
    other.GetComponentInChildren<Iinteraction>();

2) Interact 콜백 NullReference

  • 문제 정의: 'performed' callbacks에서 NRE 발생.
  • 시도: 호출 체인 추적(NPCStageSelectTrigger → UIManager.Open).
  • 해결 방법: 레퍼런스 누락 보완 및 순서 보장(싱글톤 초기화 확인).
  • 새롭게 알게 된 점: 입력 콜백은 프레임 어디서든 불릴 수 있어 초기화 순서가 중요.
  • 다시 만나면: OnEnable에서 안전 가드, ?. 사용, 초기화 완료 플래그 도입.

3) Pause/Setting UI가 다시 꺼짐

  • 문제 정의: 다른 곳에서 활성화했는데, Start()에서 gameObject.SetActive(false)로 재비활성화.
  • 해결 방법: Start()의 강제 비활성화 제거, 열릴 때만 상태 조정. 씬 분기는 다음처럼:
  •  
  • 새롭게 알게 된 점: UI의 생명주기 책임을 한 곳으로 모아야 이중 토글을 피한다.
  • 다시 만나면: UI Open/Close 전용 진입점만 사용(외부에서 직접 SetActive 금지).
void UpdateLobbyButtonVisibility() {
    bool isLobby = SceneManager.GetActiveScene().name == lobbySceneName;
    lobbyButton.gameObject.SetActive(!isLobby);
}

4) Fog of War가 벽을 넘어서 새어 나옴

  • 문제 정의: 벽에 붙으면 반대쪽으로 광량이 스며듦.
  • 시도: 스캔 간격/텍스처 설정 점검.
  • 해결 방법:
    • 표시 텍스처를 Point 필터로: fogPlaneTextureLerpBuffer.filterMode = FilterMode.Point;
    • 스캔 간격 축소: scanSpacingPerUnit ↓
    • 장애물 연속 반경 팽창:
    • InflateObstaclesFloat(0.6f); // 연속 반경(타일 단위)
    • 밀폐 공간 채우기(Flood Fill로 외부 도달 불가 영역 Obstacle 처리):
    • FillEnclosedSpaces(); // 방 내부 테두리만 잡히던 현상 해결
  • 새롭게 알게 된 점: 렌더 단계(필터)와 데이터 단계(스캔/팽창/채움)를 같이 만져야 시각적 누수를 확실히 잡을 수 있다.
  • 다시 만나면: 테스트 맵에 벽 두께/코너/문 다양한 케이스를 배치해 리그레션 체크.

5) F 키 프롬프트가 플레이어 회전에 따라 돌아감

  • 문제 정의: 플레이어가 회전하면 UI도 같이 회전.
  • 해결 방법: 월드 좌표 기준 오프셋 + 회전 고정.
transform.position = target.position + new Vector3(offsetX, offsetY, z);
transform.rotation = Quaternion.identity; // 회전 무시
  • 새롭게 알게 된 점: “월드 기준” 고정이 필요할 땐 부모-자식 대신 LateUpdate에서 직접 배치가 가장 단순하고 확실.
  • 다시 만나면: 부모 스케일/flip 영향 제거 옵션 유지.

📝 메모

오늘은 작은 실수 하나가 UI 전체 흐름을 꼬이게 만들 수 있다는 걸 다시 느꼈다. 그래도 원인을 딱 집어내고, 씬 분기/입력/인터랙션/포그워까지 각 시스템의 책임 경계를 더 명확히 정리했다. 생각보다 모르고 있었구나 싶었지만, 모르는 걸 부끄러워하지 말자. 팀 QA에서 나온 피드백도 바로 반영해서 한 단계 단단해진 느낌! 내일은 Fog of War 파라미터를 더 미세 조정하고, NPC 인디케이터(느낌표/물음표) 프리팹을 묶어서 상태 스위치까지 완성하자. 다음주도 화이팅!!!


반응형
반응형

🗓️ 오늘 하루 일정

✅ 오전

  • 09:00 ~ 12:00 : 탄약 로직 재정리(매거진/맥스아모 분리), Shooter 초기화·리로드 점검

🍽️ 점심시간

  • 13:00 ~ 14:00 : 점심시간

✅ 오후

  • 14:00 ~ 17:50 : 무탄 시 펀치(Animator Bool) 1회 펄스 구현, HUD 표기(왼쪽=매거진/오른쪽=리저브) 동기화
  • 17:50 ~ 18:00 : InputAction 네임스페이스 에러( CS0246 ) 수정

🍽️ 저녁시간

  • 18:00 ~ 19:00 : 저녁시간

✅ 저녁

  • 19:00 ~ 21:00 : 팀 저녁 스크럼(QA) 및 TODO 정리
    • 완료(–) : 로비 총 발사 불가
    • 진행 예정 : NPC 대화 힌트, 적 사망 시 라이트 끄기, 튜토 구역 탄 수급→사격, 인터랙션 F UI
    • 공통 이슈 메모 : 튜토 시작 방향/문, 스태미나 UI 연동, 재시작 모드 전환 버그, 사운드 노이즈 총, 설정 UI 디테일
    • 결정 : “잠입 다시 돌아가는” 흐름은 폐기, 체력 아이템 검토

✅ 오늘 학습 키워드

  • 탄약 모델: 매거진(현재 장전) / 맥스 아모(리저브) 구분
  • 올바른 리로드 흐름: 리저브 → 매거진 이동
  • ScriptableObject(데이터)는 런타임 불변 원칙
  • 무탄 시 입력 처리: Animator Bool 펄스
  • HUD 동기화 이벤트(OnAmmoChanged)
  • 새 Input System 네임스페이스 정리

✅ 오늘 학습 한 내용을 나만의 언어로 정리하기

탄약은 결국 “왼쪽(매거진)”과 “오른쪽(리저브)” 두 통장이다. 쏠 때는 왼쪽만 줄고, 장전은 오른쪽에서 왼쪽으로 돈을 이체한다. 이 단순한 규칙만 지키면 HUD도 자연스럽게 맞춰진다.

또 SO 값은 설계치이므로 런타임에 바꾸면 안 된다. 오늘 리로드 중에 SO를 건드려 용량이 줄어드는 버그를 확인하면서, 상태는 인스턴스가 들고, 설계값은 SO가 가진다는 선을 다시 확실히 했다.

무탄일 때는 “클릭 시 한 번만” 펀치 Bool을 켰다 끄는 펄스 방식이 가장 안정적이었다. 입력 홀드 중 중복 재생을 막고, 애니 전이도 깔끔했다.


🧩 학습하며 겪었던 문제점 & 에러

1) 리로드 중 SO 값을 변경해서 용량이 줄어드는 버그

  • 문제 정의: Reload()에서 gunData.maxMagazine / maxAmmo를 수정함.
  • 시도(잘못된 코드):
  • currentMagazine += toLoad; currentAmmo -= toLoad; gunData.maxMagazine = needed; // ❌ 설계값을 런타임에 변경 gunData.maxAmmo = needed; // ❌
  • 해결 코드:
  • int need = gunData.maxMagazine - currentMagazine; int move = Mathf.Min(need, currentAmmo); currentMagazine += move; // 왼쪽 채우기 currentAmmo -= move; // 오른쪽 줄이기 // SO는 건드리지 않음 ✅
  • 새롭게 알게 된 점: SO는 “룰북”, 인스턴스는 “점수판”.
  • 다시 만나면: SO를 절대 변경하지 않는 테스트(PlayMode Test) 추가.

2) InputAction 타입 미인식 (CS0246)

  • 문제 정의: PlayerInputController.Attack.cs에서 InputAction을 못 찾음.
  • 해결 코드:
  • using UnityEngine.InputSystem; // 상단 임포트 // 또는 public void OnAttack(UnityEngine.InputSystem.InputAction.CallbackContext ctx)
  • 알게 된 점: asmdef 사용 시 Unity.InputSystem 참조도 확인.

3) 무탄 시 펀치 애니메이션 한 번만 재생

  • 문제 정의: Bool 파라미터는 유지되므로 “클릭마다 1회”가 어려움.
  • 해결 코드(펄스):
  • IEnumerator CoPunchPulse(float t) { animationController.SetActiveShoot(false); animationController.SetActivePunch(true); yield return null; yield return new WaitForSeconds(t); animationController.SetActivePunch(false); } // 클릭 시작 시: if (!shooter.HasAnyAmmo) StartCoroutine(CoPunchPulse(0.12f));
  • 알게 된 점: Trigger 대신 Bool을 쓸 땐 코루틴 펄스가 간단·확실.

4) 탄약 초기화 꼬임(합계 이중집계)

  • 문제 정의: 시작 시 매거진과 리저브를 동시에 가득 채움.
  • 해결 코드(Initialize):
  • int cap = Mathf.Max(1, gunData.maxMagazine); int total = Mathf.Max(0, gunData.maxAmmo); currentMagazine = Mathf.Min(cap, total); currentAmmo = total - currentMagazine; WeaponManager.Instance?.OnAmmoChanged?.Invoke();
  • 알게 된 점: “총 보유 = 매거진 + 리저브” 불변식 유지가 핵심.

📝 메모

오늘은 단순한 규칙을 흐트러뜨리는 작은 예외가 얼마나 큰 버그로 이어지는지 다시 배웠다. 머릿속에서 당연했던 걸 코드로 명확히 옮기니 HUD, 애니, 입력까지 한 줄로 정리됐다. 저녁 스크럼에서 서로 할 일을 다시 나누니 마음도 가벼워졌다. 내일은 NPC 대화 힌트적 사망 시 라이트 끄기부터 차근차근 마무리하자. “모르는 걸 부끄러워하지 말자.” 꾸준히!

반응형
반응형

🗓️ 오늘 하루 일정

✅ 오전

  • 09:00 ~ 10:30 : AudioMixer 정리(Expose: MasterVolume / BGMVolume / SFXVolume), 그룹 라우팅 점검
  • 10:30 ~ 12:00 : SoundManagerBase 간소화(매니저별 outputGroup 1개만 유지, 풀 AudioSource 라우팅)

🍽️ 점심시간

  • 13:00 ~ 14:00 : 점심시간

✅ 오후

  • 14:00 ~ 16:30 : BGMManager 리팩토링(Title/Lobby/Game 컨텍스트 + A/B 교차페이드)
  • 16:30 ~ 18:00 : 씬 진입 훅 연결 — SceneInitializer.Start() → BGMManager.SetUiContext(activeUI, true) 적용, 전환 테스트

🍽️ 저녁시간

  • 18:00 ~ 19:00 : 저녁시간

✅ 저녁

  • 19:00 ~ 20:30 : 볼륨 UI 이미지 수정(슬라이더/아이콘), MixerVolumeUI와 최종 연동 테스트
  • 20:30 ~ 21:00 : 2D 라이트 초기 꺼짐 현상 수정(로직 옵션화)

✅ 오늘 학습 키워드

  • AudioMixer 그룹 라우팅(outputAudioMixerGroup)
  • 노출 파라미터와 dB 변환(0~1 ↔ dB: 20·log10(v))
  • 컨텍스트 기반 BGM(Title/Lobby/Game) + 이벤트 기반 Phase(잠입/난전) 전환
  • A/B 오디오소스 교차 페이드(코루틴, Time.unscaledDeltaTime)
  • 씬 초기화 지점에서의 BGM 컨텍스트 진입(SceneInitializer)

✅ 오늘 학습 한 내용을 나만의 언어로 정리하기

  • 설계 단순화: 각 사운드 매니저는 Mixer Group을 하나만 가진다. SFX 계열은 SFX, BGM은 BGM으로 라우팅해 UI에서 그룹별 볼륨만 조절한다.
  • UI ↔ Mixer 직접 매핑: 전역 스크립트 없이 MixerVolumeUI에서 슬라이더(0~1)를 Mixer 파라미터(dB)로 바로 세팅한다.
  • BGM 컨텍스트 분리: BGMManager.SetUiContext(UIKey)로 Title/Lobby/Game를 구분하고, Game일 때에만 OnPhaseChanged를 받아 잠입↔난전을 교차 페이드한다.
  • 씬 진입 한 줄 원칙: 각 씬의 SceneInitializer가 UI를 띄우는 동시에 BGM 컨텍스트도 넘겨서 초기에 무음/오재생을 방지한다.
  • 안정성 보강: SoundData.volume이 0일 때 무음되는 문제를 피하려고 타깃 볼륨 기본값(1.0) 폴백을 둔다. 라이트는 초기 프레임에 꺼지지 않도록 enable 토글 제거/옵션화했다.

🧩 학습하며 겪었던 문제점 & 에러

1) 게임에서 BGM이 안 들림(초기 진입 무음)

  • 문제 정의: 씬 로드 후 BGM이 시작되지 않거나 0 볼륨으로 고정.
  • 시도: BGMManager.Start()에서 기본 재생 호출, Mixer 파라미터 확인.
  • 해결 방법: 씬 초기화 시점에 컨텍스트를 명시적으로 전달.
  • // SceneInitializer.cs void Start() { uiRoot.ShowOnly(activeUI); BGMManager.Instance?.SetUiContext(activeUI, true); // ★ 컨텍스트 진입 }
  • 새롭게 알게 된 점: “누가 언제 첫 곡을 트리거하나?”를 명확히 해야 한다.
  • 다시 만나면: 씬 전환 유틸에 컨텍스트/사운드 초기화도 포함해 재사용한다.

2) 잠입/난전 전환이 안 됨

  • 문제 정의: 전투 상태가 바뀌어도 BGM이 그대로.
  • 시도: SetPhase() 직접 호출, 이벤트 로그 확인.
  • 해결 방법: Game 컨텍스트일 때만 이벤트 반영 + 이벤트 구독 확인.
  • // BGMManager.cs void OnEnable() => GameManager.Instance.OnPhaseChanged += OnPhaseChanged; void OnDisable()=> GameManager.Instance.OnPhaseChanged -= OnPhaseChanged; void OnPhaseChanged(GamePhase phase){ if (_inGameContext) SetPhase(phase, false); }
  • 새롭게 알게 된 점: 컨텍스트 플래그(게임/비게임)를 두면 Title/Lobby BGM을 보호할 수 있다.
  • 다시 만나면: 상태 머신/컨텍스트 다이어그램을 먼저 그린다.

3) 2D 라이트가 시작하자마자 꺼짐

  • 문제 정의: 타깃을 못 본 첫 프레임에 Light2D.enabled=false가 되어 장면이 어두움.
  • 시도: UpdateLight() 호출 타이밍 조정.
  • 해결 방법: 항상 켜고 색/세기만 바꾸거나, 옵션으로 토글.
  • // Enemy.cs [SerializeField] bool alwaysOnLights = true; public void UpdateLight() { bool on = alwaysOnLights || HasTarget || HasTargetInFOV; forwardLight.enabled = on; backwardLight.enabled = on; // 색상은 상태에 따라만 변경 }
  • 새롭게 알게 된 점: 초기 프레임 의존 로직은 시각적 글리치를 만든다.
  • 다시 만나면: 기본 상태(켜짐) + 상태별 가시 속성만 조정한다.

📝 메모

오늘은 사운드 파이프라인을 최대한 단순화해서 “관리 지점은 Mixer, 라우팅은 매니저별 한 줄”로 수렴시켰다. 씬 초기화 한 줄로 컨텍스트를 명확히 하니, 타이틀/로비/게임 BGM 흐름이 깔끔해졌고, 잠입↔난전 전환도 자연스럽다. 저녁엔 볼륨 UI 이미지까지 정리해서 완성도가 확실히 올라갔다. 내일은 전투 종료 판정/쿨타임과 페이드 타이밍을 더 다듬고, BGM 교체 중복 호출에 대한 디바운스까지 넣어 안정성을 높여보자. 잘했다, 내일도 화이팅!!!


반응형
반응형

🗓️ 오늘 하루 일정

✅ 오전

  • 09:00 ~ 09:30 : 데일리 스크럼(AM) — 오늘 목표 정리
  • 09:30 ~ 11:30 : BGMManager SoundData 연동, 교차 페이드(2 AudioSource) 적용
  • 11:30 ~ 12:50 : VolumeSettings(BGM/SFX 마스터) 도입 및 저장/이벤트 확인

🍽️ 점심시간

  • 13:00 ~ 14:00 : 점심시간

✅ 오후

  • 14:00 ~ 16:00 : SoundManagerBase에서 SFX 마스터 볼륨 일원화(PlayOne/PlayRandom)
  • 16:00 ~ 17:30 : UI 슬라이더(배경/효과음) 연동 — 실시간 반영/PlayerPrefs 동작 점검
  • 17:30 ~ 18:00 : GameManager 페이즈 연동(잠입↔난전) BGM 전환 테스트

🍽️ 저녁시간

  • 18:00 ~ 19:00 : 저녁시간

✅ 저녁

  • 19:00 ~ 20:00 : 미션 카운팅(A안) 재점검 — NotifyLogicalDeath() 호출 흐름 QA
  • 20:00 ~ 21:00 : Door 상호작용 NRE 재현 및 방어 로직/자동 할당 보완

✅ 오늘 학습 키워드

  • BGMManager × SoundData.volume × VolumeSettings.Bgm (교차 페이드, 실시간 스케일)
  • SoundManagerBase에서 SFX 마스터 일원화(VolumeSettings.Sfx)
  • UI 슬라이더 ↔ VolumeSettings.SetBgm/SetSfx 이벤트 연동
  • GamePhase(잠입/난전) ↔ BGM 전환(HUD 무관, 페이드 중심)
  • 미션 카운팅: MissionEntityHook.NotifyLogicalDeath() 중복 감소 방지
  • UnassignedReferenceException(Door.player) 원인/해결
  • C# 삼항 연산자와 void 호출 이슈 → Action 델리게이트로 해결

✅ 오늘 학습 한 내용을 나만의 언어로 정리하기

  • 볼륨 체계 단순화: 효과음은 어디서 재생하든 SoundManagerBase가 최종에 VolumeSettings.Sfx만 곱하면 된다. 개별 매니저에서 다시 곱하지 않아도 일관된다.
  • BGM은 ‘지금 재생 중’도 즉시 반영: OnBgmChanged를 구독해 현재 AudioSource 볼륨을 비율 유지로 스케일하면 슬라이더 움직임이 자연스럽다(교차 페이드 중에도).
  • 데이터 주도 오디오: SoundData에 곡 묶음과 기본 볼륨을 두고, 상황(잠입/난전)별로 랜덤 선택 + 페이드. 코드는 얇아지고 밸런싱은 데이터에서 조정한다.
  • 상태에 반응하는 BGM: GameManager.OnPhaseChanged만 잘 쏴주면, BGMManager는 페이즈에 맞춰 자연스럽게 전환된다.
  • 미션 카운팅의 진짜 ‘죽음’: 오브젝트 파괴/비활성에 의존하지 않고, 적의 Die() 지점에서 논리적 사망 알림을 보내면 풀링/시체 유지에도 정확하게 감소된다.
  • NRE 방지 습관: 상호작용 대상(문)은 IInteractable.Interact(Transform interactor)로 주체 Transform을 넘겨 결합을 낮추고, 자동 할당/널 가드로 에러를 줄인다.
  • 삼항 연산자의 한계: void 메서드 호출을 삼항으로 묶을 수 없다. 대신 호출할 함수를 고르는 Action 삼항이 안전하다.

🧩 학습하며 겪었던 문제점 & 에러

1) Door UnassignedReferenceException

  • 문제정의: Door.player가 비어 있어 player.forward 접근 시 NRE 발생.
  • 시도: 인스펙터 수동 할당 → 프리팹/런타임 스폰에서 누락 자주 발생.
  • 해결방법: 인터랙터 전달 + 자동 할당 + 널 가드.
public interface IInteractable { void Interact(Transform interactor); }

public class Door : MonoBehaviour, IInteractable
{
    [SerializeField] Transform player;
    void Awake()
    {
        if (!player)
        {
            var p = GameObject.FindGameObjectWithTag("Player");
            if (p) player = p.transform;
        }
    }

    public void Interact(Transform interactor)
    {
        var actor = interactor ? interactor : player;
        if (!actor) return; // 안전 가드
        Vector3 fwd = actor.forward;
        // 여는 로직...
    }
}
  • 새롭게 알게 된 점: 상호작용 주체 전달이 가장 견고하다.
  • 다시 만나면: 프리팹 가이드에 태그/자동 할당 규칙을 문서화한다.

2) SFX 이중 볼륨 곱 문제

  • 문제정의: 매니저 단에서 Sfx를 또 곱해 이중 감쇄가 발생할 수 있음.
  • 해결방법: SoundManagerBase에서만 곱한다.
// SoundManagerBase
public void PlayRandom(SoundData data, float volume = 1f)
{
    var clip = data.clips[Random.Range(0, data.clips.Length)];
    float finalVol = Mathf.Clamp01(volume * data.volume) * VolumeSettings.Sfx;
    AcquireSource().PlayOneShot(clip, finalVol);
}
  • 포인트: 각 매니저는 로컬 스케일만 넘긴다(weaponVol, characterVol).

3) BGM 실시간 반영/페이드 타깃 스코프 이슈

  • 문제정의: 코루틴 내부에서 지역 data.volume을 직접 참조해 스코프/레이스가 생길 수 있음.
  • 해결방법: 타깃 볼륨을 인자로 넘기고, 마스터 변경 시 비율 유지 스케일.
// SetPhase에서
_phaseBaseVolume = Mathf.Clamp01(data.volume);
float target = _phaseBaseVolume * VolumeSettings.Bgm;
_fade = StartCoroutine(CrossFade(from, to, toStart:0f, targetVolume:target));

// 마스터 변경 시
void ApplyMasterBgm(float master)
{
    float newTarget = _phaseBaseVolume * Mathf.Clamp01(master);
    if (_a && _a.isPlaying) _a.volume = newTarget * (_lastTarget > 0 ? _a.volume/_lastTarget : 0f);
    if (_b && _b.isPlaying) _b.volume = newTarget * (_lastTarget > 0 ? _b.volume/_lastTarget : 0f);
    _lastTarget = newTarget;
}
  • 새롭게 알게 된 점: “현재 볼륨 ÷ 직전 타깃” 비율을 유지하면 페이드 중에도 깨끗하게 따라간다.

4) 삼항 연산자로 void 호출 묶기 실패

  • 문제정의: ?:는 을 만드는 표현식이어서 void 호출을 직접 못 묶음.
  • 해결방법: Action으로 선택 → 한 번 호출.
Action play = isPistol
    ? WeaponSoundManager.Instance.PlayPistolShootSound
    : WeaponSoundManager.Instance.PlayRifleShootSound;
play();
  • 다시 만나면: “표현식 vs 문(statement)” 차이를 먼저 떠올린다.

📝 메모

오늘은 오디오 파이프라인 정리 Day 였다.

볼륨은 중앙에서 일괄, BGM은 상태 기반 + 실시간 스케일, SFX는 간결하게 — 구조가 훨씬 가벼워졌다. 미션 카운팅도 “논리적 사망”으로 고쳐서 풀링과 시체 유지에 흔들리지 않는다. 사소해 보이는 널 가드/인터페이스 패턴이 런타임 안정성을 많이 올려준다는 걸 다시 느꼈다. 내일은 **Audio Mixer 연동(리미터/뮤트 토글)**과

로딩 씬에서의 BGM 유지/전환

까지 마무리해보고 싶다. 꾸준히, 차분하게 가자!


반응형
반응형

🗓️ 오늘 하루 일정

✅ 오전

  • 09:00 ~ 10:00 : 전날 회의록 다시보기, 오늘 목표 정리
  • 10:00 ~ 13:00 : WeaponManager(현재 무기 타입 단일 소스) 설계/구현, BulletManager 단순화(타입은 조회만)

🍽️ 점심시간

  • 13:00 ~ 14:00 : 점심시간

✅ 오후

  • 14:00 ~ 16:30 : 무기 전환 플로우 정리
    • WeaponSwitchCoordinator를 리스너 전용으로 변경(이벤트 구독 → 애니 스왑)
    • HUD를 보기 전용으로 변경(OnWeaponChanged/OnAmmoChanged 구독)
  • 16:30 ~ 18:00 : Shooter 리팩토링(피스톨/라이플 완전 분기: 총구/데이터/쿨다운/사운드)

🍽️ 저녁시간

  • 18:00 ~ 19:00 : 저녁시간

✅ 저녁

  • 19:00 ~ 21:00 : 팀 데일리 스크럼(저녁) — 진행 상황 공유
    • 적과 플레이어가 탄 상태를 공유하던 이슈 파악 → 임시로 GunData 쪽에서 개체별 관리로 분리
    • Unity Bug Reporter(크래시 리포터) 팝업 확인, 로그 확인 계획 수립

✅ 오늘 학습 키워드

  • 단일 소스 오브 트루스(SoT) : WeaponManager
  • 이벤트 기반 UI : OnWeaponChanged / OnAmmoChanged 구독
  • Input System 단계 : started / performed / canceled + 연사 처리
  • Animator 컨트롤러 스왑 & 파라미터 스냅샷/복원
  • ScriptableObject(SO) 스펙/런타임 상태 분리 원칙
  • NRE(NullReference) 방지: 널가드 + 실행 순서

✅ 오늘 학습 한 내용을 나만의 언어로 정리하기

  • 무기 타입은 한 곳에서만 바꾼다. WeaponManager가 바꾸고 이벤트로 알린다.
  • 탄 로직은 타입을 “조회만” 한다. BulletManager는 WeaponManager.CurrentWeapon 기준으로 발사/리로드 처리.
  • UI는 보기 전용이다. HUD는 이벤트를 구독해 그리기만 하고 상태를 절대 직접 변경하지 않는다.
  • Shooter는 무기별로 완전히 분기한다. 피스톨/라이플 각각 총구, GunData, 쿨다운, 사운드를 별도로 사용.
  • SO는 데이터 컨테이너. 런타임 수치를 SO에 직접 두면 공유 문제 발생 → 런타임 클래스로 분리하거나 런타임 인스턴스화 필요.

🧩 학습하며 겪었던 문제점 & 에러

1) 적/플레이어 탄 상태가 섞임

  • 문제 정의 : 동일 매니저/SO를 공유해서 탄창·예비탄이 서로 영향을 줌.
  • 시도 : 구조 점검, 참조 분리 테스트.
  • 해결 방법 : 임시로 GunData에서 개체별로 상태 관리하여 분리. 장기적으로는 SO=스펙, 런타임=컴포넌트/클래스 분리 예정.
  • 새롭게 알게 된 점 : SO는 에셋이라 상태가 공유된다.
  • 다시 만나면 : GunRuntime(컴포넌트)로 탄창 상태를 분리하거나 SO를 런타임 복제해서 사용.

2) 라이플로 전환 후 발사 시 HUD가 권총 탄으로 보임

  • 문제 정의 : 여러 스크립트가 무기 타입/표시를 각각 관리해 서로 덮어씀.
  • 시도 : HUD에서 수동 갱신, 전환 직후 강제 세팅.
  • 해결 방법 : HUD를 보기 전용으로 전환, WeaponManager.OnWeaponChanged와 BulletManager.OnAmmoChanged만 구독해 표시.
  • 새롭게 알게 된 점 : 상태 변경 주체는 반드시 한 곳이어야 한다.
  • 다시 만나면 : 전환 로직은 Manager 한 곳, HUD는 구독만.

📝 메모

  • 오늘은 총에대한 내용을 했는데 내일 좀 더 마무리 작업을 해봐야겠다. 내일도 화이팅!!

반응형
반응형

🗓️ 오늘 하루 일정

✅ 오전

  • 09:00 ~ 10:00 : 전날 회의록 다시보기
  • 10:00 ~ 13:00 : 팀 오전 스크럼 진행 & 개발

🍽️ 점심시간

  • 13:00 ~ 14:00 : 점심시간

✅ 오후

  • 14:00 ~ 16:30 : 팀원 작업 상황 체크 & 지원(이슈 파악·우선순위 정리)
  • 16:30 ~ 18:00 : 사운드 매니저 제작 및 리팩토링(캐릭터/웨폰 구조 정리)

🍽️ 저녁시간

  • 18:00 ~ 19:00 : 저녁시간

✅ 저녁

  • 19:00 ~ 21:00 : 팀 데일리 스크럼(저녁) — 진행 상황 공유, 내일 작업 정리

✅ 오늘 학습 키워드

  • AudioSource 풀(라운드로빈) / SFX 랜덤 재생
  • 캐릭터·웨폰 사운드 분리(걷기/뛰기/피격/사망/권총/라이플/장전)
  • 인터랙션 인터페이스 적용(문 열기 리팩토링)
  • ESC 일시정지(현재 모드별 PauseOverlay 선택 토글)

✅ 오늘 학습 한 내용을 나만의 언어로 정리하기

  • 단일 오디오소스로는 동시 재생이 겹쳐서, **풀(20채널)**을 만들어 재생 중이 아닌 소스를 우선 사용하고 모두 바쁠 땐 라운드로빈으로 덮어쓰게 했다. 덕분에 발자국·총성·장전음이 자연스럽게 겹친다.
  • 사운드 매니저를 중심으로 캐릭터/웨폰 SFX를 모듈화했고, 각 항목은 배열 랜덤 재생 + 개별 볼륨으로 일관성 있게 관리한다.
  • 문 열기 로직은 **OnTriggerStay → 입력 트리거 + 인터페이스(Interaction)**로 바꾸어 의도한 순간에만 동작하도록 안정화했다.
  • ESC는 현재 씬/모드에 맞는 PauseOverlay를 찾아 부모 캔버스를 활성화 후 토글하게 수정했다.

🧩 학습하며 겪었던 문제점 & 에러

1) SFX가 겹치며 끊기거나 유실됨

  • 문제정의: 단일 AudioSource + PlayOneShot 연타 시 이전 소리가 잘림.
  • 시도: 재생 간격 조절 → 근본 해결 불가.
  • 해결 방법: 오디오소스 풀(20) 도입, 가용 소스 우선/라운드로빈.
  • 코드 예시
  •  
  • 새롭게 알게 된 점: PlayOneShot도 채널 리소스를 쓰므로 풀링이 가장 단순하고 효과적.
AudioSource AcquireSource() {
    for (int i = 0; i < pool.Length; i++) {
        int idx = (next + i) % pool.Length;
        if (!pool[idx].isPlaying) { next = (idx + 1) % pool.Length; return pool[idx]; }
    }
    var src = pool[next]; next = (next + 1) % pool.Length; return src;
}

2) 문 여닫기가 프레임마다 흔들림

  • 문제정의: OnTriggerStay에서 즉시 토글 → 플레이어가 닿기만 해도 덜컥거림.
  • 해결 방법: Interaction 인터페이스로 대상만 기억하고, OnInteract(Input) 에서만 Interaction() 호출.
  • 코드 예시
  •  
Interaction current;
void OnTriggerEnter2D(Collider2D c){ if(c.CompareTag("Interaction")) current=c.GetComponent<Interaction>(); }
void OnTriggerExit2D (Collider2D c){ if(c.CompareTag("Interaction") && current==c.GetComponent<Interaction>()) current=null; }
public void OnInteract(InputAction.CallbackContext ctx){ if(!ctx.performed) return; current?.Interaction(); }

📝 메모

사운드를 정리하니 게임의 감정 곡선이 분명해졌다. 팀 스크럼으로 서로의 진행을 확인하며 리스크를 줄였고, 내일은 AudioMixer 연동발자국/총성 위치 재생 보강에 들어가겠다.

다음주도 화이티이잉!!!!


반응형