unity3d 纹理动画_3d max 导出纹理 unity 3d - CSDN
  • unity3d shader处理纹理的精灵动画效果
    精灵动画,顾名思义是一种动画效果,我们用到的贴图是类似胶卷一样的,把每一帧都放在一张图上,

    然后通过变换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

    展开全文
  • Unity3D动画贴图、滚动纹理、滚动贴图脚本 using UnityEngine; using System.Collections; //Decompile by Si Borokokok public class ScrollBehaviour : MonoBehaviour { public int materialIndex; public ...

    Unity3D动画贴图、滚动纹理、滚动贴图脚本

    using UnityEngine;
    using System.Collections;
    
    //Decompile by Si Borokokok
    
    public class ScrollBehaviour : MonoBehaviour
    {
        public int materialIndex;
        public string textureName = "_MainTex";
        public Vector2 uvAnimationRate = new Vector2(1f, 0f);
        private Vector2 uvOffset = Vector2.zero;
    
        private void LateUpdate()
        {
            uvOffset += (Vector2) (uvAnimationRate * Time.deltaTime);
            if (renderer.enabled)
            {
                renderer.materials[materialIndex].SetTextureOffset(textureName, uvOffset);
            }
        }
    }
    
    
     
    



    展开全文
  • unity3d 纹理动画

    2019-08-02 08:02:43
    不知道大家有没有玩过赛车游戏 赛车游戏的跑道有路标,如下图 玩过赛车游戏的都知道,大多数赛车游戏的路标是会动的,如上图,它会从右往左运动 不会发动态图,大家脑补一下吧 没有玩过赛车游戏的也不要紧,...

    不知道大家有没有玩过赛车游戏

    赛车游戏的跑道有路标,如下图

    玩过赛车游戏的都知道,大多数赛车游戏的路标是会动的,如上图,它会从右往左运动

    不会发动态图,大家脑补一下吧

    没有玩过赛车游戏的也不要紧,大家见过游戏中的瀑布或者湖面吗?如下图:高山流水

     

    当然,我这个贴图的效果不是很好,不过我这里要说的是原理,不妨碍,我们继续

    图中的瀑布从上往下流动

    我们都知道,如果用粒子的话,有几百个瀑布,在手机上肯定是非常卡的

    差一点的手机说不定游戏刚打开就未响应了

    除非要求是非常逼真的那种水才用粒子系统,能不用尽量不用

    用纹理动画的话虽然达不到粒子那么逼真,但是也是一种不错的解决方案

    纹理动画耗费资源还是粒子动画耗费资源呢?我们一探究竟

    小二,上图

    好勒客官,马上来

     

    这是瀑布的材质球,我们手动修改OffsetX

    按每次+0.1这样修改:0.1,0.2,0.3,0.4....

    我们会发现,每修改一次材质球就会相应的变动

    现在我们归零,修改一下OffsetY,依旧和修改X一样的方法

    我们会发现材质球也会有相应的变动,但是方向不一样

    如果只观察材质球感觉不容易看出来,那就把材质球挂到物体上,这样看的清楚一些

    好了,我们知道如果让材质球动起来了,修改offset即可,那么我们就开始敲代码吧

     

    创建一个 TextureAnimation.cs

    定义一个变量:public float XSpeed = 0.1f;//X轴移动速度

    然后有了下面的代码

    1      public float XSpeed = 0.1f;//X轴移动速度
    2  
    3      void FixedUpdate()
    4      {
    5          renderer.material.mainTextureOffset = new Vector2(Time.time * XSpeed, renderer.material.mainTextureOffset.y);    
    6      }

     我们挂到瀑布上,然后运行,我们发现瀑布动起来了,但是似乎移动方向和速度不对劲

    没关系,我们刚才修改的是X轴,我们在加上Y轴和移动速度不就行了?

    依法炮制得出下面的完整代码:

     1 using UnityEngine;
     2 using System.Collections;
     3 
     4 /// 纹理动画 <summary>
     5 /// 纹理动画
     6 /// </summary>
     7 public class TextureAnimation : MonoBehaviour
     8 {
     9     public bool MoveX = false;//是否移动X
    10     public bool ToUp = false;//往上移动
    11     public float XSpeed = 0.1f;//X轴移动速度
    12     private float offsetX = 0;
    13     
    14     public bool MoveY = false;//是否移动Y
    15     public bool ToLeft = false;//往左移动
    16     public float YSpeed = 0.1f;//Y轴移动速度
    17     private float offsetY = 0;
    18 
    19     
    20     void FixedUpdate()
    21     {
    22         if (MoveX)
    23         {
    24             offsetX = Time.time * XSpeed;
    25             if (ToUp) offsetX *= -1;
    26         }
    27 
    28         if (MoveY)
    29         {
    30             offsetY = Time.time * YSpeed;
    31             if (ToLeft) offsetY *= -1;
    32         }
    33 
    34         renderer.material.mainTextureOffset = new Vector2(offsetX, offsetY);    
    35     }
    36 }

     

    我就不多解释了,房东一会儿过来收房租了

    真烦,我都租了大半年了,想在续租一个月,因为还有一个月我才上班

    原来房租是850一个月,现在居然想收我900一个月

    原因是我只续租一个月

    我教了一千块押金,他怕我跑了不给水电费,非要我在给一千块

    我让他来收电费他也不来,说太冷了。。。。

    什么人啊这是。。。

    不说了,我先闪了

     

    本文链接:http://www.cnblogs.com/shenggege/p/4264463.html

    转载于:https://www.cnblogs.com/shenggege/p/4264463.html

    展开全文
  • unity3d 纹理尺寸优化

    2015-01-31 19:36:40
    如果想减少手游打包的尺寸,第一步要做的是分析找出热点...UI 素材场景纹理动画文件 图片最占用空间,动画文件比重虽然不低,但是压缩比高。图片打包时几乎是无法压缩的。 因此优化尺寸的重点就是在导入图片时设定

    如果想减少手游打包的尺寸,第一步要做的是分析找出热点。
    在console窗口可以右键打开editorlog,里面列举了本次打包编译的所有资源和大小。进行归类和细分,定位哪块内容最占空间。

    一般情况下,有以下3方面消耗了大量空间。

    1. UI 素材
    2. 场景纹理
    3. 动画文件

    图片最占用空间,动画文件比重虽然不低,但是压缩比高。图片打包时几乎是无法压缩的。
    因此优化尺寸的重点就是在导入图片时设定正确的压缩格式。

    switch platform to android

    把build platform默认设置为android,因为unity为你自动转换压缩格式的时候,在android这块处理的并不好,有些方面需要自己去盯着。
    ios因为硬件的一致性,统一使用PVRTC。
    ETC1是android目前支持最广泛的压缩格式,和ios的压缩格式一样都是8:1。

    1024x1024

    纹理最大只用1024x1024。
    更大尺寸的纹理?有些手机支持不了。
    非方形纹理?无法使用最佳格式去压缩,只能采用失真高,压缩率低的格式。

    总之,需要压缩的纹理必须是方形,分辨率限制在1024x1024以下。

    拼接和切割UI素材

    UI素材的小元素很多,将多个素材拼接成一个1024大图有以下好处:

    1. 减少drawcall,提高效率。 移动设备的极限差不多就100 drawcall吧,长时间太高会发烫。
    2. 减少图片数量,容易看到优化效果。
    3. 大图压缩后的失真程度非常小。

    为什么要切割呢,主要是有一些长背景素材,如2000x500,可以切成1024x500,再合并成1024x1024的方图进行压缩。
    如果压缩后太失真,那就不切割,使用原图而不进行压缩,尺寸上也比1024x1024不压缩的小。
    这需要权衡。

    压缩UI素材

    有时候UI素材压缩,会失真,需要尝试看效果是否选择压缩。
    按钮,边框类的素材一般是不压缩的,因为压缩后容易失真。
    但如背景类素材,布景类素材压缩后却和原图非常接近。

    因为UI素材携带alpha通道,unity在转成android压缩格式时会使用rgba16,这是非常糟糕的压缩格式——低压缩比,高失真。
    可手工指定android的压缩格式为ETC1,但是ETC1并不包含alpha数据。为了能够显示半透的元素,需要修改shader,传一张alpha通道的纹理进行混合。
    alpha纹理不需要另外制作,将原图复制一份,设置导入格式为alpha8即可,导入尺寸尽可能缩小到256x256以内。

    压缩场景纹理

    场景纹理总是选择压缩格式,全部都必须是方形的。
    更重要的是,要避免alpha通道。如果包含了alpha通道,压缩格式手工改成ETC1,无需额外的alpha通道纹理。

    展开全文
  • shader处理纹理贴图移动特效产生岩浆、瀑布效果
  • Unity Shader内置的时间变量 名称 类型 描述 _Time float4 t为从加载到现在的时间,4个分量: (t/20, t, t*2, t*3) _SinTime float4 4个分量: (sin(t/8), sin(t/4), sin(t/2), sin(t)) _...
  • 系列目录 【Unity3D基础】让物体动起来①--基于UGUI的鼠标点击移动 【Unity3D基础】让物体动起来②--UGUI鼠标点击逐帧移动 时光煮雨 Unity3D让物体动起来③—UGUI DoTween...时光煮雨 Unity3D实现2D人物动画② Un...
  • Unity3D之简单的帧动画

    2012-11-11 10:54:50
    在这里推荐个Unity3d很多功能效果的脚本集合的网站,也是部门老大发现给我的~ http://wiki.unity3d.com/index.php?title=Scripts/General 本人也是个初级的开发者,这里只是作为一个学习的总结,如果哪里的理解错...
  • unity3D更多资源教程免费下载,群193521697 邀请码:10026.(有问题找管理员)
  • using UnityEngine; using System.Collections;   public class classAnimateTiledTexture :MonoBehaviour {   public int columns = 5;   public int rows = ...void Start()
  • Unity3D游戏开发之动画模型导入 导入动画文件后,在工程(Porject)面板中选中,通过Inspector面板修改参数设置。 在项目视图中选中模型文件。如果想用旧版3.x的动画系统导入和编辑动画,请选择legacy选项。如果你...
  • 今天想和大家交流的是解析obj模型并将其加载到Unity3D场景中,虽然我们知道Unity3D是可以直接导入OBJ模型的,可是有时候我们并不能保证我们目标客户知道如何使用Unity3D的这套制作流程,可能对方最终提供给我们的...
  • 之前看了以前版本的unity3d demo AngryBots ,觉得里面的下雨效果不错,刚好前段时间学习了,写出来跟大家分享下,直接开始。 使用自带动画系统制作下雨效果。 先制作下雨的雨滴涟漪。 步骤1: 在...
  • unity之循环动画

    2017-04-24 21:28:39
    就需要到unity编辑器面板中进行操作:  在Animations选项下,勾选Loop Time ,Loop Pose
  • 资源版本:Unity3D 5.3.1 资源大小: 16.4MB 简要介绍: 可定制的低/中聚士兵。移动友好。完全动画(30动画) Mecanim系统准备 2.500个三角形 (包括5个三角形,所有装备和武器) 5武器的变化 5迷彩纹理的变化 5设备...
  •  桌面 电影纹理是从视频文件创建的动画纹理。通过将视频文件置于工程的“资源”(Assets) 文件夹 中,可以导入视频,以便按照与使用普通纹理完全相同的方法使用它。 视频文件通过 Apple QuickTime 导入。支持...
  • ZAN
  • Unity3d不久之前正式发布了Unity3d 2017.1, 这个版本的发布也宣告了Unity3d正式告别了5.x时代,并且开始已年份直接命名,开启了新的纪元。那么Unity3d 2017相较上一版本到底有哪些改进呢?这介绍这些改进之前先放出...
  • Unity3D学习笔记(2)Unity3D与3DMax结合开发注意事项 单位:比例统一 在建模型前先设置好单位,在同一场景中会用到的模型的单位设置必须一样,模型与模型之间的比例要正确,和程序的导入单位一致,即便到程序...
  • Unity-动画系统

    2018-03-03 17:01:18
    Unity引擎中,大致上可以分为两大类动画控制系统,分别是Animation和Mecanim动画系统.。Aniamtion是低版本中的动画控制系统。而Aniamtor是Unity新的动画系统Mecanim动画系统的核心组件.通过它能够实现对动画的...
1 2 3 4 5 ... 20
收藏数 3,521
精华内容 1,408
关键字:

unity3d 纹理动画