Unity Shader播放序列帧动画

 1 Shader "LordShader/AnimateSprite" {
 2     Properties {
 3         _MainTint ("Diffuse Color", Color) = (1,1,1,1)            //颜色属性,可以在u3d inspector面板控制该变量
 4         _MainTex("Base (RGB)",2D) = "white" {}  //贴图
 5         _TexWidth("Sheet Width",float) = 0.0    //贴图宽度像素值
 6         _SpriteFrameNum("Sprite Frame Counts",float) = 9.0  //总帧数
 7         _Speed("Speed ",Range(0.01,32)) = 12    //播放速度
 8     }
 9     SubShader {
10         Tags { "RenderType"="Opaque" }
11         LOD 200
12
13         CGPROGRAM
14         #pragma surface surf Lambert
15
16         fixed4 _MainTint;            //主颜色
17         sampler2D _MainTex;            //主贴图
18         float _TexWidth;            //贴图宽度像素值
19         float _SpriteFrameNum;        //动画帧数
20         float _Speed;                //播放速度
21         float  _TimeValue;            //从脚本传递过来的数
22
23         struct Input {
24             float2 uv_MainTex;
25         };
26
27         void surf (Input IN, inout SurfaceOutput o) {
28             float2 spriteUV = IN.uv_MainTex;
29             float uAddPerFrame = 1 / _SpriteFrameNum;         //每一帧U值的增量
30
31             //获取一个0 1 2 3 循环的值
32             //fmod 返回 x/y 的余数(取模)。如果 y 为 0 ,结果不可预料
33             float timeVal = fmod(_Time.y * _Speed,_SpriteFrameNum);  //进行取余数操作 得到当前要显示的图片的下标
34             timeVal = ceil(timeVal);
35
36             //float timeVal = _TimeValue;        //_TimeValue直接通过脚本传递 material.SetFloat("_TimeValue",timeVal);
37             float xValue = spriteUV.x;            //UV坐标中的X坐标(0到9)
38             xValue *= uAddPerFrame;                //把UV值指定到第一张小图的范围 注意
39
40             xValue += timeVal * uAddPerFrame; //每次执行把图片切下一张小图,累加u的增量值
41             spriteUV = float2(xValue,spriteUV.y);
42             fixed4 c = tex2D (_MainTex, spriteUV) * _MainTint;
43             o.Albedo = c.rgb * _MainTint;
44             o.Alpha = c.a;
45         }
46         ENDCG
47     }
48     FallBack "Diffuse"
49 }

时间: 2024-12-28 11:40:52

Unity Shader播放序列帧动画的相关文章

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

quick cocos2dx 播放序列帧动画的实现

本帖基于quick cocos2dx2.2.6版本. 序列帧动画:顾名思义就是在一定的时间内播放多张图片. 基本原理非常简单,在一个固定的位置1秒时间内轮询播放有限数量的不同图片.比如1秒中播放24张图(FPS=24) 在quick引擎中可以通过framwork中的transition.lua文件中得transition.playAnimationForever(target, animation, delay)接口来实现动画的播放,其源码如下: function transition.play

Unity NGUI实现序列帧动画播放

如题,要实现序列帧的播放导入图片的时候需要注意: (1)图片的命名要连续,如图: (2)将这些图片在NGUI中打包成Altas图集的时候图片应该在同一个Altas中: 这里以播放特效为例,满足条件时播放特效,不满足条件时不播放特效.接下来可以创建一个Sprite,然后用代码控制序列帧特效的播放和停止: 播放: if (something == false) { this._power_effect_sprite.GetComponent<UISprite>().enabled = true;

Shader实例:序列帧动画

效果: 序列帧图片网上随便找的,质量不是很好,重点不是它,不要在意. 思路: 1.之前都是在一张面片上直接映射一张纹理,IN.uv的范围是0~1 现在要映射一张纹理上的一小块区域,就要用这块区域的uv去采样后映射到面片. 所以:x方向,IN.uv.x/列数,范围变化到0~(1/列数) 同理:y方向,IN.uv.y/行数,范围变化到0~(1/行数) 2.根据时间驱动,加上当前sprite的偏移量 uv.x = cellX + SpriteColumnIndex*1.0 / _Column; uv.

关于在unity中使用序列帧动画

//动画数组 public object[] anim; //限制一秒多少帧 public float fps = 30; //帧序列 private int nowFram; //记录当前时间 private float switchTime; public string path = "Texture/33"; public bool isLoop = false; public Image image; public Texture2D texture; void Awake()

[Cocos2d-x v3.x]序列帧动画

简介 Cocos2d-x中,动画的具体内容是依靠精灵显示出来的,为了显示动态图片,我们需要不停切换精灵显示的内容,通过把静态的精灵变为动画播放器从而实现动画效果.动画由帧组成,每一帧都是一个纹理,我们可以使用一个纹理序列来创建动画. 我们使用Animation类描述一个动画,而精灵显示动画的动作则是一个Animate对象.动画动作Animate是精灵显示动画的动作,它由一个动画对象创建,并由精灵执行. 创建方法 - 手动添加序列帧到Animation类 - 使用文件初始化Animation类 手

cocos2d-x学习笔记(二)序列帧动画实现的几种方法

一.cocos2d-x帮助文档中关于动画帧动画的实现有两种方法: 手动添加序列帧到Animation类 使用文件初始化Animation类 这里我就不列出来,大家可以看下官方文档 http://www.cocos.com/doc/article/index?type=cocos2d-x&url=/doc/cocos-docs-master/manual/framework/native/v3/frame-animation/zh.md 二.有些时候我们需要从plist取出指定的几个图片(而不是全

序列帧动画

简介 Cocos2d-x中,动画的具体内容是依靠精灵显示出来的,为了显示动态图片,我们需要不停切换精灵显示的内容,通过把静态的精灵变为动画播放器从而实现动画效果.动画由帧组成,每一帧都是一个纹理,我们可以使用一个纹理序列来创建动画. 我们使用Animation类描述一个动画,而精灵显示动画的动作则是一个Animate对象.动画动作Animate是精灵显示动画的动作,它由一个动画对象创建,并由精灵执行. 创建方法 手动添加序列帧到Animation类 使用文件初始化Animation类 手动添加

unity shader序列帧动画代码,顺便吐槽一下unity shader系统

http://www.cnblogs.com/hellohuan/archive/2014/01/10/3512784.html 一.看到UNITY论坛里有些人求unity shader序列帧动画,写shader我擅长啊,就顺势写了个CG的shader.代码很简单,就是变换UV采样序列帧贴图,美术配置行数列数以及变换速度. Shader "HELLOHUAN/Hello_Sequence" { Properties { _Color ("Main Color", C