using UnityEngine; [ExecuteAlways] [RequireComponent(typeof(RectTransform))] public class SafeAreaUI : MonoBehaviour { public const int SafeWidth = 75; public enum SimDevice { None, IphoneX } public static SimDevice Sim { set { LocalSave.SetInt("SimDevice", (int)value); } get { return (SimDevice)LocalSave.GetInt("SimDevice"); } } Rect[] NSA_IphoneX = new Rect[] { new Rect (0f, 102f / 2436f, 1f, 2202f / 2436f), // Portrait new Rect (132f / 2436f, 63f / 1125f, 2172f / 2436f, 1062f / 1125f) // Landscape }; RectTransform _Panel; Rect LastSafeArea = new Rect(0, 0, 0, 0); Rect LastRect = new Rect(0, 0, 0, 0); RectTransform Panel { get { if (_Panel == null) _Panel = GetComponent(); return _Panel; } } void Awake() { Refresh(); } void Update() { Refresh(); } void Refresh() { // Rect safeArea = GetSafeArea(); // if (safeArea != LastSafeArea || LastRect != Panel.rect) if (LastRect != Panel.rect) ApplySafeArea(); } public void ApplySafeArea() { Panel.anchorMin = Vector2.zero; Panel.anchorMax = Vector2.one; //竖屏 if (Screen.height > Screen.width) { if (Screen.height / Screen.width > 1.8)//宽屏需要适配 { //上下各间隔SafeWidth Panel.offsetMin = new Vector2(0, SafeWidth); Panel.offsetMax = new Vector2(0, -SafeWidth); } else { Panel.offsetMin = new Vector2(0, 0); Panel.offsetMax = new Vector2(0, 0); } } else {//横屏 if (Screen.width / Screen.height > 1.8)//宽屏需要适配 { //两边各间隔SafeWidth Panel.offsetMin = new Vector2(SafeWidth, 0); Panel.offsetMax = new Vector2(-SafeWidth, 0); } else { Panel.offsetMin = new Vector2(0, 0); Panel.offsetMax = new Vector2(0, 0); } } LastRect = Panel.rect; } #region 系统api的安全区 Rect GetSafeArea() { if (!Application.isEditor) return Screen.safeArea; Rect safeArea = Screen.safeArea; if (Sim != SimDevice.None) { Rect nsa = new Rect(0, 0, Screen.width, Screen.height); switch (Sim) { case SimDevice.IphoneX: if (Screen.height > Screen.width) // Portrait nsa = NSA_IphoneX[0]; else // Landscape nsa = NSA_IphoneX[1]; break; default: break; } safeArea = new Rect(Screen.width * nsa.x, Screen.height * nsa.y, Screen.width * nsa.width, Screen.height * nsa.height); } return safeArea; } void ApplySafeArea(Rect safeArea) { DebugEx.LogFormat("ApplySafeArea:{0} ; rect:{1}", safeArea, Panel.rect); Panel.anchorMin = Vector2.zero; Panel.anchorMax = Vector2.one; //适配四个方向 // Panel.offsetMin = safeArea.min; // Panel.offsetMax = new Vector2(-(Screen.width - safeArea.max.x), -(Screen.height - safeArea.max.y)); //只适配两边 Panel.offsetMin = new Vector2(safeArea.min.x, 0); Panel.offsetMax = new Vector2(-(Screen.width - safeArea.max.x), 0); LastRect = Panel.rect; LastSafeArea = safeArea; } #endregion }