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