From 9b02efbdfe29f5ac029637278ac51ac10e0b2d90 Mon Sep 17 00:00:00 2001 From: ALEXTANG <574809918@qq.com> Date: Fri, 27 May 2022 17:32:10 +0800 Subject: [PATCH] =?UTF-8?q?=E9=80=82=E5=BA=94=E5=B1=8F=E5=B9=95=E5=85=A8?= =?UTF-8?q?=E5=B1=8F=E6=8B=89=E4=BC=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 适应屏幕全屏拉伸 --- .../UI/Extend/UIBackgroundImageStretch.cs | 18 +++++ .../Runtime/UI/Extend/UIStretchUtil.cs | 77 +++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 Assets/TEngine/Runtime/UI/Extend/UIBackgroundImageStretch.cs create mode 100644 Assets/TEngine/Runtime/UI/Extend/UIStretchUtil.cs diff --git a/Assets/TEngine/Runtime/UI/Extend/UIBackgroundImageStretch.cs b/Assets/TEngine/Runtime/UI/Extend/UIBackgroundImageStretch.cs new file mode 100644 index 00000000..751e6819 --- /dev/null +++ b/Assets/TEngine/Runtime/UI/Extend/UIBackgroundImageStretch.cs @@ -0,0 +1,18 @@ +using UnityEngine; + +namespace TEngine +{ + /// + /// 背景图片等比拉伸 + /// + public class UIBackgroundImageStretch : MonoBehaviour + { + public bool m_noClip; + + private void Start() + { + var imageRect = GetComponent(); + UIStretchUtil.Instance.DoStretch(imageRect, m_noClip); + } + } +} diff --git a/Assets/TEngine/Runtime/UI/Extend/UIStretchUtil.cs b/Assets/TEngine/Runtime/UI/Extend/UIStretchUtil.cs new file mode 100644 index 00000000..a4b2a7a3 --- /dev/null +++ b/Assets/TEngine/Runtime/UI/Extend/UIStretchUtil.cs @@ -0,0 +1,77 @@ +using UnityEngine; +using UnityEngine.UI; + +namespace TEngine +{ + public class UIStretchUtil : TSingleton + { + private bool m_isInit; + private Vector2 m_canvasSize; + private float m_screenAspect; + + public bool Init() + { + var goRoot = GameObject.Find("UIRoot/Canvas"); + if (goRoot == null) + { + TLogger.LogError("找不到 goRoot"); + return false; + } + var canvasScaler = goRoot.GetComponent(); + if (canvasScaler == null) + { + TLogger.LogError("找不到 CanvasScaler"); + return false; + } + + m_screenAspect = Screen.width / (float)Screen.height; + float designScale = canvasScaler.referenceResolution.x / canvasScaler.referenceResolution.y; + if (m_screenAspect > designScale) + { + //Match 以 Height 为标准 + m_canvasSize.y = canvasScaler.referenceResolution.y; + m_canvasSize.x = m_canvasSize.y * Screen.width / Screen.height; + } + else + { + //Match 以 Weight 为标准 + m_canvasSize.x = canvasScaler.referenceResolution.x; + m_canvasSize.y = m_canvasSize.x * Screen.height / Screen.width; + } + //BLogger.Error("referenceResolution = "+ canvasScaler.referenceResolution); + //BLogger.Error("m_canvasSize = " + m_canvasSize); + + m_isInit = true; + return true; + } + + public void DoStretch(RectTransform rectTransform, bool noClip) + { + if (!m_isInit) + { + if (!Init()) + { + return; + } + } + if (rectTransform != null && rectTransform.sizeDelta.x > 0 && rectTransform.sizeDelta.y > 0) + { + Vector2 rectSize = rectTransform.sizeDelta; + var rectAspect = rectSize.x / rectSize.y; + if (!noClip && rectAspect > m_screenAspect || + noClip && rectAspect < m_screenAspect) + { + //以高为标准 + float scale = m_canvasSize.y / rectSize.y; + rectTransform.localScale = new Vector3(scale, scale, 1f); + } + else + { + //以宽为标准 + float scale = m_canvasSize.x / rectSize.x; + rectTransform.localScale = new Vector3(scale, scale, 1f); + } + } + } + } +}