好多新内容
This commit is contained in:
@@ -0,0 +1,62 @@
|
||||
using UnityEngine;
|
||||
|
||||
/// <summary>
|
||||
/// gameplay 世界空间背景(SpriteRenderer,如 bg_replace)自适应覆盖。
|
||||
/// 该背景由透视相机渲染、带旋转/缩放,尺寸按 16:9 设计。超宽屏(21:9/32:9)下相机
|
||||
/// 水平视野扩大会看到背景边缘之外的黑边,故按屏幕宽高比等比放大其 localScale 使其覆盖。
|
||||
///
|
||||
/// 仅调整 localScale(表现层),不改旋转/位置/材质/引用,不影响业务逻辑与动画。
|
||||
/// 16:9 屏下缩放系数=1,与原设计逐像素一致。由 UIResolutionAutoFitter 自动附加。
|
||||
///
|
||||
/// 满足三要求:1) 不改业务逻辑/引用;2) 16:9 缩放=1、不动旋转位置;3) 超宽屏铺满。
|
||||
/// </summary>
|
||||
[RequireComponent(typeof(SpriteRenderer))]
|
||||
[DisallowMultipleComponent]
|
||||
public sealed class UISpriteBackgroundCover : MonoBehaviour
|
||||
{
|
||||
private const float DesignAspect = 16f / 9f;
|
||||
|
||||
private Transform tf;
|
||||
private Vector3 baseScale; // 初始设计缩放(16:9 基准),永不变
|
||||
private bool baseCaptured;
|
||||
private int lastW = -1, lastH = -1;
|
||||
|
||||
private void OnEnable()
|
||||
{
|
||||
tf = transform;
|
||||
CaptureBaseScale();
|
||||
Apply();
|
||||
}
|
||||
|
||||
private void CaptureBaseScale()
|
||||
{
|
||||
if (baseCaptured) return;
|
||||
baseScale = tf.localScale;
|
||||
baseCaptured = true;
|
||||
}
|
||||
|
||||
private void LateUpdate()
|
||||
{
|
||||
if (Screen.width != lastW || Screen.height != lastH)
|
||||
{
|
||||
Apply();
|
||||
}
|
||||
}
|
||||
|
||||
private void Apply()
|
||||
{
|
||||
if (!baseCaptured) CaptureBaseScale();
|
||||
lastW = Screen.width;
|
||||
lastH = Screen.height;
|
||||
|
||||
float aspect = (float)Screen.width / Mathf.Max(1, Screen.height);
|
||||
// 更宽的屏:水平视野变宽,需按 aspect/DesignAspect 放大以覆盖两侧。
|
||||
// 更窄的屏:垂直视野相对更高,需按 DesignAspect/aspect 放大以覆盖上下。
|
||||
// 取二者较大值(cover),保证任一方向都不露黑边。16:9 时系数=1。
|
||||
float widthFactor = aspect > DesignAspect ? aspect / DesignAspect : 1f;
|
||||
float heightFactor = aspect < DesignAspect ? DesignAspect / aspect : 1f;
|
||||
float factor = Mathf.Max(widthFactor, heightFactor);
|
||||
|
||||
tf.localScale = baseScale * factor;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user