using UnityEngine;
///
/// 让一个“中心锚定 + 固定横向偏移”的顶层 HUD 容器,在任意宽高比下横向跟随其设计所属的屏幕边缘。
/// 只处理横向(X),纵向(Y)完全不动;保持 1920 设计宽度下的视觉位置逐像素不变。
///
/// 为什么用组件而非直接改业务脚本坐标:许多 HUD 的位置由业务脚本在运行时写死设置
/// (relative 到这些容器)。本组件只移动“容器”本身到边缘相对位置,容器内部由脚本布置的
/// 子元素保持相对关系不变——既实现了“跟随边缘”,又不触碰任何业务坐标逻辑。
///
/// 满足三要求:1) 不改业务逻辑/引用;2) 仅横向、16:9 逐像素一致、不动 Y 与动画;3) 跟随边缘。
///
[RequireComponent(typeof(RectTransform))]
[DisallowMultipleComponent]
public sealed class UIEdgeFollow : MonoBehaviour
{
public enum Edge { Left, Right, Auto }
public Edge edge = Edge.Auto;
// 设计基准宽度:所有 gap 以此为参考,保证与首次附加时的分辨率无关。
private const float DesignWidth = 1920f;
private RectTransform rt;
private RectTransform rootRt;
private float gapX; // 元素中心距目标边缘的间距(设计参考像素,恒定)
private Edge resolved;
private bool measured;
private float lastRootW = -1f;
private void OnEnable()
{
rt = GetComponent();
ResolveRoot();
Measure();
ApplyIfNeeded(true);
}
private void ResolveRoot()
{
Canvas c = GetComponentInParent