查看: 1219|回复: 1
打印 上一主题 下一主题

[经验分享] unity3d 克服不支持gif,实现动画

[复制链接]

100

主题

3

听众

7683

积分

高级设计师

Rank: 6Rank: 6

纳金币
2378
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2015-2-15 16:28:31 |只看该作者 |倒序浏览

var frames : Texture[]; //声明一个数组,存放贴图,声明后,在inspector会看到一个frames的数组,数组的长度可以自己填,填1,就代表只有1张图,可以把一张texture拖进去,填2就代表2张,以此类推

var framesPerSecond = 10;//声明fps,每秒播放几帧,影响动画的速度。

function Update() {

var index : int = (Time.time * framesPerSecond) % frames.Length;//数组的索引,根据时间改变,当前时间乘以fps与总帧数取余,就是播放的当前帧,随着update更新

renderer.material.mainTexture = frames[index];//渲染这个贴图

}

使用:将脚本新建保存,然后建一个cube或者平面,把脚本拖上,然后设置动画的贴图,然后play就可以测试了


由于Unity 不支持GIF动画贴图,所以目前在Unity里面做动态贴图,有两个办法。

一种是将图片导入成关键帧图片序列,类似(0,1,2…)然后在用脚本根据时间逐帧加载贴图.

另一种是将动画里面的关键帧画在一张大图上,然后用OFFSET来根据时间决定贴图的显示位置,从而实现图片改变的动画效果。


下面是一个简单的脚本,翻译自wiki :


//声明整个Texture的分布情况,4行4列,4个动画

var colCount: int =4;

var rowCount: int =4;

//声明想要播放的动画起始位置

//比如rowNumber = 0 colNumber = 0代表红色第一个笑脸

// rowNumber = 3 colNumber = 0 代表黄色第一个笑脸

var rowNumber : int =0; //从0开始计算

var colNumber : int =0; //从0开始计算

var totalCells: int =4;

var fps: int = 10;

var offset: Vector2;

//更新动画,传递参数给SetSpriteAnimation()

function Update () { SetSpriteAnimation(colCount,rowCount,rowNumber,colNumber,totalCells,fps);}

//设置动画SetSpriteAnimation(贴图总列数,总行数,指定动画起始帧所行号,列号,动画总帧数,帧率)

function SetSpriteAnimation(colCount : int,rowCount : int,rowNumber : int,colNumber : int,totalCells : int,fps : int){

// 计算索引

var index : int = Time.time * fps

index = index % totalCells;

// 每个单元大

var size = Vector2 (1.0 / colCount, 1.0 / rowCount);

// 分割成水平和垂直索引

var uIndex = index % colCount;

var vIndex = index / colCount;

//颠倒V,让贴图正过来,所见即所得

offset = Vector2 ((uIndex+colNumber) * size.x, (1.0 – size.y) – (vIndex+rowNumber) * size.y);

renderer.material.SetTextureOffset (“_MainTex”, offset);

renderer.material.SetTextureScale(“_MainTex”, size);

}


Unity 文件夹图像资源的读取


注意文件以及文件夹必须寄宿在Resources目录下,才能顺利调用Resources.Load()和Resources.loadAll()这两个函数得到所需要的图像文件。


public class GUITest : MonoBehaviour {


// Use this for initialization

void Start () {

}

// Update is called once per frame

void Update () {


}


private Texture2D texSingle;

private Texture2D[] texAll;


void OnGUI()

{


if (GUI.Button(new Rect(0,10,100,50),”加载一张贴图”))

{

if (texSingle==null)

{

texSingle = Resources.Load(“single/0″) as Texture2D; //这里不需要加后缀

}


}

if (GUI.Button(new Rect(0,130,100,50),”加载一组贴图”))

{

if (texAll==null)

{

var textures = Resources.LoadAll(“textures”);

int countAll=textures.Length;

texAll=new Texture2D[countAll];

for (int i = 0; i < countAll; i++)

{

texAll = textures as Texture2D;

}



}

}


//绘制贴图

if (texSingle!=null)

{

GUI.DrawTexture(new Rect(110,10,80,80),texSingle,ScaleMode.ScaleToFit,true,0);

}

if (texAll!=null)

{

int countOfAll = texAll.Length;

for (int i = 0; i < countOfAll; i++)

{

GUI.DrawTexture(new Rect(110+i*80,130,80,80),texAll,ScaleMode.ScaleToFit,true,0);

}

}

}

}


分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

20

主题

5

听众

1090

积分

助理设计师

Rank: 4

纳金币
105
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

沙发
发表于 2015-2-16 14:09:56 |只看该作者
thanks for sharing !!!!!!!!!!!!!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

关闭

站长推荐上一条 /1 下一条

手机版|纳金网 ( 闽ICP备08008928号

GMT+8, 2024-4-29 09:49 , Processed in 0.086346 second(s), 27 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部