关于Unity中的帧动画组件的编写

一、帧动画

1: 美术准备好一个连续动作的离散图片;
2: 程序在准确的时间来切换这个图片;
3: 优点: 简单,速度快;
缺点:资源占用相对过大;

 

二、frame_anim组件编写

1: 代码里面强制要求加入Image组件;[RequireComponent(typeof(Image))]
2: 帧动画的参数:
(1) Sprite数组;
(2) 间隔时间;
(3) 是否循环播放;
(4) 是否在加载的时候播放;
3: 根据时间让Image组件显示正确的帧;

 

三 、实例步骤

1.创建一个Canvas

2.对Canvas进行初始化

3.创建一个Image的UI节点作为Canvas的子节点,名字叫bg,拖进背景图片到这个节点中。

4.把帧动画贴图放进一个anim的文件夹中,anim在Resources文件夹下

5.创建一个空节点叫anim,在canvas节点下面。

6.创建一个脚本frame_anim,挂载在anim节点下面。

7.frame_anim脚本内容

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

// 我们当前代码强制要求要加入一个Image组件,
// 如果没有Image组件,那么自动加上,如果有就使用;
// 如果你的代码要求这个节点必须挂某个组件,那么
// 使用RequireComponent
[RequireComponent(typeof(Image))]

public class frame_anim : MonoBehaviour {
    // 我们这个动画所需要的画面;
    public Sprite[] sprite_frames;
    // 帧动画的间隔时间
    public float duration = 0.1f;
    // 是否循环播放
    public bool is_loop = false;
    // 是否在加载的时候开始播放;
    public bool play_onload = false;

    private float played_time;
    private bool is_playing = false;

    private Image img;
    // Use this for initialization
    void Start () {
        this.img = this.GetComponent<Image>();
        if (this.play_onload) {
            if (this.is_loop) {
                this.play_loop();
            }
            else {
                this.play_once();
            }
        }
    }

    // 只播放一次
    void play_once() {
        if (this.sprite_frames.Length <= 1) {
            return;
        }

        this.played_time = 0;
        this.is_playing = true;
        this.is_loop = false;
    }

    // 循环播放
    void play_loop() {
        if (this.sprite_frames.Length <= 1) {
            return;
        }
        this.played_time = 0;
        this.is_playing = true;
        this.is_loop = true;
    }
    // 停止当前的动画播放
    void stop_anim() {
        this.is_playing = false;
    }
    // Update is called once per frame
    void Update () {
        if (this.is_playing == false) {
            return;
        }

        // 
        float dt = Time.deltaTime;
        this.played_time += dt;
        // 向下取整;
        int index = (int)(this.played_time / this.duration);
        if (this.is_loop == false) {
            // 结束了
            if (index >= this.sprite_frames.Length) { // 停止播放
                this.is_playing = false;
                this.played_time = 0;
            }
            else {
                this.img.sprite = this.sprite_frames[index];
            }
        }
        else {
            // 超过了范围,减掉一个周期
            while (index >= this.sprite_frames.Length) {
                this.played_time -= (this.duration * this.sprite_frames.Length);
                index -= this.sprite_frames.Length;
            }

            this.img.sprite = this.sprite_frames[index];
        }
        // end 
    }
}

8.在Inspetor视图的frame_anim脚本里面展开Sprite_frame,size设置为10,把10张帧图片拖进去

9.在Inspetor视图的frame_anim脚本下勾选play_onload,选择是否勾选is_loop循环播放,设置动画速率Duration,然后点击运行。

posted @ 2017-05-25 20:45  杭者  阅读(986)  评论(0编辑  收藏  举报