Unity3D ShaderLab 模拟精灵动画

摘要:
Unity3DShaderLab模拟向导动画。在上一篇文章中,我们介绍了如何通过着色器模拟纹理运动。更进一步,我们还可以通过着色器实现帧动画的向导纹理运动。

Unity3D ShaderLab 模拟精灵动画

在上一篇,介绍了通过Shader 模拟纹理运动,那么更深一步讲,我们也可以把帧动画的精灵纹理运动通过shader实现。

虽然大家都是在游戏脚本中做更高一级的控制。但是有钱就是任性,码代码的也可以码任性啊,我们就来试试做精灵的运动动画,遍历播放每一帧。

 

首先呢,准备一个精灵的动画序列帧,没有的找度娘要。然后创建一个新的材质球和新的着色器。然后把准备好的序列帧图拖动到材质的纹理上。

不用多说,_MainTex ("Base (RGB)", 2D) = "white" {},就传递了我们设置好的帧图。

接下来,还要通过Properties来创建动画的数量 速度等。

1add>

Properties {

_MainTex ("Base (RGB)", 2D) = "white" {}

_TexWidht("Image Width",float)=0

_SpriteSize("Sprite Size",float)=0

_Speed("Sprite Speed",Range(0.01,30))=0

}

上面声明的3个对象,同时也要在SubShaderCGPROGRAM下原样申明;

2add>

sampler2D _MainTex;

float _TexWidht;

float _SpriteSize;

float _Speed;

然后我们要把输入的uv值存入独立的变量,保证在代码中的使用。

3add>

void surf (Input IN, inout SurfaceOutput o) {

//uv值存入spriteuv;

float2 spriteUV = IN.uv_MainTex;

//计算单元格的百分比;

float pixeWidth = _TexWidht/_SpriteSize;

float uvPercentage = pixeWidth/_TexWidht;

float timeVal = fmod(_Time.y*_Speed,_SpriteSize);

timeVal = ceil(timeVal);

//计算sprite x方向上的偏移;

float xValue = spriteUV.x;

xValue+=uvPercentage*timeVal*_SpriteSize;

xValue*=uvPercentage;

//刷新uv值;

spriteUV = float2(xValue,spriteUV.y);

//传递新的uv值;

half4 c = tex2D (_MainTex, spriteUV);

o.Albedo = c.rgb;

o.Alpha = c.a;

}

保存代码,回到编辑器中预览吧。

 Unity3D ShaderLab 模拟精灵动画第1张Unity3D ShaderLab 模拟精灵动画第2张

通过上面的逻辑实现,我们不难看出我们首先从input结构体中获得到了uv值,把他存入到变量spriteUV 中,这个变量同时包含了uvxy坐标。

接下来,我们获得在gui面板中传入的纹理宽度TexWidht和精灵数量SpriteSize,通过这两个纹理的参数获得了每一个sprite的宽度和每一个spriteuv中所占的比例值,

这个比例值uvPercentage 表示我们的sprite从上一个精灵单元格到下一个精灵单元格的uv偏移量。

最后,我们通过计算时间递增获得了最新的偏移值,在计算过程中用到了fmod()ceil()函数。

最终我们得到了当前的uv值,传递给tex2D()函数,这样我们的sprite就像播放动画一样动起来;

fmod(x,y):返回x/y的余数,符号同xy不可为0

ceil(x):对输入参数向上取整,直到其值等于SpriteSize他就从新归0

上面我们使用了x方向上的uv偏移,同理也可以加入y方向的uv偏移。从而满足更大的精灵表单循环。

 

code start-------------------------------------------------

 

 

Shader "91YGame/BasicSpriteAni" {
    Properties {
        _MainTex ("Base (RGB)", 2D) = "white" {}
        _TexWidht("Image Width",float)=0
        _SpriteSize("Sprite Size",float)=0
        _Speed("Sprite Speed",Range(0.01,30))=0
    }
    SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 200
        
        CGPROGRAM
        #pragma surface surf Lambert

        sampler2D _MainTex;
        float _TexWidht;
        float _SpriteSize;
        float _Speed;

        struct Input {
            float2 uv_MainTex;
        };

        void surf (Input IN, inout SurfaceOutput o) {
            //uv值存入spriteuv;
            float2 spriteUV = IN.uv_MainTex;
            //计算单元格的百分比;
            float pixeWidth = _TexWidht/_SpriteSize;
            float uvPercentage = pixeWidth/_TexWidht;

            float timeVal = fmod(_Time.y*_Speed,_SpriteSize);
            timeVal = ceil(timeVal);
            //计算sprite x方向上的偏移;
            float xValue = spriteUV.x;
            xValue+=uvPercentage*timeVal*_SpriteSize;
            xValue*=uvPercentage;
            //刷新uv值;
            spriteUV = float2(xValue,spriteUV.y);
            //传递新的uv值;
            half4 c = tex2D (_MainTex, spriteUV);
            o.Albedo = c.rgb;
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

 



 

code end---------------------------------------------------

免责声明:文章转载自《Unity3D ShaderLab 模拟精灵动画》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇NSBundle的使用,注意mainBundle和Custom Bundle的区别IE6中location不跳转问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

iOS学习——核心动画

iOS学习——核心动画1、什么是核心动画   Core Animation(核心动画)是一组功能强大、效果华丽的动画API,无论在iOS系统或者在你开发的App中,都有大量应用。核心动画所在的位置如下图所示,可以看到,核心动画位于UIKit的下一层,相比UIView动画,它可以实现更复杂的动画效果。   核心动画作用在CALayer(Core anima...

Unity 3D 如何修改新建脚本中的 C# 默认创建的 Script 脚本格式

  首先在Unity的安装路径下找到 Unity5EditorDataResourcesScriptTemplates路径的(81-C# Script-NewBehaviourScript.cs.txt)的模板文件,根据你的需要,把内容修改成自己要想的默认格式就好....

unity3d 导出 Excel

我在unity里需要导出成Excel格式,试了一些方法,其中用c#的com组件的我还没成功不知道该怎么在unity里调用,(如果哪位大哥用别的方法在unity里成功了,可以交流下,最好给我一个小demo(849288321@qq.com),谢谢啦.),不过后来找到了这个org.in2bits.MyXls  ,需要导入这个dll(网上有很多),然后用着还挺好...

过渡(transition) 动画(animation)

过渡(transition) 1.transition   -通过过渡可以指定一个属性发生变化时的切换效果,通过过渡可以创建一些好的效果,提升用户体验。   -可以同时设置过渡相关的所有属性,只有一个要求,如果要写延迟,则俩个时间中第一个是持续时间,第二个是延迟时间。 2.transition-property(指定要执行过渡的属性)   -多个属性间用“...

unity之初级工程师

一.值类型与引用类型 值类型的变量直接存储数据,而引用类型的变量持有的是数据的引用,数据存储在数据堆中。值类型变量声明后,不管是否已经赋值,编译器为其分配内存。值类型的实例通常是在线程栈上分配的(静态分配)。 引用类型声明时并没有为其分配堆上的内存空间。引用类型的对象总是在进程堆中分配(动态分配)。 值类型(value type):byte,short,...

Android系统编程入门系列之界面Activity响应丝滑的传统动画

上篇文章介绍了应用程序内对用户操作响应的相关方法位置,简单的响应逻辑可以是从一个界面Activity跳转到另一个界面Activity,也可以是某些视图View的相对变化。然而不管是启动一个界面执行新界面Activity的生命周期方法,还是视图的相对变化,都需要一段时间,所以在响应的最终结果完成之前是有一段空白时间的。而在这段或长或短的时间里,该怎么给用户展...