码迷,mamicode.com
首页 > 编程语言 > 详细

Unity3D中播放序列帧动画

时间:2015-02-22 12:18:33      阅读:289      评论:0      收藏:0      [点我收藏+]

标签:3d游戏开发   unity3d培训   unity3d游戏   unity培训   unity3d学习   

【狗刨学习网】

class FrameAnimation 
{
    private float fps = 10.0f;
    private Rect drawPos;

    private float time = 0;
    private int currentIndex = 0;

    public void DrawFrameAnimation(Texture[] frameTex) 
    {
        int length = frameTex.Length;
        GUI.DrawTexture(drawPos, frameTex[currentIndex]);

        time += Time.deltaTime;

        if(time >= 1.0f/fps)
        {
            currentIndex++;
            time = 0;
            if(currentIndex>= length-1)
            {
                currentIndex = length - 1;
            }
        }
    }

    public FrameAnimation(Rect drawPos,float fps)
    {
        this.drawPos = drawPos;
        this.fps = fps;
    }

}

在unity3D中新建一个脚本直接调用该类。


using UnityEngine;
using System.Collections;


public class DrawAnimation : MonoBehaviour {


    //private Resources resource;
    private Rect drawPos = new Rect(200,0,500,200);
    private Object[] texObject;
    public bool isCanDraw = false;


    private string path;


    Texture[] frameTex;
    private FrameAnimation frameAni;


    // Use this for initialization
    void Start () {
        LoadTexture(texObject,"FrameTex");
        frameAni = new FrameAnimation( drawPos, 10);
    }
    
    void OnGUI() 
    {
        if(GUILayout.Button("@#@"))
        {
            isCanDraw = true;
        }
        if(isCanDraw)
        {
            frameAni.DrawFrameAnimation(frameTex);
        }
    }


    void LoadTexture(Object[] texObj, string path)
    {
        texObj = Resources.LoadAll(path);
        frameTex = new Texture[texObj.Length];
        texObj.CopyTo(frameTex, 0);
    }



}




其实完全没有必要写成类,但是为了方便修改和最近在练习写代码的习惯,希望逐渐面向对象编程,希望可以提高代码的灵活性和复用性,所以就当是练习了!
2013/9/26:
发现把所有图片一次性全部导入,加载相当的消耗资源,在PC上都会卡上一下,何况在移动平台上,特别有的时候图片稍微多的时候。
所以把代码稍作修改:

int currentIndex = 0;
    Texture frameAniTex;
    // Use this for initialization
    void Start ()
    {
        
    }
   
    // Update is called once per frame
    void FrameAnimation()
    {
        //isAnimating = true;
        frameAniTex = resources.GetTexture("BootAnim/" + currentIndex.ToString("D4"));

        GUI.DrawTexture(frameAnimPos,frameAniTex);
        if (currentIndex < length - 1)
        {
            time += Time.deltaTime;
            if (time >= 1.0f / fps)
            {
                currentIndex++;
                time = 0;
                if (currentIndex == length - 1)
                {
                    Resources.UnloadUnusedAssets();     ///加载完成后,即播放完毕后,卸载掉这些资源,好像跟播放序列帧动画扯远了,这是加载资源管理才对、、、、、
                }
            }
        }
    }

这样做的好处是一张一张的加载资源,不像上面的那样一次性加载完,但是图片的数量即length的数量需要自己手动传入,因为无法根据代码动态获取。

声明:此篇文档时来自于【狗刨学习网】社区,是网友自行发布的Unity3D学习文章,如果有什么内容侵犯了你的相关权益,请与官方沟通,我们会即时处理。

更多精彩内容:www.gopedu.com

Unity3D中播放序列帧动画

标签:3d游戏开发   unity3d培训   unity3d游戏   unity培训   unity3d学习   

原文地址:http://blog.csdn.net/book_longssl/article/details/43907111

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!