欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【Unity3d】简单的UGUI序列帧播放

程序员文章站 2022-03-25 21:25:26
...

UGUI的Image配合Animation可以很方便的实现序列帧播放的功能。我们也能自己写一个播放脚本来控制序列帧的播放,这样就可以方便地在特定帧数插入一些事件。

设计一个SpriteAnimatior脚本:

public class SpriteAnimator : MonoBehaviour
{

    public bool playAwake;
    public Sprite[] frames;
    public float speed = 0.05f;
    public int actionFrame = -1f;
    public UnityEvent frameEvent;

    private Image container;
    private int ticked;
    private float time;
    private bool doAnim;

    private void Awake()
    {
        container= GetComponent<Image>();
        Init();
    }

    private void Init()
    {
        ticked = 0;
        time = 0;
        doAnim = playAwake;
        container.sprite = frames[0];
    }

    public void Play()
    {
        ticked = 0;
        time = 0;
        doAnim = true;
        container.sprite = frames[0];
    }

    public void Pause()
    {
        doAnim = false;
    }

    public void Resume()
    {
        doAnim = true;
    }

    public void Stop()
    {
        ticked = 0;
        time = 0;
        doAnim = false;
        container.sprite = frames[0];
    }

    void Update()
    {
        if (doAnim)
        {
            time += Time.deltaTime;
            if (time > speed)
            {
                ticked++;
                if (ticked == frames.Length)
                    ticked = 0;
                else
                    time = 0;

                if(ticked == actionFrame)
                    frameEvent.Invoke();

                container.sprite = frames[ticked];
            }
        }
    }
}

将脚本挂载到物体上:
- playAwake:自动播放
- frames:序列帧,如果有很多帧数可以从resources或者其他地方加载
- speed:播放速度
- actionFrame:执行事件的帧数,也可以做一个数组执行多个事件
- frameEvent:特定帧数执行的事件,如果需要有多个事件可以与actionFrame一同设计一个class或者struct

调用play方法即可播放。如果有循环与否或者其他需求,只需在执行到特定帧数的时候添加一个判断即可。

by:蒋志杰