Unity の IMGUI は GUI.matrix
にスケール行列を掛けることでサイズを変えられる。
GUIUtility.ScaleAroundPivot
はその計算を行ってくれるヘルパークラスなので、それを利用する。
Windows の DPI は標準で 96 dpi なので、それと Screen.dpi
との比でスケールさせる。
Unity Editor には Low Resolution Aspect Ratio という DPI を下げる機能(チェックボックス)があるが、Screen.dpi はそれに対応していないので、GameView.lowResolutionForAspectRatios
の getter プロパティーをチェックすることで対応する。
GameView
クラスを取得するには、EditorWindow.GetWindow
に UnityEditor
Assembly 内の UnityEditor.GameView
型を渡すことになる。GameView
型は参照できないので、PropertyInfo によるリフレクションによって lowResolutionForAspectRatios
にアクセスする。
最終的には、下記のようなスクリプトになる。
var scale = Screen.dpi / 96f;
#if UNITY_EDITOR
var typeGameView = System.Type.GetType("UnityEditor.GameView,UnityEditor");
var gameView = EditorWindow.GetWindow(typeGameView);
var propLowRes = typeGameView.GetProperty("lowResolutionForAspectRatios");
var isLowRes = (bool)propLowRes.GetValue(gameView);
if (isLowRes)
scale *= 0.5f;
#endif
GUIUtility.ScaleAroundPivot(new Vector2(scale, scale), Vector2.zero);