123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233 |
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text.RegularExpressions;
- using UnityEngine;
- using UnityEngine.Events;
- using UnityEngine.UI;
- public sealed class MovieOfFrames : MonoBehaviour
- {
- /// <summary>
- /// 类型
- /// </summary>
- public enum Style
- {
- /// <summary>
- /// 循环
- /// </summary>
- Loop = 0,
- /// <summary>
- /// 乒乓
- /// </summary>
- PingPong = 1,
- /// <summary>
- /// 单次
- /// </summary>
- Once = 2
- }
- [SerializeField]
- bool m_PlayOnAwake = false;
- [SerializeField]
- int m_CurrentFrame = 0;
- [SerializeField]
- int m_FrameRate = 25;
- [SerializeField]
- Style m_Style = Style.Once;
- [SerializeField]
- float m_Space = 0;
- [SerializeField]
- List<Texture2D> m_Frames = new List<Texture2D>();
- [SerializeField]
- RawImage mRawImage = null;
- bool m_IsPlaying = false;
- /// <summary>
- /// 播放类型
- /// </summary>
- public Style style {
- get {
- return m_Style;
- }
- set {
- m_Style = value;
- }
- }
- /// <summary>
- /// 播放中?
- /// </summary>
- public bool isPlaying {
- get {
- return m_IsPlaying;
- }
- }
- /// <summary>
- /// 循环
- /// </summary>
- public bool loop {
- get {
- return style == Style.Loop;
- }
- set {
- if (value)
- style = Style.Loop;
- else
- style = Style.Once;
- }
- }
- public float space {
- get {
- return m_Space;
- }
- set {
- m_Space = value;
- }
- }
- /// <summary>
- /// 当前显示画面
- /// </summary>
- public Texture texture {
- get {
- return m_Frames[m_CurrentFrame];
- }
- }
- /// <summary>
- /// 总帧数
- /// </summary>
- public int maxFrames {
- get {
- return m_Frames.Count - 1;
- }
- }
- /// <summary>
- /// 当前帧数
- /// </summary>
- public int currentFrame {
- get {
- return m_CurrentFrame;
- }
- set {
- value = Mathf.Clamp(value, 0, maxFrames);
- m_CurrentFrame = value;
- Sample();
- }
- }
- /// <summary>
- /// 帧速率
- /// </summary>
- public int frameRate {
- get {
- return m_FrameRate;
- }
- }
- /// <summary>
- /// 起始是否播放
- /// </summary>
- public bool playOnAwake {
- get {
- return m_PlayOnAwake;
- }
- set {
- m_PlayOnAwake = value;
- }
- }
- /// <summary>
- /// 序列集合
- /// </summary>
- public Texture2D[] frames {
- get {
- return m_Frames.ToArray();
- }
- set {
- Sample();
- Stop();
- }
- }
- /// <summary>
- /// 播放
- /// </summary>
- public void Play() {
- if (isPlaying)
- return;
- m_IsPlaying = true;
- m_CurrentFrame = 0;
- Sample();
- StartCoroutine("PlayMovie");
- }
- /// <summary>
- /// 停止
- /// </summary>
- public void Stop() {
- StopCoroutine("PlayMovie");
- if (m_IsPlaying) {
- m_IsPlaying = false;
- }
- }
- /// <summary>
- /// 采样(更新图片)
- /// </summary>
- public void Sample() {
- mRawImage.texture = texture;
- }
- void Awake() {
- m_Frames = m_Frames.Where(f => Regex.IsMatch(f.name, @"^\d+$")).OrderBy(f => int.Parse(f.name)).ToList();
- }
- void OnEnable() {
- if (m_PlayOnAwake)
- Play();
- }
- void OnDisable() {
- Stop();
- }
- IEnumerator PlayMovie() {
- bool flag = true;
- while (isPlaying) {
- float waitTime = 1f / m_FrameRate;
- switch (m_Style) {
- case Style.Loop:
- if (m_CurrentFrame == maxFrames) {
- m_CurrentFrame = 0;
- yield return new WaitForSeconds(space);
- }
- m_CurrentFrame++;
- break;
- case Style.PingPong:
- if (m_CurrentFrame == maxFrames) {
- flag = false;
- yield return new WaitForSeconds(space);
- }
- if (m_CurrentFrame == 0) {
- flag = true;
- yield return new WaitForSeconds(space);
- }
- if (flag) {
- m_CurrentFrame++;
- }
- else {
- m_CurrentFrame--;
- }
- break;
- case Style.Once:
- if (m_CurrentFrame == maxFrames) {
- m_IsPlaying = false;
- StopCoroutine("PlayMovie");
- }
- m_CurrentFrame++;
- break;
- }
- m_CurrentFrame = Mathf.Clamp(m_CurrentFrame, 0, maxFrames);
- Sample();
- yield return new WaitForSecondsRealtime(waitTime);
- }
- }
- }
|