unity3d 克服不支持gif,实现动画
2014-04-25 09:45
387 查看
Unity的简单贴图动画的应用
来源:http://blog.sina.com.cn/s/blog_62d4e4480100jyah.html
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[i] = textures[i] 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[i],ScaleMode.ScaleToFit,true,0);
}
}
}
}
来源:http://blog.sina.com.cn/s/blog_62d4e4480100jyah.html
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[i] = textures[i] 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[i],ScaleMode.ScaleToFit,true,0);
}
}
}
}
相关文章推荐
- unity3d 克服GIF不支持,贴图实现动画效果
- Java之简单的图片动态显示(实现类似GIF动画效果)
- Android实现播放GIF动画的强大ImageView
- css3实现特殊动画,支持手机
- java实现gif动画效果(java显示动态图片)
- unity3d动画操作以及动画实现
- 使用定时器显示GIF动画的ATL控件实现
- DELPHI - Delphi 2007 已内部支持 GIF 动画了
- J2ME GIF 编码器(支持动画)
- Unity3D Function Not Supported - Unity动画事件提示不支持的解决方法
- PHP之生成GIF动画的实现方法
- unity3d用动画遮罩(avatar mask)实现动画切换
- unity3D Mecanim动画系统Generic动画支持动画中的位移
- SWT图片显示,支持JPEG,GIF(动画),BMP,ICO,PNG和TIFF
- 完美实现GIF动画缩略图(GIF压缩使用C++、shell命令、php)
- 关于在SVG中如何实现gif动画的问题?
- 为gif动画添加水印-有具体实现[2008-02-15日更新]
- unity3D新版动画如何实现动画的融合
- php图片等比压缩代码,支持jpg,png,gif,验证gif动画
- iOS的GIF动画效果实现