102 lines
2.4 KiB
C#
102 lines
2.4 KiB
C#
|
|
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();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|