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