之前一直以爲游戲在A熒幕啓動是無法獲取熒幕B的解析度清單,特地問了claude,發現跟認知有所差異,特地備注處理方式,下面是claude給的答復。


54658-do1oc6jberk.png

「以前拿不到」的印象是對的

Screen.resolutions 概念上一直是回傳「視窗當前所在螢幕」的清單,但舊版 Unity(約 2019/2021 以前)有快取/刷新的 bug,跨螢幕後常常只回主螢幕的清單、或根本不更新。多螢幕支援在 Unity 2021~6 大幅改善,現在把視窗拖到 B 就會回 B 的清單。所以你「以前拿不到 → 現在拿得到」的記憶落差,是真實的版本行為變化。

② 當前解析度 — 看你要的是哪個:

  • 視窗實際繪製大小 → Screen.width/height(這通常才是你要的值)
  • Screen.currentResolution → 視窗模式下回傳的是「當前所在螢幕的桌面解析度」(不是視窗大小);全螢幕下才是實際解析度。這也是為什麼 QC 的 current-resolution 指令要特地用 Screen.width/height + currentResolution.refreshRate 自己組一個 Resolution 出來回傳視窗大小。

③ 桌面解析度 — ⚠️ 既有程式碼有個坑:

GmCommand_Game.cs 的 ShowRes()(707 行) 和 SetRes()(749 行),判斷原生解析度時用了
res.width == Display.main.systemWidth && res.height == Display.main.systemHeight
但 Display.main 永遠鎖在主螢幕(A),就算視窗在 B 上也是看 A 的值。→ 在 B 上時,「(O)=原生」的標記、以及 game-setres 的預設值,可能會抓成 A 的解析度而不是 B 的。

Unity 6 要正確拿到「當前所在螢幕的桌面解析度」,應改用:
var info = Screen.mainWindowDisplayInfo; // 視窗所在那台螢幕的 DisplayInfo
int deskW = info.width, deskH = info.height;


使用 nvidia control panel 將右側熒幕設定成 2520x1080,然後dump出來如下:

[Screen.width x height] 2560x1440
[Screen.currentResolution] 2520x1080 @60Hz
[Screen.mainWindowDisplayInfo] 2520x1080 name=24B1W1
[Display.main.system] 2560x1440
[Display.main.rendering] 2560x1440
[fullScreenMode] Windowed (fullScreen=False)
[dpi] 96
[Screen.resolutions] count=21
  640x480 @60Hz
  720x480 @60Hz
  720x576 @60Hz
  800x600 @60Hz
  1024x768 @60Hz
  1152x864 @60Hz
  1176x664 @60Hz
  1280x720 @60Hz
  1280x768 @60Hz
  1280x800 @60Hz
  1280x960 @60Hz
  1280x1024 @60Hz
  1360x768 @60Hz
  1366x768 @60Hz
  1440x900 @60Hz
  1440x1080 @60Hz
  1600x900 @60Hz
  1600x1024 @60Hz
  1680x1050 @60Hz
  1920x1080 @60Hz
  2520x1080 @60Hz

另外因爲之前都是記錄解析度清單的index,造成設備替換或是切換主副熒幕機制沒法做好,後來乾脆一口氣修改記錄檔,將記錄改成 wxh,這樣在設備更換時自動選擇最貼近的解析度就好。

無標籤

關注作者:

新增評論