适应屏幕全屏拉伸

适应屏幕全屏拉伸
This commit is contained in:
ALEXTANG
2022-05-27 17:32:10 +08:00
parent 8f594099dd
commit 9b02efbdfe
2 changed files with 95 additions and 0 deletions

View File

@@ -0,0 +1,18 @@
using UnityEngine;
namespace TEngine
{
/// <summary>
/// 背景图片等比拉伸
/// </summary>
public class UIBackgroundImageStretch : MonoBehaviour
{
public bool m_noClip;
private void Start()
{
var imageRect = GetComponent<RectTransform>();
UIStretchUtil.Instance.DoStretch(imageRect, m_noClip);
}
}
}

View File

@@ -0,0 +1,77 @@
using UnityEngine;
using UnityEngine.UI;
namespace TEngine
{
public class UIStretchUtil : TSingleton<UIStretchUtil>
{
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<CanvasScaler>();
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);
}
}
}
}
}