[🖥️Project: HoP] #2 위치 저장과 멀티 모니터

2025. 12. 8. 20:45·도토리도굴단/Project: HoP 개발일지

🚀 오늘의 작업 요약

  • 데이터 지속성: 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
'도토리도굴단/Project: HoP 개발일지' 카테고리의 다른 글
  • [🖥️Project: HoP] #4 Windows Low-Level Hook과 전역 입력 감지
  • [🖥️Project: HoP] #3 애니메이션 시스템과 O(1) 최적화
  • [🖥️Project: HoP] #1 투명 윈도우와 위젯 시스템 구축
  • [👾Project: PokeIdle] #1 투명 창 만들기
happy124219
happy124219
happylaboratory 님의 블로그 입니다.
  • happy124219
    윤아 실험실
    happy124219
  • 전체
    오늘
    어제
    • 분류 전체보기 (116)
      • 공부방 (103)
        • Unity UI (2)
        • C# 알고리즘 (3)
        • C# 에러발생 로그 (7)
        • 내일배움캠프 Unity 9기 TIL (91)
      • 도토리도굴단 (9)
        • Project: HSR 개발일지 (3)
        • Project: HoP 개발일지 (6)
      • 개인 프로젝트 (1)
        • Project: BloomFolk (1)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    유니티
    게임개발
    도망개발일지
    c#문법
    Unity게임개발
    스파르타내일배움캠프TIL
    도망공부일지
    유니티트랙후기
    스파르타내일배움캠프
    내일배움캠프
    내일배움캠프후기
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
happy124219
[🖥️Project: HoP] #2 위치 저장과 멀티 모니터
상단으로

티스토리툴바