Unity——UGUI序列帧动画

 序列帧动画原理是首先必须要有一个载体,一般是一个图片,然后申请一个数组或List用来存放序列帧,然后再根据需要遍历这个数组替换载体的图片源,这样就实现动画效果了。代码如下:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
using System;

namespace Engine
{
	[RequireComponent(typeof(Image))]
	public class SimpleFrameAnim : MonoBehaviour
	{
		private Image ImageSource;
		private int mCurFrame = 0;
		private float mDelta = 0;

		public float FPS = 20;
		public List<Sprite> SpriteFrames;
		public bool IsPlaying = false;
		public bool Foward = true;
		public bool AutoPlay = false;
		public bool Loop = false;

        private Action<object> animPlayEndAction = null;
        private object caller = null;

        public int FrameCount
		{
			get
			{
				return SpriteFrames.Count;
			}
		}

		void Awake()
		{
			ImageSource = GetComponent<Image>();
		}

		void Start()
		{
			if (AutoPlay)
			{
				Play();
			}
			else
			{
				IsPlaying = false;
			}
		}

		private void SetSprite(int idx)
		{
			ImageSource.sprite = SpriteFrames[idx];
			//该部分为设置成原始图片大小,如果只需要显示Image设定好的图片大小,注释掉该行即可。
			ImageSource.SetNativeSize();
		}

		public void Play()
		{
			IsPlaying = true;
			Foward = true;
		}

		public void PlayReverse()
		{
			IsPlaying = true;
			Foward = false;
		}

		void Update()
		{
			if (!IsPlaying || 0 == FrameCount)
			{
				return;
			}

			mDelta += Time.deltaTime;
			if (mDelta > 1 / FPS)
			{
				mDelta = 0;
				if(Foward)
				{
					mCurFrame++;
				}
				else
				{
					mCurFrame--;
				}

				if (mCurFrame >= FrameCount)
				{
					if (Loop)
					{
						mCurFrame = 0;
					}
					else
					{
						IsPlaying = false;
                        if (animPlayEndAction != null)
                            animPlayEndAction.Invoke(caller);

                        return;
					}
				}
				else if (mCurFrame<0)
				{
					if (Loop)
					{
						mCurFrame = FrameCount-1;
					}
					else
					{
						IsPlaying = false;
                        if (animPlayEndAction != null)
                            animPlayEndAction.Invoke(caller);
                        return;
					}          
				}

				SetSprite(mCurFrame);
			}
		}

		public void Pause()
		{
			IsPlaying = false;
		}

		public void Resume()
		{
			if (!IsPlaying)
			{
				IsPlaying = true;
			}
		}

		public void Stop()
		{
			mCurFrame = 0;
			SetSprite(mCurFrame);
			IsPlaying = false;
		}

		public void Rewind()
		{
			mCurFrame = 0;
			SetSprite(mCurFrame);
			Play();
		}

        public void AddAnimPlayEndListener(Action<object> aciton, object caller)
        {
            animPlayEndAction = aciton;
            this.caller = caller;
        }

    }
}

相比于转载的文章加入了回调函数,可以在 Lua中获取该组件并添加回调方法。

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值