using Base; using UnityEngine; namespace Prefab { [RequireComponent(typeof(SpriteRenderer))] public class SpriteAnimator : MonoBehaviour, ITick { // 公开字段(可在编辑器中设置) [SerializeField] private Sprite[] _sprites; // 动画精灵序列 [SerializeField] private float _fps = 2; // 每秒帧数 [SerializeField] private Sprite _staticSprite; // 暂停时的静态精灵 private SpriteRenderer _renderer; // 渲染器组件 private bool _isPaused; // 暂停状态 private float _frameTimer; // 帧计时器 private int _currentFrameIndex; // 当前帧索引 private void Awake() { _renderer = GetComponent(); ValidateStartFrame(); } // ITick接口实现 public void Tick() { var deltaTime=Time.deltaTime; if (_isPaused) { HandlePausedState(); return; } PlayAnimation(deltaTime); } private void ValidateStartFrame() { // 确保有精灵时可显示有效帧 if (_sprites != null && _sprites.Length > 0) { _currentFrameIndex = Mathf.Clamp(_currentFrameIndex, 0, _sprites.Length - 1); _renderer.sprite = _sprites[_currentFrameIndex]; } else { _renderer.sprite = null; } } private void HandlePausedState() { // 优先使用静态精灵,否则保持当前帧 if (_staticSprite) { _renderer.sprite = _staticSprite; } } private void PlayAnimation(float deltaTime) { if (_sprites == null || _sprites.Length == 0) return; // 更新帧计时器 _frameTimer += deltaTime; float frameDuration = 1f / _fps; // 检查帧切换条件 while (_frameTimer >= frameDuration) { _frameTimer -= frameDuration; NextFrame(); } } private void NextFrame() { // 循环播放动画 _currentFrameIndex = (_currentFrameIndex + 1) % _sprites.Length; _renderer.sprite = _sprites[_currentFrameIndex]; } // 外部控制方法 public void SetPaused(bool paused) => _isPaused = paused; public void SetSprites(Sprite[] newSprites) => _sprites = newSprites; public void SetFPS(float newFPS) => _fps = Mathf.Max(0.1f, newFPS); public void SetStaticSprite(Sprite sprite) => _staticSprite = sprite; } }