您的位置:首页 > 移动开发 > Unity3D

Unity3D中播放序列帧动画

2015-02-22 11:42 459 查看
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);

}

}

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

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

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

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

[align=left][/align]

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: