VirtualFramework/Assets/Scripts/FrameAnimation.cs

102 lines
2.4 KiB
C#
Raw Normal View History

2025-03-19 11:05:35 +08:00
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class FrameAnimation : MonoBehaviour
{
[Header("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>")]
[SerializeField] private Sprite[] frameSprites; // <20><><EFBFBD><EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD><E9A3A8><EFBFBD><EFBFBD>125<32><35>ͼƬ<CDBC><C6AC>
[SerializeField] private float totalTime = 5f; // <20><>ʱ<EFBFBD><CAB1>
[SerializeField] private bool loop = true; // <20>Ƿ<EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
private Image img;
private int totalFrames;
private float frameInterval;
private Coroutine animationCoroutine;
void Start()
{
InitializeComponents();
ValidateFrameData();
CalculateFrameInterval();
StartAnimation();
}
void InitializeComponents()
{
img = GetComponent<Image>();
if (img == null)
{
img = gameObject.AddComponent<Image>();
}
}
void ValidateFrameData()
{
if (frameSprites == null || frameSprites.Length == 0)
{
Debug.LogError("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡ͼƬ<CDBC><C6AC>");
enabled = false;
return;
}
totalFrames = frameSprites.Length;
if (totalFrames != 125)
{
Debug.LogWarning("<22><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>125֡<35><D6A1><EFBFBD>þ<EFBFBD>ȷʱ<C8B7><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ֡<C7B0><D6A1><EFBFBD><EFBFBD>" + totalFrames);
}
}
void CalculateFrameInterval()
{
// <20><><EFBFBD><EFBFBD>ÿ֡<C3BF><D6A1><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><E4A3A8>ʱ<EFBFBD><CAB1> / <20><>֡<EFBFBD><D6A1><EFBFBD><EFBFBD>
frameInterval = totalTime / totalFrames;
}
public void StartAnimation()
{
if (animationCoroutine != null)
{
StopCoroutine(animationCoroutine);
}
animationCoroutine = StartCoroutine(PlayAnimation());
}
IEnumerator PlayAnimation()
{
int currentFrame = 0;
do
{
// <20><><EFBFBD>µ<EFBFBD>ǰ֡
img.sprite = frameSprites[currentFrame];
// <20>ȴ<EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
yield return new WaitForSeconds(frameInterval);
// <20><><EFBFBD><EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD>
currentFrame = (currentFrame + 1) % totalFrames;
} while (loop || currentFrame != 0); // ѭ<><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
animationCoroutine = null;
}
void OnDisable()
{
if (animationCoroutine != null)
{
StopCoroutine(animationCoroutine);
animationCoroutine = null;
}
}
// <20><>Inspector<6F>޸IJ<DEB8><C4B2><EFBFBD>ʱʵʱ<CAB5><CAB1><EFBFBD><EFBFBD>
void OnValidate()
{
if (Application.isPlaying && animationCoroutine != null)
{
CalculateFrameInterval();
StartAnimation();
}
}
}