using UnityEngine; using UnityEngine.UI; namespace TKS.OutGame { /// /// UI 이미지 프레임 재생(로비 영웅 대기 · PD 2026-11-11) — 프레임·순서·유지 초·깜빡임 = 유닛 meta 클립(UnitArtData · 전투 FrameAnimator 와 같은 규칙). /// 매 프레임 바뀔 수 있으므로 Frame 캔버스 안에서만(UiLayer.Isolate · 이미 Frame 층 안이면 그 층을 씀). /// public class UiFrameAnim : MonoBehaviour { Image img; UnitArtData data; string clip; Sprite[] frames; float t0; float nextBlink; float blinkEnd = -1f; public static UiFrameAnim Attach(Image img, UnitArtData data, string clip) { Sprite[] fr; if (img == null || data == null || !data.Clips.TryGetValue(clip, out fr) || fr.Length < 2) return null; var a = img.gameObject.AddComponent(); a.img = img; a.data = data; a.clip = clip; a.frames = fr; // 영웅마다 시작 시점을 달리(모두 같이 움직이면 어색) a.t0 = Time.unscaledTime - Random.value * data.CycleSeconds(clip, fr.Length); UiLayer.Isolate(img.gameObject); return a; } void Update() { if (img == null || frames == null) return; float now = Time.unscaledTime - t0; int k = data.ApplyBlink(clip, frames.Length, data.FrameAt(clip, frames.Length, now), now, ref nextBlink, ref blinkEnd); var sp = frames[k]; if (img.sprite != sp) img.sprite = sp; } } }