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);