66 lines
2.3 KiB
C#
66 lines
2.3 KiB
C#
|
|
using UnityEngine;
|
||
|
|
using UnityEngine.UI;
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// RawImage 의 텍스처가 런타임에 교체될 때 AspectRatioFitter 의 종횡비를 그 텍스처에서 다시 읽어온다.
|
||
|
|
///
|
||
|
|
/// 왜 필요한가 (#800):
|
||
|
|
/// 로딩 배경은 Addressables 로 Loading1~8 중 하나를 매번 새로 불러와 RawImage.texture 에 꽂는다.
|
||
|
|
/// AspectRatioFitter.aspectRatio 는 직렬화된 상수라, 나중에 종횡비가 다른 이미지가 한 장이라도
|
||
|
|
/// 추가되면 그 장만 조용히 늘어난다(=이번에 PD 가 지적한 "비율 어긋남"의 재발).
|
||
|
|
/// 종횡비를 "이미지에서 파생"시키면 그 클래스의 회귀가 구조적으로 사라진다.
|
||
|
|
///
|
||
|
|
/// 비용: 텍스처 참조 1회 비교/프레임. 이 오브젝트는 로딩 화면이 떠 있는 동안에만 활성이다.
|
||
|
|
/// </summary>
|
||
|
|
[ExecuteAlways]
|
||
|
|
[RequireComponent(typeof(RawImage))]
|
||
|
|
[RequireComponent(typeof(AspectRatioFitter))]
|
||
|
|
[DisallowMultipleComponent]
|
||
|
|
public class WLRawImageAspectSync : MonoBehaviour
|
||
|
|
{
|
||
|
|
[Tooltip("텍스처가 아직 없을 때 쓸 종횡비 (가로/세로). 원본 1920x1080 = 1.7778")]
|
||
|
|
public float fallbackRatio = 16f / 9f;
|
||
|
|
|
||
|
|
RawImage _raw;
|
||
|
|
AspectRatioFitter _fitter;
|
||
|
|
Texture _applied;
|
||
|
|
|
||
|
|
void OnEnable()
|
||
|
|
{
|
||
|
|
_raw = GetComponent<RawImage>();
|
||
|
|
_fitter = GetComponent<AspectRatioFitter>();
|
||
|
|
_applied = null; // 활성화될 때마다 무조건 한 번 맞춘다
|
||
|
|
Sync();
|
||
|
|
}
|
||
|
|
|
||
|
|
void LateUpdate() { Sync(); }
|
||
|
|
|
||
|
|
#if UNITY_EDITOR
|
||
|
|
void OnValidate() { if (isActiveAndEnabled) Refresh(); }
|
||
|
|
#endif
|
||
|
|
|
||
|
|
/// 텍스처를 방금 코드로 바꿔치기했을 때처럼, 다음 프레임을 기다리지 않고 즉시 반영해야 할 때 부른다.
|
||
|
|
public void Refresh()
|
||
|
|
{
|
||
|
|
_raw = GetComponent<RawImage>();
|
||
|
|
_fitter = GetComponent<AspectRatioFitter>();
|
||
|
|
_applied = null;
|
||
|
|
Sync();
|
||
|
|
}
|
||
|
|
|
||
|
|
void Sync()
|
||
|
|
{
|
||
|
|
if (_raw == null || _fitter == null) return;
|
||
|
|
|
||
|
|
var tex = _raw.texture;
|
||
|
|
if (tex == _applied) return; // 대부분의 프레임은 여기서 끝난다
|
||
|
|
_applied = tex;
|
||
|
|
|
||
|
|
float ratio = (tex != null && tex.height > 0) ? tex.width / (float)tex.height : fallbackRatio;
|
||
|
|
if (ratio <= 0f) ratio = fallbackRatio;
|
||
|
|
|
||
|
|
if (!Mathf.Approximately(_fitter.aspectRatio, ratio))
|
||
|
|
_fitter.aspectRatio = ratio;
|
||
|
|
}
|
||
|
|
}
|