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
no image
내일배움캠프 58일차 TIL [최종 프로젝트 Black Chamber]
🗓️ 오늘 하루 일정✅ 오전09:00 ~ 09:30 : 데일리 스크럼(AM) — 오늘 목표/이슈 공유09:30 ~ 12:30 : 인풋 시스템 Run 액션 추가, PlayerConditionManager 설계(스태미나 소모/재생), TopDownMovement 연동 및 애니메이션 블렌드(걷기 0.5 / 뛰기 1.0) 적용🍽️ 점심시간13:00 ~ 14:00 : 점심시간✅ 오후14:00 ~ 16:00 : Fog of War 가시성 에이전트 페이드아웃 구현(스르륵 사라지는 처리)16:00 ~ 18:00 : Spot/LOS 임계값 튜닝, 히스테리시스 구상, 런타임 테스트 및 성능 점검🍽️ 저녁시간18:00 ~ 19:00 : 저녁시간✅ 저녁19:00 ~ 19:30 : 데일리 스크럼(PM) — 진행 상황 점검..
2025.09.18
no image
Unity - Fog of War, 3D(XZ)에서 2D(XY)로 바꾸기
“안개(=안 보이는 부분)를 2D 탑다운 게임에서도 쓰고 싶다!”이 글은 AOS Fog of War(3D XZ 기준)를 2D XY로 바꿔서 쓰는 과정을 정리한 블로그입니다. https://assetstore.unity.com/packages/vfx/shaders/fullscreen-camera-effects/aos-fog-of-war-249249 AOS Fog of War | 카메라 효과 | Unity Asset StoreAdd depth to your project with AOS Fog of War asset from Fischl Works. Find this & more 시각 효과 options on the Unity Asset Store.assetstore.unity.com사용한 에셋!미리보기 (..
2025.09.17
반응형

🗓️ 오늘 하루 일정

✅ 오전

  • 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 연동발자국/총성 위치 재생 보강에 들어가겠다.

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


반응형
반응형

🗓️ 오늘 하루 일정

✅ 오전

  • 09:00 ~ 09:30 : 데일리 스크럼(AM) — 오늘 목표/이슈 공유
  • 09:30 ~ 12:30 : 인풋 시스템 Run 액션 추가, PlayerConditionManager 설계(스태미나 소모/재생), TopDownMovement 연동 및 애니메이션 블렌드(걷기 0.5 / 뛰기 1.0) 적용

🍽️ 점심시간

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

✅ 오후

  • 14:00 ~ 16:00 : Fog of War 가시성 에이전트 페이드아웃 구현(스르륵 사라지는 처리)
  • 16:00 ~ 18:00 : Spot/LOS 임계값 튜닝, 히스테리시스 구상, 런타임 테스트 및 성능 점검

🍽️ 저녁시간

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

✅ 저녁

  • 19:00 ~ 19:30 : 데일리 스크럼(PM) — 진행 상황 점검, 내일 할 일 확정
  • 19:30 ~ 21:00 : 스태미나/달리기 밸런싱(소모·재생 수치 조정), 페이드 타임 파라미터 보정

✅ 오늘 학습 키워드

  • Unity Input System: Run 액션(Press & Hold)
  • PlayerConditionManager: 스태미나 소모/재생·지연·최소치
  • TopDownMovement: 걷기/뛰기 전환, 애니메이션 블렌드(0.5/1.0)
  • Fog of War: 하드 토글 → 알파 보간 페이드아웃
  • MaterialPropertyBlock로 _BaseColor/_Color 알파 적용
  • 가시성 임계값(spot threshold)·히스테리시스로 깜빡임 방지

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

달리기 상태를 인풋(누르고 있음), 조건(스태미나 가능), **이동/애니메이션(실제 전환)**으로 나눠 책임을 분리했다. 인풋은 단순히 의도만 전달하고, 실제 달리기 여부는 CanRun(스태미나가 충분할 때)로 결정하도록 해서 버그 여지를 줄였다. 애니메이션은 걷기=0.5, 뛰기=1.0 블렌드를 기준으로 일관되게 갱신했다.

Fog of War는 “보인다/안 보인다”를 즉시 토글하던 부분을 알파 보간으로 바꿔 시각적 이질감을 해소했다. 런타임에서 머티리얼 인스턴싱을 피하려고 MaterialPropertyBlock을 사용했고, 셰이더에 _BaseColor 또는 _Color가 있는 경우에만 알파를 적용하도록 해 안전성을 높였다. 가시성 경계 근처에서 깜빡이는 현상은 임계값 + 히스테리시스로 완화 가능함을 확인했다.


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

1) 가시성 토글이 “툭” 하고 꺼져서 위화감

  • 문제 정의: 적이 시야에서 벗어나면 즉시 Renderer.enabled = false가 되어 화면에서 갑자기 사라짐.
  • 내가 한 시도: 단순 토글에서 알파 보간으로 전환, 페이드 아웃 완료 시에만 렌더러 비활성.
  • 해결 방법(요지):
  •  
  • 새롭게 알게 된 점:
    • 런타임에 머티리얼을 직접 수정하면 드로우콜 증가/메모리 낭비가 발생할 수 있어 PropertyBlock이 안전.
    • 일부 셰이더는 알파 프로퍼티가 없어 투명 제어가 안 되므로, 셰이더 교체나 스프라이트 기반 대체가 필요.
  • 다시 만나면: 임계값 상·하한(예: 나타남 0.02, 사라짐 0.01) 히스테리시스를 바로 적용해 깜빡임을 선제 차단.
// 목표 알파(보이면 1, 아니면 0)
targetAlpha = isVisible ? 1f : 0f;

// 페이드 속도(초 단위)
float speed = isVisible ? 1f / fadeInTime : 1f / fadeOutTime;

// 현재 알파를 서서히 이동
currentAlpha = Mathf.MoveTowards(currentAlpha, targetAlpha, speed * Time.deltaTime);

// 머테리얼에 알파 적용 (PropertyBlock)
renderer.GetPropertyBlock(mpb);
if (mat.HasProperty("_BaseColor")) mpb.SetColor("_BaseColor", baseColor.WithA(currentAlpha));
if (mat.HasProperty("_Color"))     mpb.SetColor("_Color",     baseColor.WithA(currentAlpha));
renderer.SetPropertyBlock(mpb);

// 완전 0일 때만 끔
renderer.enabled = currentAlpha > 0.001f;

2) 스태미나 관리가 어색해서 달리기 급정지

  • 문제 정의: 스태미나가 0에 가까워질 때 달리기/걷기가 매 프레임 요동.
  • 내가 한 시도: minStaminaToRun을 두어 최소치 이상이어야만 달리기 허용, 달리기 종료 후 재생 지연 추가.
  • 해결 방법(요지):
  •  
  • 새롭게 알게 된 점: 입력 의도리소스 가능 여부를 분리하면, 애니메이션과 이동 로직이 깔끔해짐.
  • 다시 만나면: 체감 품질을 위해 runSpeedMultiplier, regenDelay, minStaminaToRun 세 값을 먼저 테이블로 잡고 QA.
// 조건
bool wantsToRun = input.RunHeld && moveInput.sqrMagnitude > 0f;
bool canRun = condition.Stamina > minStaminaToRun;
isRunning = wantsToRun && canRun;

// 소모/재생
if (isRunning) condition.ConsumeForRun(Time.fixedDeltaTime);
else           condition.TickRegen(Time.fixedDeltaTime); // regenDelay 이후 회복

📝 메모

오늘은 플레이어 이동/스태미나/애니메이션과 포그 가시성 흐름을 “자연스럽게 보이게” 만드는 데 집중했다. 기능 자체는 간단하지만, 상태 전이의 질감(페이드, 지연, 경계값)이 체감 완성도를 크게 올린다. 내일은 히스테리시스 수치와 스태미나 재생 속도를 더 미세 조정하고, UI에 스태미나 슬라이더를 연결해 피드백을 강화하겠다.


반응형
반응형

“안개(=안 보이는 부분)를 2D 탑다운 게임에서도 쓰고 싶다!”
이 글은 AOS Fog of War(3D XZ 기준)를 2D XY로 바꿔서 쓰는 과정을 정리한 블로그입니다.

 

https://assetstore.unity.com/packages/vfx/shaders/fullscreen-camera-effects/aos-fog-of-war-249249

 

AOS Fog of War | 카메라 효과 | Unity Asset Store

Add depth to your project with AOS Fog of War asset from Fischl Works. Find this & more 시각 효과 options on the Unity Asset Store.

assetstore.unity.com

사용한 에셋!

미리보기 (전/후)

원형 시야 느낌

 

손전등(부채꼴) 시야 느낌

 

1) 왜 XZ → XY로 바꾸나요?

    • 3D 프로젝트는 “바닥=X-Z 평면, 높이=Y”가 보통입니다.
    • 2D 탑다운은 “바닥=X-Y 평면, 깊이(Z)는 카메라 앞뒤만 사용”이 보통입니다.
    • 그래서 좌표와 메쉬 기준을 XY로 돌려놓아야 합니다. 그래야 타일 계산, 충돌, 정렬이 자연스럽습니다.

2) 좌표계와 메쉬를 XY에 맞추기 (핵심 3줄 요약)

    1. 타일 좌표 계산을 X,Y로 바꾸기
      • 리빌러(플레이어 등) 위치에서 x는 x, y는 y를 직접 읽어 씁니다. (XZ가 아니라 XY!)
      • 원본과 수정본 모두 GetUnitX(...) / GetUnitY(...) 를 써서 그리드 좌표로 바꿉니다.
    1.  
    2. 안개를 그릴 메쉬를 XY 평면에 놓기
      • PrimitiveType.Quad를 만들어 월드 중앙(XY) 에 두고, Z는 카메라 바로 앞(작은 음수) 로 둡니다.
      • 정렬은 Sorting Layer / Order 로 스프라이트 위에 오도록 맞춥니다. (콜라이더는 꺼두기)
    1.  
    2. 텍스처 해상도 = 타일 해상도
      • new Texture2D(levelDimensionX, levelDimensionY) 처럼 타일 수와 같은 크기의 텍스처를 만들어, 픽셀마다 “가림/공개”를 색으로 기록합니다.
  1.  

2-1. 좌표계: 리빌러가 어디 서 있는지 “XY 타일”로 바꾸기

    • 리빌러 Transform.position 의 x, y 값을 한 칸 크기(unitScale) 로 나눠 반올림하면 “몇 번째 칸인지”를 얻습니다.
    • 이 값은 안개 계산에서 “어느 타일을 밝힐지”에 쓰입니다.
    • 코드적으로는 GetCurrentLevelCoordinates → GetUnitX(pos.x), GetUnitY(pos.y) 흐름입니다. (XZ가 아닌 XY)

2-2. 메쉬: Quad를 XY에, 정렬은 스프라이트 위로

    • 안개를 실제로 그릴 ‘판’ = Quad(1×1) 를 만들어 레벨 중앙(XY) 에 깔고, 스케일을 레벨 크기만큼 키웁니다.
    • Z 살짝 음수(예: -0.1f)로 두면 카메라 앞에 오면서, 다른 2D 스프라이트 위에 올릴 수 있습니다.
    • Sorting Layer / Order 로 표시 순서를 고정합니다.
    • 원본은 초기 구현에서 180° 회전이 들어가지만, 2D에서는 보통 회전 없이 써도 됩니다. (수정본에선 이 회전이 제거되어 더 자연스럽습니다)

2-3. 텍스처: 타일 하나 = 텍스처 한 픽셀

    • 안개는 결국 텍스처 한 장입니다.
    • 텍스처의 각 픽셀 = 지도 타일 1칸 이라고 생각하고,
      “보이는 칸은 투명/연한 색, 보이지 않는 칸은 어두운 색(알파값 큼)”으로 칠합니다.
    • 원본은 fogPlaneTextureLerpTarget/Buffer 두 장을 써서 부드럽게 보간(Lerp) 합니다. 수정본은 XY 환경에 맞춘 동일 구조를 유지합니다.

손에 잡히는 체크리스트

    • 리빌러의 위치에서 X/Y 로 타일 좌표 뽑기 (GetUnitX, GetUnitY).
    • Quad를 만들어 XY 평면에 배치, Z는 -0.1f 근처, Sorting Layer/Order로 최상단 표시.
    • 텍스처 크기 = (타일X, 타일Y) 로 만들고, 각 픽셀을 타일처럼 사용.

다음 파트에서는 3) 장애물 스캔을 2D 물리로 바꾸기(Physics2D.OverlapBoxAll)
5) 손전등 시야(부채꼴) + 부드러운 가장자리(가중치) 를 이어서 정리할게요. (수정본에 이미 구현되어 있습니다)

csFogWar


참고

    • 에셋: AOS Fog of War (원본은 3D/XZ 기준)
    • 우리 프로젝트 스크립트(요지):
      • 원본 2D 포팅본: csFogWar1.cs – XY 정렬, Quad, 텍스처 보간 구조.

csFogWar1.cs
0.03MB

 

 

 

      • 수정본: csFogWar.cs – 부채꼴 시야(outer/inner 반경, 각도, 전방 축), 가중치 기반 알파, 회전 제거 등.
  •  

csFogWar.cs
0.03MB

 

 

 

 

사실 GPT의 도움을 많이 받았지만 3D에서 2D로 바꾸는게 마냥 쉽지는 않았네요 ㅎㅎ.. 900줄이나 되는 코드이다보니.. 하여튼!

수정본을 보시면 아시겠지만 원형 시야가아닌 부채꼴 시야로 제작했습니다! 현재 2D 탑뷰 암살 게임을 만드는중이라서요ㅎㅎ..

읽어주셔서 감사합니다아!!

반응형