• 关于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,然后点击运行。

  • 相关阅读:
    Event 事件(最简单实用)
    Codeforces Beta Round #93_A题
    欧几里得算法扩展(extended gcd)解不定方程_初入门
    HDU2955_Robberies_01背包变种
    HDU2602_Bone Collector_很水的01背包
    USACO_2_1_3_Sorting a ThreeValued Sequence_交换环
    Codeforces Beta Round #93_B题
    中国剩余定理的_非互素同余模板
    HDU1114_DP_完全背包
    HDU3809_Decrypt coordinate_迭代法
  • 原文地址:https://www.cnblogs.com/HangZhe/p/6905847.html
Copyright © 2020-2023  润新知