using UnityEngine; namespace Entity { public class SpriteAnimator : MonoBehaviour { // 引用 SpriteRenderer 组件 [SerializeField] private SpriteRenderer spriteRenderer; // 精灵列表 [SerializeField] private Sprite[] sprites; // 动画帧率 (Frames Per Second) [SerializeField] private float fps = 10f; // 是否暂停动画 [SerializeField] private bool isPaused = false; // 暂停时显示的静态精灵索引 (-1 表示不显示静态精灵) [SerializeField] private int staticSpriteIndex = -1; // 当前帧索引 private int currentFrameIndex = 0; // 帧间隔时间 private float frameInterval; // 计时器 private float timer; private void Start() { // 初始化帧间隔时间 frameInterval = 1f / fps; // 如果指定了静态精灵索引,则直接显示静态精灵 if (staticSpriteIndex >= 0 && staticSpriteIndex < sprites.Length) { ShowStaticSprite(staticSpriteIndex); } else { // 否则从第一个精灵开始 UpdateSprite(); } } private void Update() { // 如果暂停并且没有设置静态精灵,则不更新 if (isPaused && staticSpriteIndex == -1) return; // 如果暂停并设置了静态精灵,则直接显示静态精灵 if (isPaused && staticSpriteIndex >= 0) { ShowStaticSprite(staticSpriteIndex); return; } // 更新计时器 timer += Time.deltaTime; // 如果达到下一帧的时间间隔 if (timer >= frameInterval) { timer -= frameInterval; // 重置计时器 UpdateSprite(); // 更新精灵 } } /// /// 更新当前显示的精灵 /// private void UpdateSprite() { if (sprites.Length == 0) return; // 如果没有精灵,则退出 // 设置当前帧的精灵 spriteRenderer.sprite = sprites[currentFrameIndex]; // 循环播放:更新到下一帧 currentFrameIndex = (currentFrameIndex + 1) % sprites.Length; } /// /// 显示静态精灵 /// /// 静态精灵的索引 private void ShowStaticSprite(int index) { if (index < 0 || index >= sprites.Length) { Debug.LogWarning("静态精灵索引超出范围!"); return; } // 显示指定的静态精灵 spriteRenderer.sprite = sprites[index]; } /// /// 开始播放动画 /// public void PlayAnimation() { isPaused = false; // 取消暂停 staticSpriteIndex = -1; // 清除静态精灵索引 } /// /// 暂停动画并显示静态精灵 /// /// 静态精灵的索引 public void PauseAnimationWithStaticSprite(int index) { if (index < 0 || index >= sprites.Length) { Debug.LogWarning("静态精灵索引超出范围!"); return; } isPaused = true; // 暂停动画 staticSpriteIndex = index; // 设置静态精灵索引 } /// /// 暂停动画但不显示静态精灵 /// public void PauseAnimation() { isPaused = true; // 暂停动画 staticSpriteIndex = -1; // 不显示静态精灵 } /// /// 设置帧率 /// /// 新的帧率 public void SetFPS(float newFps) { if (newFps <= 0) { Debug.LogWarning("帧率必须大于 0!"); return; } fps = newFps; frameInterval = 1f / fps; // 更新帧间隔时间 } } }