🚀 오늘의 작업 요약
- 데이터 지속성: JSON 기반 위젯 위치 저장/로드 시스템 구현.
- 환경 적응: Windows API를 활용한 멀티 모니터 선택 및 이동 기능 추가.
🛠 구현 상세
1. 위젯 위치 저장 시스템 (WidgetSaveSystem)
PlayerPrefs는 구조적인 데이터를 저장하기에 한계가 있어, 확장 가능한 JSON 방식을 택했다.
- 구현 내용: WidgetPositionData 클래스(ID, 좌표, 활성화 여부)를 정의하고, JSON 직렬화/역직렬화 유틸리티를 만들었다.
- 결과:
- 자동 저장: 위젯 드래그 종료 시(OnDragEnd) 개별 위치 업데이트.
- 전체 저장: 앱 종료 시(OnApplicationQuit) 데이터 유실 방지를 위해 전체 상태 저장.
- 복구: 앱 실행 시 JSON을 로드해 햄초를 마지막 위치로 즉시 소환한다.
2. 멀티 모니터 선택 시스템
Unity는 기본적으로 주 모니터에 종속적이다. 네이티브 Windows API인 EnumDisplayMonitors를 사용하여 연결된 모든 모니터 정보를 가져왔다.
- 동적 윈도우 이동: OverlayController를 확장해 선택된 모니터 좌표로 윈도우를 이동시킨다.
- UX 강화: Ctrl + 1~9 단축키로 모니터 간 즉시 이동이 가능하며, M 키를 눌러 현재 위치를 UI로 확인할 수 있다. Windows 8.1 이상에서 지원하는 DPI Awareness를 적용해 배율이 다른 모니터 간 이동 시 크기 깨짐도 방지했다.
🔥 트러블슈팅: 모니터 전환 시 프레임 드랍
문제 상황: Ctrl + 2 단축키를 빠르게 연타했을 때 화면이 심하게 끊기고, 햄초 애니메이션이 비정상적으로 빨라지는 현상이 발생했다.
해결: 원인은 Screen.SetResolution이 매우 무거운 작업(GPU 컨텍스트 갱신)이기 때문이었다. 연타할 때마다 해상도 변경 요청이 쌓이면서 메인 스레드가 멈췄던 것이다. 쿨다운과 조건문으로 불필요한 호출을 막았다.
// OverlayController.cs 수정
private IEnumerator ChangeMonitorRoutine(int monitorIndex)
{
// 1. 이미 해당 모니터에 있거나, 쿨다운 중이면 무시
if (currentMonitorIndex == monitorIndex || isChangingMonitor) yield break;
isChangingMonitor = true;
// ... 모니터 정보 가져오기 로직 ...
// 2. 실제 해상도 변경은 프레임 끝으로 지연 처리
yield return new WaitForEndOfFrame();
Screen.SetResolution(targetWidth, targetHeight, FullScreenMode.Windowed);
// 3. 쿨다운 0.3초 적용
yield return new WaitForSeconds(0.3f);
isChangingMonitor = false;
}
💡 회고
멀티 모니터 너무 어렵다 하나도 못알아들었다. 그냥 잘 작동하길 빌기.. 커서로 작업중인데 모니터 변경 후 모니터 끊어지는 경우, 해상도 바뀌었을 경우 등 생각하지 못한 예외처리가 너무 많았다 옛날 사람들은 이걸 다 스스로 생각했다는거 아니야
'도토리도굴단 > Project: HoP 개발일지' 카테고리의 다른 글
| [🖥️Project: HoP] #5 무한 점프 시스템 (0) | 2025.12.13 |
|---|---|
| [🖥️Project: HoP] #4 Windows Low-Level Hook과 전역 입력 감지 (0) | 2025.12.11 |
| [🖥️Project: HoP] #3 애니메이션 시스템과 O(1) 최적화 (0) | 2025.12.08 |
| [🖥️Project: HoP] #1 투명 윈도우와 위젯 시스템 구축 (0) | 2025.12.04 |
| [👾Project: PokeIdle] #1 투명 창 만들기 (0) | 2025.08.19 |