using UnityEngine;
///
/// 让一个"普通 Transform"(非 RectTransform,如 gameplay 敌人容器 empty/enemyObject)在分辨率变化时
/// 横向跟随其所属 Canvas 的某一屏幕边缘,保持到该边缘的间距恒定。
///
/// 用于敌人这类"用普通 Transform 本地坐标定位、挂在 ScreenSpaceCamera Canvas 下"的对象——
/// 它们无锚点,UIEdgeFollow(要求 RectTransform)用不了。本组件自测量:运行时读取对象在所属
/// Canvas 局部空间的 X,算出到选定边缘的间距并保持恒定,与该 Canvas 的精确坐标系无关(健壮)。
///
/// 仅改 localPosition.x(表现层),不改 Y/Z/旋转/缩放/引用,不与只改 alpha/scaleY 的入场动画冲突。
/// 满足三要求:1) 不改业务逻辑/引用;2) 仅横向,首帧于设计分辨率(16:9)测量则位置逐像素不变;
/// 3) 跟随边缘。
///
[DisallowMultipleComponent]
public sealed class UITransformEdgeFollow : MonoBehaviour
{
public enum Edge { Left, Right }
[SerializeField] private Edge edge = Edge.Left;
// 设计基准宽度:gap 以 16:9(1920)设计画布为基准计算,与首次附加时的实际分辨率无关,
// 保证 16:9 逐像素一致、其它分辨率下敌人始终贴同一边缘、露出同样部分。
private const float DesignWidth = 1920f;
private Transform tf;
private RectTransform rootRt; // 所属 Canvas 的 RectTransform
private float gap; // 对象中心到选定边缘的间距(设计参考单位,恒定)
private bool measured;
private float lastRootW = -1f;
private void OnEnable()
{
tf = transform;
ResolveRoot();
Measure();
}
private void ResolveRoot()
{
Canvas c = GetComponentInParent