using UnityEngine; /// /// 挂在一块"透明可点击区域"物体上,标记它对应哪条轨道(0-4)。 /// 该物体需带一个 Collider2D(推荐 BoxCollider2D,可旋转)。 /// /// 两种跟随晃动的方式: /// A) 直接把本物体作为会晃动的轨道 GameObject 的子物体 —— Unity 自动跟随平移+旋转, /// 不需要 followTarget,留空即可。 /// B) 无法作为子物体时,把会晃动的轨道 Transform 拖到 followTarget, /// 本脚本会在 LateUpdate 中把自身对齐到它(位置+旋转),保证点击区跟着晃。 /// /// 判定完全不经过这里:命中检测由 TrackTouchInput 遍历触摸完成, /// 只调用 InputManager.PressTrack/ReleaseTrack,判定时机仍走 dspTime。 /// [RequireComponent(typeof(Collider2D))] public class TrackTouchZone : MonoBehaviour { [Tooltip("本区域控制的轨道:0=红 1=绿 2=黄 3=紫 4=蓝")] [Range(0, 4)] public int trackIndex = 0; [Tooltip("可选。若本物体不是轨道的子物体,把会晃动的轨道 Transform 拖到这里,区域会每帧对齐到它(位置+旋转)。")] public Transform followTarget; [Tooltip("followTarget 生效时,是否同步旋转(轨道会旋转时勾上)。")] public bool followRotation = true; private Collider2D _collider; public Collider2D Collider { get { if (_collider == null) _collider = GetComponent(); return _collider; } } private void Awake() { _collider = GetComponent(); } private void LateUpdate() { // 在所有晃动逻辑(Update)之后对齐,避免落后一帧。 if (followTarget == null) return; transform.position = new Vector3( followTarget.position.x, followTarget.position.y, transform.position.z); if (followRotation) { transform.rotation = followTarget.rotation; } } }