no image
내일배움캠프 69일차 TIL [최종 프로젝트 Black Chamber]
🗓️ 오늘 하루 일정✅ 오전10:00 ~ 11:00 : 팀 회의(역할 분담, 금일 목표 확정)11:00 ~ 12:30 : Fog of War 초기화 에러 재현 및 원인 파악(Scan Spacing Per Unit)🍽️ 점심시간13:00 ~ 14:00 : 점심시간✅ 오후14:00 ~ 16:30 : FogPlane 범위/위치 점검(그리드 X·Y, Mid Point, Unit Scale) 및 머티리얼 교체(Unlit)16:30 ~ 18:00 : 문 레이어( Door ) 오클루전 확인, 리빌 옵션/알파 튜닝, 전체 맵 테스트🍽️ 저녁시간18:00 ~ 19:00 : 저녁시간✅ 저녁19:00 ~ 20:30 : 씬 최종 점검, 설정값 가이드 정리 및 TIL 작성✅ 오늘 학습 키워드Fog of War(2D XY ..
21:20:51
no image
내일배움캠프 68일차 TIL [최종 프로젝트 Black Chamber]
🗓️ 오늘 하루 일정✅ 오전09:00 ~ 13:00 : 발표 준비🍽️ 점심시간13:00 ~ 14:00 : 점심시간✅ 오후14:00 ~ 15:00 : 최종발표 전 중간발표15:00 ~ 16:00 : 휴식16:00 ~ 18:00 : 팀 회의 — 추석 연휴 개발/기획 범위 논의🍽️ 저녁시간18:00 ~ 19:00 : 저녁시간✅ 오늘 학습 키워드https://youtu.be/VFJO8QlCwDA 중간발표✅ 오늘 학습 한 내용을 나만의 언어로 정리하기발표는 문제–접근–결과–교훈의 4단 구조로 정리하면 이해가 빠르다. 데모는 타임라인에 맞춰 입력 시퀀스를 스크립트화해야 실수가 줄어든다.연휴 스프린트는 “핵심 루프 1분 데모”를 최우선으로 두고 나머지는 Nice-to-have로 분리한다.🧩 학습하며 겪었던 문..
2025.10.02
no image
내일배움캠프 67일차 TIL [최종 프로젝트 Black Chamber]
🗓️ 오늘 하루 일정✅ 오전09:00 ~ 12:00 : 인터랙션 정리(아이템: 돈/탄창 IInteractable 적용), UI 수정(F키 흰색), UIBase 두트윈 기본 비활성(로딩/게임오버/클리어/NPC)🍽️ 점심시간13:00 ~ 14:00 : 점심시간✅ 오후14:00 ~ 16:00 : 직렬화 충돌(triple canvasGroup) 원인 파악 및 수정, SceneInitializer 기반 UIKey 동기화 점검16:00 ~ 18:00 : 팀 PPT 제작(진행 현황, 기술적 의사결정 카드 정리)🍽️ 저녁시간18:00 ~ 19:00 : 저녁시간✅ 저녁19:00 ~ 21:00 : 저녁 스크럼(내일 목표 확정, 리스크 공유)영상 다시 촬영 (원테이크) (설명은 내일)발표 리허설PPT 옮기기파일제출. ..
2025.10.01
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
반응형

🗓️ 오늘 하루 일정

✅ 오전

  • 10:00 ~ 11:00 : 팀 회의(역할 분담, 금일 목표 확정)
  • 11:00 ~ 12:30 : Fog of War 초기화 에러 재현 및 원인 파악(Scan Spacing Per Unit)

🍽️ 점심시간

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

✅ 오후

  • 14:00 ~ 16:30 : FogPlane 범위/위치 점검(그리드 X·Y, Mid Point, Unit Scale) 및 머티리얼 교체(Unlit)
  • 16:30 ~ 18:00 : 문 레이어( Door ) 오클루전 확인, 리빌 옵션/알파 튜닝, 전체 맵 테스트

🍽️ 저녁시간

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

✅ 저녁

  • 19:00 ~ 20:30 : 씬 최종 점검, 설정값 가이드 정리 및 TIL 작성

✅ 오늘 학습 키워드

  • Fog of War(2D XY 변환), Level Dimension X/Y, Unit Scale, Level Mid Point
  • Scan Spacing Per Unit(샘플 간격), FogPlane 머티리얼(Unlit/Transparent), Keep Revealed Tiles
  • Door Occlusion(레이캐스트), Draw Gizmos로 범위 시각화

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

  • FogPlane은 Level Mid Point를 중심으로 Level Dimension X/Y × Unit Scale 크기로 깔리므로, 이 세 값 중 하나라도 어긋나면 맵 일부가 안개 밖으로 빠질 수 있다.
  • 안개가 “완전 검정”으로 시작하려면 Fog 머티리얼을 조명 비영향(Unlit/Transparent) 으로 써야 한다. 조명에 반응하는 머티리얼은 검정 대신 어둡게만 보일 수 있다.
  • Scan Spacing Per Unit은 0보다 커야 하며(권장 1~2), 값이 클수록 더 촘촘히 스캔하지만 비용이 늘어난다.
  • Keep Revealed Tiles를 끄면 비추기 전엔 완전 검정, 비춘 후엔 다시 덮이면 숨겨지는 “스텔스형” 연출이 된다.
  • Draw Gizmos로 그리드 박스를 확인하면 범위/중심 이상을 빠르게 찾을 수 있다.
  • 문 오클루전은 Door 레이어 + 콜라이더가 정확해야 하며, 트리거 무시는 옵션(Ignore Triggers)으로 제어한다.

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

1) 문제정의

  • 플레이 시작 시 콘솔에에러가 발생했다.
  • Scan Spacing Per Unit must be > 0.

내가 한 시도

  • 인스펙터의 Scan Spacing Per Unit 값을 확인하고, 기존에 저장된 LevelData가 0을 들고 오는지 점검.

해결 방법

  • 인스펙터 값을 1 이상으로 수정.
  • 과거에 저장된 레벨 데이터가 있다면 삭제/수정 후 재스캔.
  • 재발 방지를 위해 코드에 최소값 강제:
// 인스펙터 실수 방지
[SerializeField, Min(1)] private int scanSpacingPerUnit = 1;

// 런타임 안전장치
void ValidateProperties()
{
    scanSpacingPerUnit = Mathf.Max(1, scanSpacingPerUnit);
}

새롭게 알게 된 점

  • 이 값은 내부에서 스캔 해상도를 결정하며, 0이면 분모가 0이 되는 계산 경로가 있어 사전에 걸러야 한다.

다시 만나게 된다면

  • 필드에 Min(1) 속성과 런타임 클램프를 함께 두고, LevelData 저장 시에도 밸리데이션 로직을 추가하겠다.

2) 문제정의

  • 벽과 문 레이어는 잘 작동하지만, 맵 오른쪽 복도가 처음부터 밝게 보이고 안개가 덮이지 않았다.

내가 한 시도

  • 레이어/콜라이더 이상 여부 확인, FogPlane 머티리얼/알파 확인, 그리드 한계선 Gizmo 확인.

해결 방법

  1. Level Dimension X/Y를 실제 맵보다 넉넉히 증가, Level Mid Point를 맵 중앙으로 재배치.
  2. 머티리얼을 URP Unlit(Transparent) 로 교체, Fog Color=검정, Fog Plane Alpha=1.
  3. Keep Revealed Tiles 끔 → 초기 완전 검정 확인.
// FogPlane 크기 재계산 예시(개념)
var size = new Vector2(levelDimensionX * unitScale, levelDimensionY * unitScale);
fogPlane.localScale = new Vector3(size.x, size.y, 1f);
fogPlane.position   = levelMidPoint.position;

새롭게 알게 된 점

  • 머티리얼이 조명 영향을 받으면 “검정”이 아닌 “어둡게”만 보일 수 있다. 또, 그리드 범위가 부족하면 특정 영역이 안개 밖으로 남는다.

다시 만나게 된다면

  • 씬 진입 시 Gizmo 박스가 맵을 완전히 덮는지 자동 점검하는 에디터 스크립트를 두고, 머티리얼 프리셋을 고정값으로 강제하겠다.

📝 메모

  • 시작값 추천: Scan Spacing Per Unit=1, Fog Lerp Speed=5, Fog Plane Alpha=1, Keep Revealed Tiles=OFF.
  • 테스트 루틴: (1) Gizmo 박스 확인 → (2) 머티리얼 Unlit 확인 → (3) 문/벽 콜라이더 및 레이어 → (4) 저장 데이터 초기화 후 재스캔.
  • 도어 오클루전은 문 사이에 아주 얇은 틈이 있으면 레이캐스트가 새어 나갈 수 있으니 콜라이더를 살짝 겹치게 배치하는 것이 안전하다.

 

반응형
반응형

🗓️ 오늘 하루 일정

✅ 오전

  • 09:00 ~ 13:00 : 발표 준비

🍽️ 점심시간

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

✅ 오후

  • 14:00 ~ 15:00 : 최종발표 전 중간발표
  • 15:00 ~ 16:00 : 휴식
  • 16:00 ~ 18:00 : 팀 회의 — 추석 연휴 개발/기획 범위 논의

🍽️ 저녁시간

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

✅ 오늘 학습 키워드

https://youtu.be/VFJO8QlCwDA

 

중간발표


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

  • 발표는 문제–접근–결과–교훈의 4단 구조로 정리하면 이해가 빠르다. 데모는 타임라인에 맞춰 입력 시퀀스를 스크립트화해야 실수가 줄어든다.
  • 연휴 스프린트는 “핵심 루프 1분 데모”를 최우선으로 두고 나머지는 Nice-to-have로 분리한다.

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


📝 메모

중간발표가 끝났다아!! 내일부터는 추석 시작! 각자 추석동안 개발, 기획 할거를 맡아서 진행하기로 했다. 추석 기간에도 화이팅..


반응형
반응형

🗓️ 오늘 하루 일정

✅ 오전

  • 09:00 ~ 12:00 : 인터랙션 정리(아이템: 돈/탄창 IInteractable 적용), UI 수정(F키 흰색), UIBase 두트윈 기본 비활성(로딩/게임오버/클리어/NPC)

🍽️ 점심시간

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

✅ 오후

  • 14:00 ~ 16:00 : 직렬화 충돌(triple canvasGroup) 원인 파악 및 수정, SceneInitializer 기반 UIKey 동기화 점검
  • 16:00 ~ 18:00 : 팀 PPT 제작(진행 현황, 기술적 의사결정 카드 정리)

🍽️ 저녁시간

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

✅ 저녁

  • 19:00 ~ 21:00 : 저녁 스크럼(내일 목표 확정, 리스크 공유)
    • 영상 다시 촬영 (원테이크) (설명은 내일)
    • 발표 리허설
    • PPT 옮기기
    • 파일제출. (12시까지)
    • 발표 끝나고
      • 4차 목표에 대해서 얘기.
      • 추석간 각자 개발할거, 기획할거 나누기

✅ 오늘 학습 키워드

IInteractable · UIBase/DOTween · 직렬화 충돌 대응 · SceneManager.sceneLoaded · SceneInitializer.ActiveUI


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

  • 상호작용 규격을 IInteractable로 통일해서 문/아이템/장치 확장이 쉬워졌다.
  • UI 공통 베이스(UIBase)에서만 CanvasGroup를 직렬화하고, 자식은 프로퍼티 접근으로 통일하니 중복 직렬화 에러가 사라졌다.
  • 씬 전환 시점에 sceneLoaded 이벤트로 한 번만 SceneInitializer.ActiveUI를 읽어 UIKey를 갱신하니, 커서/BGM/UI 상태가 안정적으로 맞춰진다.

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

1. 동일 필드명 직렬화 충돌(canvasGroup)

  • 문제정의: The same field name is serialized multiple times ... Base(SettingPopup) canvasGroup
  • 시도: 자식에서 CanvasGroup를 제거했지만 프리팹 잔여 직렬화 데이터로 계속 경고 발생.
  • 해결 방법:
    1. 부모(UIBase)만 직렬화: _canvasGroup + 프로퍼티로 접근.
    2. [FormerlySerializedAs("canvasGroup")] 추가로 레거시 매핑.
    3. 관련 프리팹 Reset로 유령 슬롯 정리.
// UIBase.cs (요지)
[FormerlySerializedAs("canvasGroup")]
[SerializeField] protected CanvasGroup _canvasGroup;
protected CanvasGroup canvasGroup => _canvasGroup;
  • 새롭게 알게 된 점: “이름이 같으면” 코드에서 지워도 프리팹 슬롯이 남아 충돌할 수 있다.
  • 다시 만나면: 부모 직렬화 필드명은 접두어(_) 규칙으로 고정한다.

2. 씬 전환 후 UIKey 불일치

  • 문제정의: 씬이 바뀐 뒤 커서/BGM/UI가 현재 씬 컨텍스트와 다르게 뜨는 현상.
  • 시도: 임의 시점에서 FindFirstObjectByType 호출 → 타이밍 이슈로 누락.
  • 해결 방법: 씬 로드시 한 번만 갱신.
// MissionManager.cs (핵심)
void OnEnable()  => SceneManager.sceneLoaded += OnSceneLoaded;
void OnDisable() => SceneManager.sceneLoaded -= OnSceneLoaded;

void OnSceneLoaded(Scene s, LoadSceneMode m){
    var init = FindFirstObjectByType<SceneInitializer>(FindObjectsInactive.Include);
    if (init) UIKey = init.ActiveUI;
}
  • 새롭게 알게 된 점: 컨텍스트 갱신은 “이벤트 기준”이 가장 안전하다.
  • 다시 만나면: 전역 UIContext로 브로드캐스트 구조 도입.

📝 메모

  • 오늘은 규약 정리가 큰 성과다. 인터랙션/UI/씬 컨텍스트가 한 흐름으로 정리되니 마음이 훨씬 편하다.
  • 내일은 PPT에 기술적 의사결정(LoadingFlow, UIContext, FoW) 사례를 짧고 강하게 넣자.

반응형
반응형

🗓️ 오늘 하루 일정

✅ 오전

  • 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 교체 중복 호출에 대한 디바운스까지 넣어 안정성을 높여보자. 잘했다, 내일도 화이팅!!!


반응형