SafeAreaIMGUI.cs
using UnityEngine;
public class SafeAreaIMGUI : MonoBehaviour
{
[SerializeField]
private float _longEdge = 1920f;
[SerializeField]
private float _shortEdge = 1080f;
[SerializeField]
private float _scale = 6;
private void OnGUI()
{
var referenceWidth = Screen.orientation == ScreenOrientation.Landscape ? _longEdge : _shortEdge;
var referenceHeight = Screen.orientation == ScreenOrientation.Portrait ? _longEdge : _shortEdge;
var scaleFactor = _scale * Mathf.Min(Screen.width / referenceWidth, Screen.height / referenceHeight);
BeginScaledSafeArea(scaleFactor);
{
_scale = GUILayout.HorizontalSlider(_scale, 6, 30f);
GUILayout.TextArea($"scale : {_scale}", GUILayout.ExpandHeight(true), GUILayout.ExpandWidth(true));
}
EndScaledSafeArea();
}
private static void BeginScaledSafeArea(float scale)
{
if (Mathf.Approximately(scale, 0f)) return;
var safeArea = Screen.safeArea;
GUI.matrix = Matrix4x4.TRS(
new Vector3(safeArea.xMin, Screen.height - safeArea.yMax),
Quaternion.identity,
new Vector3(scale, scale, 1f));
GUILayout.BeginVertical(
GUILayout.Height(safeArea.height / scale),
GUILayout.Width(safeArea.width / scale));
}
private static void EndScaledSafeArea()
{
GUILayout.EndVertical();
}
}
スケール値の計算をいい感じにやれば、 BeginScaledSafeArea と EndScaledSafeArea で囲むだけでセーフエリア内に好きなスケールでIMGUIを描画できる、かもしれない。



