unity3d 纹理的精灵动画效果

精灵动画,顾名思义是一种动画效果,我们用到的贴图是类似胶卷一样的,把每一帧都放在一张图上,

然后通过变换uv值进行位移切换,

如果你之前没有进行过uv相关的变换,可以查看上一篇文章 unity3d 纹理贴图移动特效

首先我们需要一个张这样的贴图

然后建立一个shader

先声明变量

_TexWidth  贴图总宽度

_CellAmount  一张图上包含几个动作(有几个小图片)

_Speed  动画的速度

	Properties {
		_MainTex ("Base (RGB)", 2D) = "white" {}
		_TexWidth ("Sheet Width", float) = 0.0
		_CellAmount ("Cell Amount", float) = 0.0//有几个画面
		_Speed ("Speed", Range(0.01, 32)) = 12
	}

主要的操作也是在surf函数中进行

需要一点数学的知识。。。。

先浏览一下局部变量

float2 spriteUV   贴图的uv坐标

float cellPixelWidth     贴图中的一个小画面的宽度

float cellUVPercentage     小画面占整个贴图的比率,小画面个数越少比率越大

float timeVal    当前该显示的小图片位数(就是该显示哪个小图片了)

float xValue   贴图uv中的x坐标值

		void surf (Input IN, inout SurfaceOutput o) {

			float2 spriteUV = IN.uv_MainTex;
			float cellPixelWidth = _TexWidth/_CellAmount;//一个小画面的宽度
			float cellUVPercentage = cellPixelWidth/_TexWidth;//小画面占大画面比率,个数越少比率越大
			float timeVal = fmod(_Time.y * _Speed, _CellAmount);
			timeVal = ceil(timeVal);//向上取整,得到一个小于CellAmount的整数
			float xValue = spriteUV.x;			xValue += cellUVPercentage * timeVal * _CellAmount;//
			xValue *= cellUVPercentage;//对uv进行缩放
			spriteUV = float2(xValue, spriteUV.y);
			half4 c = tex2D (_MainTex, spriteUV);
			o.Albedo = c.rgb;
			o.Alpha = c.a;
		}

一个小画面的宽度

= 总宽度 / 小图片数目

cellPixelWidth = _TexWidth/_CellAmount;

小画面占整个贴图的比率 = 一个小画面的宽度 / 整个贴图宽度

cellUVPercentage = cellPixelWidth/_TexWidth

对时间*速度与小图片数目取余,得到的就是一个小于小图片数目的数,正好就是当前该显示的图片位数

fmod(x,y)取余函数,返回一个x/y 的浮点型余数

timeVal = fmod(_Time.y * _Speed, _CellAmount)

但是是fmod()得到的是一个浮点数值,不是一个整数值,

我们就用ceil()这个函数对它进行向上取整

timeVal = ceil(timeVal)

初始化xValue贴图uv中的x坐标值

float xValue = spriteUV.x

进行偏移,得到当前小图片的uv位置

xValue += cellUVPercentage * timeVal * _CellAmount

然后必须对uv进行缩放才能看到一张小图片

xValue *= cellUVPercentage

然后得到最终uv值进行纹理渲染

最终得到这样的结果:

shader代码如下:

Shader "Custom/testShader" {
	Properties {
		_MainTex ("Base (RGB)", 2D) = "white" {}
		_TexWidth ("Sheet Width", float) = 0.0
		_CellAmount ("Cell Amount", float) = 0.0//有几个画面
		_Speed ("Speed", Range(0.01, 32)) = 12
	}
	SubShader {
		Tags { "RenderType"="Opaque" }
		LOD 200

			CGPROGRAM
#pragma surface surf Lambert
			float _TexWidth;
		float _CellAmount;
		float _Speed;

		sampler2D _MainTex;

		struct Input {
			float2 uv_MainTex;
		};

		void surf (Input IN, inout SurfaceOutput o) {

			float2 spriteUV = IN.uv_MainTex;
			float cellPixelWidth = _TexWidth/_CellAmount;//一个小画面的宽度
			float cellUVPercentage = cellPixelWidth/_TexWidth;//小画面占大画面比率,个数越少比率越大
			float timeVal = fmod(_Time.y * _Speed, _CellAmount);
			timeVal = ceil(timeVal);//向上取整,得到一个小于CellAmount的整数
			float xValue = spriteUV.x;			xValue += cellUVPercentage * timeVal * _CellAmount;//
			xValue *= cellUVPercentage;//对uv进行缩放
			spriteUV = float2(xValue, spriteUV.y);
			half4 c = tex2D (_MainTex, spriteUV);
			o.Albedo = c.rgb;
			o.Alpha = c.a;
		}
		ENDCG
	}
	FallBack "Diffuse"
}

-------- by wolf96

时间: 2024-08-27 01:13:05

unity3d 纹理的精灵动画效果的相关文章

Unity3D ShaderLab 模拟精灵动画

在上一篇,介绍了通过Shader 模拟纹理运动,那么更深一步讲,我们也可以把帧动画的精灵纹理运动通过shader实现. 虽然大家都是在游戏脚本中做更高一级的控制.但是有钱就是任性,码代码的也可以码任性啊,我们就来试试做精灵的运动动画,遍历播放每一帧. 首先呢,准备一个精灵的动画序列帧,没有的找度娘要.然后创建一个新的材质球和新的着色器.然后把准备好的序列帧图拖动到材质的纹理上. 不用多说,_MainTex ("Base (RGB)", 2D) = "white" {

Unity3D初学之2D动画制

作者:Alex Rose Unity最近宣布推出额外的2D游戏支持,添加了Box 2D物理和一个精灵管理器. 但这里还是有些技巧需要牢记在心.逐帧更改图像只是动画制作的冰山一角,若要让你的游戏出色运行,你还得使用转换和旋转等功能. 现在让我们先从基本技巧开始. 更改帧 如果你已经准备好了制作动画的纹理,你可能会使用SpriteManager脚本的付费版本,或者Unity的新版本.假设你使用的是2D位面和纹理.这就是一个低效率的方法,但如果你是在制作一个game jam的项目,你可能会想塞入一些可

利用pixi.js制作精灵动画

CSS Sprites 技术对于广大的前端工程师来说应该是一点也不陌生.国内开发者昵称为CSS精灵,通过一定的技术手段,让精灵动起来,我称其为精灵动画,那么目前有哪些实现方式 呢?下面让我们详细的聊聊. 关于实现精灵动画的方式有很多种,我自己实践过的主要有三种: 1: 把动作分解成一系列连续的编号的图片,如img0.jpg,img1.jpg,img2.jpg...,然后利用setIntval等定时器不断的去更换图片地址. 2: 把动作按照一定的间距排列在一张图片上,利用css3的动画帧,做出动画

10款web前端动感的图片动画效果

1.Salvattore:CSS 驱动的 jQuery Masonry 插件 Salvattore 是一个 jQuery 砌体的替代,使用 CSS 驱动的配置.Salvattore 根据您指定的列数组织你的 HTML 元素.容器中的每一个项目会一个接一个被放置在列内,只需要简单地添加一个 data-columns 属性.在你的 CSS 文件中,你可以设置你想为元素创建的列数.要创建一个具有响应性的柱状设计,只需使用媒体查询.项目附加在同一容器的前面,不会发生冲突.您可以结合 XHR 功能的 AP

[Unity3D]Unity4新的动画系统Mecanim

Unity4.X中添加的新的动画系统取代了原来3.X的旧的动画系统,新动画系统Mecanim也是官方推荐的,使得我们写较少的代码来实现连续的动画效果. 效果图 Unity3.X中动画系统播放动画 使用播放play()或淡入淡出播放CrossFade() 例如: animation.Play("name"); animation.CrossFade("name"); 也可以做成队列动画,然后播放,例如: animation.PlayQueued("name&

Unity3D游戏开发之动画模型导入

Unity3D游戏开发之动画模型导入 导入动画文件后,在工程(Porject)面板中选中,通过Inspector面板修改参数设置. 在项目视图中选中模型文件.如果想用旧版3.x的动画系统导入和编辑动画,请选择legacy选项.如果你有一个人性角色,比如,一个脑袋两条胳膊的两足动物,请选择Humanoid和'Create from this model',这样,一个完美匹配你角色骨骼关系的替身就可以被创建,或者你也可以选择其他预设好的替身. 如果你的角色不是人形物体,比如一个四足动物或者任何其它的

Unity3d:megaFierstext(翻书效果插件)

附件中是一款翻书效果插件,由于附件上传大小限制,在下载完后,需要在megaFierstext_BHYF\Assets\Resources\Textures下添加图片精灵并修改属性为Texture,即可运行看效果.好多论坛上需要用币买,也减少了搜索时间,拿来就可以用. 源码Unity3d:megaFierstext(翻书效果插件)

使用CCAnimate、CCAnimation、CCTextureCache、CCTexture2D来实现动画效果

使用CCTexture2D来创建动画效果,前提资源是有一张合成的大图 下面看具体的做法: CCSprite* heroSprite = CCSprite::create(); heroSprite -> setAnchorPoint(ccp(0.35,0.3)); heroSprite -> setPosition(ccp(heroSprite -> getContentSize().width/2, m_winSize.height/2)); this -> addCHild(h

精灵动画Animation对话框组成Idle动画的各精灵

精灵动画Animation对话框组成Idle动画的各精灵 1.3  精灵动画 场景中已经添加了精灵,现在是时候让让它动起来了.读者也许已经从精灵图集中,各精灵的命名中看出来了,这个精灵一共有两种动画状态:Idle(空闲)和Walking(走).本节将讲解使用Unity自带的工具,创建精灵动画,并实现简单动画控制的方法本文选自Unity 2D游戏开发快速入门. 1.3.1  Animation 要将精灵图集中的多个精灵的动作,组合成一个动画,可以使用Unity提供的Animation工具.具体的说