Unity3D 特效设计必须课 (UEGOOD, 赵京宇 著) - void87

时间:2024-02-23 08:25:39

Unity3D 特效设计必须课 (UEGOOD, 赵京宇 著)

第1章 基础知识 (已看)

第2章 Shader(着色器)材质 (已看)

第3章 插件/脚本

第4章 综合实例

 

第1章 基础知识

  1.1 Unity3D引擎知识

    1.1.1 Unity3D简介和安装 

    1.1.2 创建一个新的工程 

    1.1.3 打开一个其他工程 

    1.1.4 Unity3D菜单栏介绍 

    1.1.5 Unity工具栏介绍 

    1.1.6 5大常用视图说明 

    1.1.7 视图操作方法 

    1.1.8 常用的快捷键 

    1.1.9 设定天空盒 

    1.1.10 Unity3D 5.3.0新功能介绍 

  1.2 制作及要求

    1.2.1 创建对象

    1.2.2 导入外部资源(贴图/模型/资源包)

    1.2.3 特效贴图的格式及要求尺寸

Unity3D 默认支持多种图片格式(如 PSD, TIFF, JPG, TGA, PNG 等), 由于Unity3D在对项目进行资源打包发布之前会统一对这些资源进行压缩处理, 而这些格式之中有些压缩格式往往不能保证图像质量, 甚至可能会丢失贴图/报错.所以一般只会用到两种图片格式, 分别为 PNG, TGA

PNG 8位通道(可以在保持图片质量的前提下节省很多内存)?

图片的边长需要是2的n次方, 例如, 64 x 128, 128 x 128, 128 x 256, 256 x 512, 512 x 512等, 虽然在打包发布时Unity会自动将不符合尺寸的图片调整为2的n次方, 但是由于会使用到缩放算法, 图片细节可能会有一定程度的损失

iOS设备支持的贴图最大尺寸为 1024 x 1024, 一般手游的单张特效贴图尺寸最好控制在 512 x 512以内?

    1.2.4 贴图类型之间的切换

Alpha from Grayscale (依据灰度产生 Alpha): 如果启用, 将依照图像的现有明暗来产生Alpha透明度通道

Filter Mode (过滤模式): 

  •   Point (点模式): 纹理在近距离变成块状
  •   Bilinear (双线性): 纹理在近距离变模糊
  •   Trilinear (三线性): 纹理在不同的Mipmaps层次之间变模糊

    1.2.5 在Unity中显示贴图纹理通道

 

     1.2.6 Unity3D支持的外部模型格式

Obj格式仅能支持网格属性

Unity官方推荐使用的格式是 .fbx. fbx格式不但同时支持网格, 材质, 动画, 骨骼, 更比其他格式稳定可靠

    1.2.7 Unity3D与3dsMax之间的单位比例

在3dsMax中制作模型时, 只需要将3dsMax系统单位和导出单位统一设置为"米"就可以在Unity3D中等比显示了

 

 

    1.2.8 3ds Max导出模型/动画到Unity中的注意事项

3dsMax导出窗口导出选项设定

  • 动画: 是否导出关键帧动画
  • 烘焙动画: 开启后会将每一帧都自动记录上关键帧(需要配合"全部重采样"命令使用)
  • 变形: 是否记录骨骼蒙皮
  • 摄像机: 是否导出摄像机
  • 灯光: 是否导出灯光
  • 嵌入的媒体: 开启后会自动关联和模型相关的材质球及贴图, 导入Unity时也会自动将材质球及贴图导入
  • 单位: 单位设置
  • 轴转化: 设定向上轴

    1.2.9 创建一个材质球/同时使用多个材质球 

    1.2.10 Unity中特殊纹理贴图的使用

序列纹理: 纹理按照规律先后排列, 使用时需要按照顺序依次播放

规则纹理(随机调用某个纹理): 纹理按照规律排列, 使用时需要随机调用集合中的某个纹理(不需要按顺序播放)

不规则纹理: 纹理排布及数量不规则, 使用时调用指定纹理 

    1.2.11 将特效保存为Prefab(预设体) 

    1.2.12 Prefab保存注意事项

    1.2.13 运行状态中修改并保存Prefab的办法

    1.2.14 预设体名称颜色的奥秘

    1.2.15 保存/另存当前的场景

    1.2.16 同时打开多个场景文件并保存修改

    1.2.17 特效资源在工程之中的路径分类

 

    1.2.18 贴图与材质球的命名规则

带Alpha透明通道的贴图, 在命名时后缀加上"_a"区分 

    1.2.19 特效预设体命名规则

 

 

 

 

 

Effect_Wangling_Jineng01

Effect_Wangling_Jineng01_Bil

Effect_Wangling_Jineng01_Hit

 

Effect_Buff_Jiaxue

Effect_Scene_Penquan

Effect_UI_kapai 

    1.2.20 导入unitypackage资源包

    1.2.21 导出unitypackage资源包

    1.2.22 Unity3D使用技巧集合

通过去选/勾选对场景预设体重新"实例化"从而达到重播目的 

  1.3 粒子系统 

    1.3.1 粒子系统的定义 

    1.3.2 粒子系统的播放控制  

    1.3.3 粒子系统的数值控制

    1.3.4 粒子系统中的颜色及颜色渐变坡度控制

      1. 粒子系统的颜色设置

HSV模式与RGB模式本质上没有什么区别,只是产生颜色的两种不同方式而已

 

 

      2. 颜色渐变坡度控制 

    1.3.5 粒子系统的组成部分

一个粒子系统由多个模块整合组成

  1. Transform (基本变换组件):  一个粒子系统整体的移动, 旋转, 缩放基本控制项
  2. Particle System (粒子系统初始化模块):  此模块为固有模块, 不可删除或者禁用. 该模块定义了粒子初始化时的持续时间, 循环方式, 发射速度, 大小等基本设置参数
  3. Emission (发射模块):  控制粒子的发射速率(Rate), 可以设置粒子在发射持续时间内的发射率
  4. Shape (形状模块):  定义粒子发射器的形状, 可提供沿形状表面法线或随机方向的初始力, 并控制粒子的发射位置以及方向
  5. Velocity over Lifetime (生命周期速度):  控制粒子在生命周期内每一个粒子的速度, 可以结合动画曲线实现一些复杂的效果
  6. Limit Velocity over Liftime (生命周期限速):  控制粒子在生命周期内的速度限制以及速度衰减, 可以模拟类似拖动的效果, 若粒子的速度超过设定的限定值, 则粒子速度会被锁定到该限定值
  7. Inherit Velocity (速度继承):  粒子继承速度设定项
  8. Force over Lifetime (生命周期作用力模块):  控制粒子在生命周期内的受力情况
  9. Color over Lifetime (生命周期颜色模块):  控制粒子在在生命周期内的颜色变化
  10. Color by Speed (颜色的速度控制模块):  此模块可让每个粒子的颜色根据自身的速度变化而变化
  11. Size over Lifetime (生命周期粒子大小模块):  控制每一颗粒子在其生命周期内的大小变化
  12. Size by Speed (粒子大小的速度控制):  此模块可以让每颗粒子的大小根据自身的速度变化而变化
  13. Rotation over Lifetime (生命周期旋转模块):  控制每颗粒子在生命周期内的旋转速度变化
  14. Rotation by Speed (旋转速度控制模块):  此模块可让每颗粒子的旋转速度根据自身速度的变化而变化
  15. External Forces (外部作用力模块):  是否启用风场引力的影响
  16. Collision (碰撞模块):  可为每颗粒子建立碰撞效果, 需要实时的碰撞检测
  17. Sub Emitters (子发射器模块):  设置粒子在出生, 消亡, 碰撞三个时刻生成一个新的粒子系统
  18. Texture Sheet Animation (纹理动画模块):  可对粒子在其生命周期内的UV坐标产生变化, 生成粒子的UV动画, 可以将纹理划分成网格, 在每一格存放动画的一帧. 同时也可以将纹理划分为几行, 每一行是一个独立的动画, 需要注意的是, 动画所使用的纹理在Renderer模块下的Material(素材)属性中指定
  19. Renderer (粒子渲染器模块):  该模块显示了粒子系统渲染相关的属性
  20. Material (材质组件):  材质组件中显示粒子系统所使用的材质球信息, Unity默认内置了很多不同种类的Shader(着色器)材质, 可以根据项目需求进行选择.

    1.3.6 粒子系统各项参数详细说明

      1.3.6.1 Particle System (粒子系统初始化模块)

Duration (持续时间): 粒子发射器发射粒子的持续时长(单位为秒)

Looping (循环): 粒子循环选项

Prewarm (预热): 开启预热后, 粒子系统将会直接播放一个周期后的状态(不再显示粒子逐渐产生的过程)

  没开启Prewarm

  开启了Prewarm

Start Delay (初始延迟): 发射粒子前, 等待的延迟时间(单位为秒, 例如设置为1, 即表示粒子系统延迟1秒后播放. 如果开启了 Prewarm, 就不能同时开启 Start Delay 选项了). 

Start Lifetime (初始生命时长): 每个粒子的存活时间, 单位为秒

Start Speed (初始速度): 粒子发射时的初始速度

Start Size (初始大小): 粒子发射时的初始大小

3D Start Rotation (3D坐标旋转): 默认为"取消选择状态", 下方参数为Start Rotation (初始旋转角度), 通过该选项来设置粒子发射时的初始旋转角度

Randomize Rotation Direction (Flip Rotation?) (随机旋转方向): 该参数会导致一些粒子反方向旋转(数值设置在0和1之间,数值越大会导致更多的旋转. "0"表示每个粒子旋转反向不变, "1"表示所有粒子反方向旋转, "0.5"表示一半数量的粒子反方向旋转. 该参数针对于 Rotation over Lifetime生效)

Start Color (初始颜色): 粒子发射时的颜色

Gravity Modifier (重力修改器): 粒子在存活期间受到的重力影响

Simulation Space (模拟空间): 模拟Local(局部坐标系)或World(世界坐标系)

Scaling Mode (缩放模式): 通过该选项可以对粒子系统进行精确的缩放控制

  1. Hierarchy (层级模式): 缩放特效根级别, 同时也会影响其子级别所有粒子系统(需要统一缩放模式为Hierarchy)

 

    在Hierarchy(层级模式)下:

      1. 对单个粒子系统进行缩放操作时, "发射器形状和粒子大小"同步缩放, 特效比例保持不变

      2.  当特效中含有多个粒子系统, 将所有粒子系统的Scaling Mode(缩放模式)设置为Hierarchy(层级模式), 缩放特效根级别的同时也会影响其内部级别所有粒子系统, 特效比例同样保持不变

  2. Local (局部坐标缩放): 只对选中的单一粒子系统生效, 不影响其他层级

    在Local(局部坐标)缩放模式下:

      1. 对单个粒子系统进行缩放操作时, "发射器形状和粒子大小"同步缩放, 特效比例保持不变

      2. 当特效中含有多个粒子系统, 缩放其根级别并不会影响到其他层级

  3. Shape (根据发射器形状缩放): 只对粒子系统的Shape(发射器形状)生效

    在Shape(发射器形状)缩放模式下:

      1. 对单个粒子系统进行缩放操作时, 同步缩放其"发射器形状", 但每个粒子大小保持不变

      2.  当特效中含有多个粒子系统, 将所有粒子系统的 Scaling Mode(缩放模式)设置为Shape(根据发射器形状缩放), 缩放特效根级别的同时也会影响其内部级别所有粒子系统的Shape(发射器形状)

Play On Awake (唤醒时播放): 如果启用该选项, 在运行状态下粒子系统在创建时会自动播放)

Max Particles (最大粒子数): 粒子系统发射的最大粒子数量, 可以把它理解为对粒子最大数量的限制, 即使无限增加粒子发生速率, 粒子数量也不会超过所设定的Max Particles (最大粒子数)

      1.3.6.2 Emission (粒子发射器设置)

1. Rate (粒子发生速率)

  1. Time 表示通过单位时间发射(单位是秒)

  2. Distance 表示通过单位距离发射(单位是米)

2. Bursts (爆发) 通过该选项可以控制粒子系统在某个"固定时间点"同时生成大量粒子(时间单位为秒) 

      1.3.6.3 Shape (发射器形状设置)

      1.3.6.4 Velocity over Lifetime (生命周期速度)

      1.3.6.5 Limit Velocity over Lifetime (生命周期限速)

该控制项通常用于模拟阻力, 如果超过某些阈值, 就会抑制或固定速率. 可以按每个轴或每个向量长度来配置

  1. Separate Axis (分离轴): 开启后可以分别设置X, Y, Z三个轴向的数值

  2. Speed (速度): 粒子速度受到限制的阈值, 通常为常数或曲线

例如, 当把Speed (速度)设置为1, Dampen (阻尼值)设置为0.1时, 表示当粒子速度大于1时会受到阻力为0.1的影响, 粒子速度将会逐渐减慢, 最终速度将会变为1

  3. Dampen (阻尼值): 数值设置范围为0~1, 当粒子速度超过设定的Speed (速度) 数值时, 速度将会受到抑制. 阻尼值越大, 速度减慢越快, 也越明显 

      1.3.6.6 Inherit Velocity (继承速度)

Intial (初始值), Current (当前值)

该数值表示粒子继承发射器运动速度的程度. 设置为1时, 指粒子继承发射器的100%速度; 设置为2时, 继承200%速度, 以此类推

可以将粒子系统的 Simulation Space (模拟空间)修改为World(世界坐标), 继承速度模式改为 Inital(初始值)并设置Inital(初始值)数值为1. 然后在Scene(操作视图)中快速移动粒子发射器, 就可以看到粒子受到发射器速度影响的效果了 

      1.3.6.7 Force over Lifetime (在生命周期内受到力场的影响)

      1.3.6.8 Color over Lifetime (生命周期内粒子颜色的变化控制)

控制每个粒子在其存活期间内的动态颜色变化. 如果有些粒子的存活时间短于其他粒子, 它们将变化得更快, 可采用固定色, 两色随机, 渐变过渡色或使用两个渐变选取一个随机颜色 

      1.3.6.9 Color by Speed (粒子颜色根据其速度变化)

Color (颜色): 用于重新映射速度与颜色得关系, 使用渐变改变颜色

Speed Range (速度范围): 界定速度范围得最小值和最大值, 该范围用于将速度重新映射到颜色上 

      1.3.6.10 Size over Lifetime (生命周期内粒子大小的变化控制)

Size (粒子大小): 控制每个粒子在其存活期间得大小. 可以采用固定大小, 使用曲线将大小动画化, 或者使用两条曲线指定随机大小 

      1.3.6.11 Size by Speed (粒子大小根据其速度变化)

Size (粒子大小): 用于重新映射粒子速度与粒子大小的关系, 可以通过曲线, 设置不同速度下粒子的大小

Speed Range (速度范围): 界定速度范围的最小值和最大值, 该范围用于将速度重新映射到大小上 

      1.3.6.12 Rotation over Lifetime (生命周期内粒子旋转的变化控制)

      1.3.6.13 Rotation by Speed (粒子旋转根据其速度变化)

      1.3.6.14 External Forces (外部力场)

      1.3.6.15 Collision (碰撞模块)

粒子的Collision (碰撞模块)支持世界碰撞和平面碰撞. 平面碰撞对简单的碰撞检测而言十分有效. 可以设置任意平面体作为粒子的碰撞对象, 使用平面碰撞足够应对大部分效果要求

而世界碰撞采用光线投射原理. 相比平面碰撞,世界碰撞的性能损耗更大. 所以必须谨慎使用,以确保良好的性能. 在碰撞结果近似相同的情况下, 建议将Collision Quality (碰撞质量)设置为Low(低)或Medium(中)

Planes/World (平面/世界): 切换碰撞类型

Planes(平面)指平面碰撞, World(世界)指世界碰撞

  以下为平面碰撞模式下的参数设置

Planes (平面): 设置碰撞平面

Visualization (可视化): 用于将碰撞平面可视化, 显示为Grid(网格)或Solid(实体), 帮助确认碰撞平面的位置与方向

Scale Plane (缩放平面): 调整可视化平面大小

Dampen (阻尼): 数值设置范围为0~1, 可以理解为粒子与平面碰撞时摩擦力的大小. 阻尼值越大, 粒子碰撞后速度越慢. 当设置Dampen(阻尼)为1时, 粒子与平面碰撞后速度为零

Bounce (弹力): 粒子与平面碰撞时的反弹属性. 设置为1时, 粒子碰撞后速度不损耗. 设置Bounce(弹力)小于1时粒子在碰撞后速度将会按比例衰减. 设置Bounce(弹力)大于1时, 粒子碰撞后速度将会成倍数增加

Lifetime Loss (生命衰减): 数值设置范围0~1, 表示粒子每次碰撞后Start Lifetime(粒子初始寿命)的衰减比例. 当把Lifetime Loss(生命衰减)设置为1时, 粒子在碰撞后会直接死亡

Min Kill Speed (最小杀死速度): 当粒子发生碰撞后, 所有速度低于设定数值的粒子都会被杀死

Radius Scale (半径缩放): 设置每个粒子的碰撞半径

Send Collision Messages (发送碰撞信息): 由是否要发送碰撞信息而确定是否触发游戏对象(GameObjects)和ParticleSystems(粒子系统)上的OnParticleCollision(粒子系统碰撞)回调

碰撞类型为平面模式时, 粒子将会与平面的法线正方向进行碰撞(默认状态下粒子只能与模型体的法线正方向发生碰撞)

  以下为世界碰撞模式下的参数设置

Collision Mode (碰撞模式): 可以选择2D或者3D碰撞

Visualize Bounds (可视化边界): 勾选后可以显示每个粒子碰撞体的外壳半径形状

Dampen (阻尼): 数值设置范围为0~1, 可以理解为粒子与平面碰撞时摩擦力的大小. 阻尼值越大, 粒子碰撞后速度越慢. 当设置 Dampen (阻尼)为1时, 粒子与平面碰撞后速度为零

Bounce (弹力): 粒子与平面碰撞时的反弹属性. 设置为1时, 粒子碰撞后速度不损耗. 设置Bounce(弹力)小于1时粒子在碰撞后速度将会按比例衰减. 设置Bounce(弹力)大于1时, 粒子碰撞后速度将会成倍数增加

Lifetime Loss (生命衰减): 数值设置范围为0~1,表示粒子每次碰撞后Start Lifetime(粒子初始寿命)的衰减比例. 当把Lifetime Loss(生命衰减)设置为1时, 粒子在碰撞后会直接死亡

Min Kill Speed (最小杀死速度): 当粒子发生碰撞后, 所有速度低于设定数值的粒子都会被杀死

Collides With (碰撞对象): 用于指定碰撞器的筛选器. 默认Everything(所有物体)指粒子系统与所有对象发生碰撞

Enable Dynamic Colliders (动态碰撞): 启用动态碰撞

Interior Collisions (内部碰撞): 启用内部碰撞

Max Collision Shapes (最大碰撞外形): 设置最大碰撞外形

Collision Quality (碰撞质量): 世界碰撞模式下的碰撞质量选择. 质量越高, 精确度越高, 性能损耗也越大

  High (高质量): 所有粒子在每一帧都进行Particle Raycast Budget(粒子投射)计算. 注意: 这是CPU密集型应用, 只能使用1000个场景宽度或更少的同步粒子

  Medium (中等质量): 在每帧中, 接收一部分粒子进行全局Particle Raycast Budget(粒子投射)计算. 粒子以循环方式更新, 其中在给定帧中不接收光线投射的粒子将查找和使用高速缓存中存储的较旧碰撞物. 注意: 这类碰撞属于近似碰撞, 会遗漏一些粒子, 特别是在角落处

  Low (低质量): 粒子系统每四帧进行一次Particle Raycast Budget (粒子投射)计算, 其他属性与中等质量(Medium)相同

Send Collision Messages (发送碰撞信息): 由是否要发送碰撞信息而确定是否触发游戏对象(GameObjects)和ParticleSystems(粒子系统)上的OnParticleCollision(粒子系碰撞)回调 

      1.3.6.16 Sub Emitters (子发射器模块)

在这个模块中, 可以定义粒子Birth(出生)/Collision(碰撞)/Death(死亡)时产生一个新的粒子系统

Birth (产生): 每个粒子产生时生成另一个粒子系统

Collision (碰撞): 每个粒子碰撞时生成另一个粒子系统

Death (死亡): 每个粒子消亡时生成另一个粒子系统

      1.3.6.17 Texture Sheet Animation (纹理动画模块)

Texture Sheet Animation (纹理动画模块) 原理是在粒子生命周期内通过动画化UV坐标从而实现动画序列效果. 可以指定具体的动画切片数或者某一单独行数, 也可以用曲线动画化或者是两条曲线之间的随即帧

Tiles (平铺分布): 定义纹理X, Y方向的平铺数量

Animation (动画): 指定动画类型为Whole Sheet (整层)或Single Row (单行)

  Whole Sheet (整层): 将所有平铺图片用于动画

  Single Row (单行): 将一行纹理层用于UV动画

  Random Row (随机行): 如果选中此项, 起始行随机,如果取消选中, 则可以指定行指数(第一行为0)

Frame over Time (时间帧): 每个粒子存活期间, 粒子寿命与序列帧的关系. 使用常量, 动画曲线或者使用两条曲线指定随即帧

Cycles (循环次数): 每个粒子在生命周期内循环播放序列帧的次数.(默认为1, 指在生命周期内循环播放一次) 

      1.3.6.18 Renderer (粒子渲染模块)

粒子渲染模块会直接影响每个粒子的渲染形态, 但不会影响粒子的运动

Render Mode (粒子渲染模式): 

  Billboard (布告板类型): 使粒子始终朝向摄像机, 与Maya中的Sprite(精灵粒子)相同

  Stretched Billboard (拉伸布告板): 可以通过 Camera Scale (摄像机缩放), Speed Scale (速度缩放), Length Scale (长度缩放) 三个选项来修改布告板的拉伸形状

    Camera Scale (摄像机缩放): 摄像机速度影响粒子的拉伸程度, 摄像机移动速度越快, 粒子拉伸程度越大

    Speed Scale (速度缩放): 通过粒子速度来影响粒子长度

    Length Scale (长度缩放): 直接对粒子长度进行缩放设置

    Horizontal Billboard (水平布告板): 让粒子与水平面对齐

    Vertical Billboard (垂直布告板): 让粒子朝向摄像机的同时, 保持粒子与Y轴对齐

    Mesh (网格体): 可以自定义一个网格体模型, 由粒子系统发射, 粒子系统发射的模型同样会受到粒子系统的相关参数影响(例如透明控制, 大小的曲线控制等)

Normal Direction (法线方向): 设定值为0~1, 确定法线与摄像机所成角度即偏离视图中心的角度

Material (材质球):  当前粒子所用的材质球

Sort Mode (排序模式): 通过距离, 最先产生或最晚产生来决定粒子的绘制层级. 可以理解为根据距离决定哪些粒子显示在上层, 或根据出生时间决定哪些粒子显示在上层

Sorting Fudge (排序矫正): 使用该项影响绘制顺序, 较小数值最先显示在上层(如果两个粒子系统在同一位置, 较小数值的粒子会显示在上层. 例如, 地面与裂痕都在同一位置, 地面的Sorting Fudge为100, 裂痕的Sorting Fudge为0, 则裂痕会显示在地面上方

Cast Shadows (投射阴影): 粒子是否投射阴影

Receive Shadows (接受阴影): 粒子是否接受阴影

Min Particle Size (最小粒子大小): 每个粒子相对于视窗大小的最小值

Max Particle Size (最大粒子大小): 每个粒子相对于视窗大小的最大值(一般建议设置为1~2)

Sorting Layer (排序层级选择): 一般粒子是在Default (默认)层, 也可以单击 Add Sorting Layer (添加新的排序层级)添加一个新的排序层级

Order in Layer (顺序层级): 设置顺序层级

Billboard Alignment (布告板对齐方式): 可以设置为View(视图对齐), World (世界坐标对齐), Local (局部坐标对齐)

Pivot (轴): 可以分别修改粒子在 X, Y, Z三个中心轴向的偏移数值

Reflection Probes (反射探测模式): 

Resimulate (实时渲染): 

Wireframe (开启粒子网格显示): 

    1.3.7 多个粒子系统的播放控制及播放速度调节

将其他粒子系统拖拽到一个粒子系统的下层(作为父子关系), 然后选择特效父级别, 单击播放查看 

    1.3.8 为粒子系统添加一个力场影响

 

    1.3.9 粒子系统材质的选择

只有Particles (粒子)下的材质才能支持 Start Color (粒子颜色), Color over Lifetime (生命周期颜色), Color by Speed (粒子速度颜色) 等粒子系统内置参数控制 

    1.3.10 粒子系统控制技巧

      1.3.10.1 设置粒子系统间的显示层级

Sorting Fudge 

      1.3.10.2 粒子向上逐渐拉伸变细消失

      1.3.10.3 粒子的扰乱飘动效果

      1.3.10.4 设定粒子漩涡运动

      1.3.10.5 让粒子上升悬浮一会儿再掉落

      1.3.10.6 粒子初始运动方向被扰乱产生随机效果

 

      1.3.10.7 粒子运动时速度逐渐减慢

 

      1.3.10.8 通过粒子系统实现落叶3D旋转效果

 

      1.3.10.9 粒子发射模型的妙用

 

      1.3.10.10 批量修改粒子系统参数

 

      1.3.10.11 粒子系统的发射间隔控制

 

      1.3.10.12 增加粒子系统 SubEmitters(子发射器)数量

 

    1.3.11 粒子系统的相关注意事项

  1.4 动画系统 

    1.4.1 Unity新/旧版动画系统的区别

    1.4.2 给物体添加一个新版/旧版动画组件

    1.4.3 基本动画制作

Samples (采样率): 指动画播放速率, 对应动画系统每秒播放多少帧(数值设置越大, 动画播放越快)

Add Property (添加属性): 在属性列表中添加一个属性设置动画关键帧

Dopesheet (关键点模式): 以关键点的形式表现动画

Curves (曲线): 动画曲线编辑器模式(跟3ds Max中的动画曲线编辑器原理相同) 

    1.4.4 转换新旧版动画

    1.4.5 设置动画为播一次/设置动画为循环播放

    1.4.6 动画为不可编辑状态时的处理方法

造成Read Only(只读)无法编辑的主要原因是动画文件在fbx模型内部, 不能够被Unity拆解重新编辑. 所以需要在Unity中复制出一个新的动画文件, 然后在fbx文件外部重新指定给模型体就可以了 

    1.4.7 为摄像机制作推拉动画/震屏动画

    1.4.8 Unity中飘带/拖尾效果的实现方法

    1.4.9 Unity材质球动画

Particles/Additive

Tint Color (色调): 设置材质偏色如偏红, 偏蓝等, 白色为纹理本身颜色

Tiling (排布数量): 表示UV坐标内图像的排布倍数

Offset (偏移值): 指的是UV的偏移值

Soft Particles Factor (过度控制): 表示粒子与实体模型间的过渡控制, 数值范围是0.01~3, 用于粒子面片和实体交接处柔化, 避免出现面片穿插的交接线 

    1.4.10 使用材质动画实现序列播放功能 

    1.4.11 使用动画系统实现延迟播放效果 

    1.4.12 设置角色一次播放不同的动画

Untiy中采用的是"动作融合技术"作为动画间的过渡. 如果角色动作之间本身就是无缝播放, 恶不需要设定动作的过渡时间 

    1.4.13 设定动画未运行前的静止帧

    1.4.14 使用同一动画文件控制多个对象

Animation(动画编辑窗口)中锁定功能的使用, 默认模式下若制作动画则必须再次创建动画文件, 而在锁定状态下则可使用同一动画文件控制多个对象 

    1.4.15 3ds Max简介

 

    1.4.16 Unity3D项目中3ds Max的运用

 

    1.4.17 3ds Max基本操作和快捷键

 

    1.4.18 3ds Max材质球动画

 

    1.4.19 将3ds Max动画导入到Unity中

 

    1.4.20 3ds Max骨骼动画的导出及导入Unity

 

    1.4.21 3ds Max骨骼动画的缩放处理

 

    1.4.22 制作路径动画

 

    1.4.23 制作路径变形动画

 

    1.4.24 3ds Max路径动画/路径变形动画导出注意项

 

    1.4.25 模型顶点透明的奥秘

 

    1.4.26 制作飘动动画

 

    1.4.27 UV动画技巧

 

    1.4.28 结合模型UV制作贴图

 

  1.5 Unity3D刚体与布料系统

 

    1.5.1 刚体的概念

 

    1.5.2 在Unity3D中创建刚体

 

    1.5.3 Physic Material (物理材质)

 

    1.5.4 简单的刚体案例

 

    1.5.5 布料系统的概念

 

    1.5.6 在Unity3D中创建布料

 

    1.5.7 简单的布料系统案例

 

  1.6 绑定点的相关概念

 

    1.6.1 绑定点的定义/存在的意义

 

    1.6.2 游戏中四种不同的释放特效方法

 

    1.6.3 绑定点特效命名技巧

 

  1.7 刀光的制作方法

 

    1.7.1 使用粒子系统制作刀光

 

    1.7.2 使用动画系统制作刀光

 

    1.7.3 通过插件来制作刀光拖尾效果

 

    1.7.4 刀光Mesh(网格体)与刀光贴图的两种常见情况

 

    1.7.5 刀光在技能表现中的五点要素

 

  1.8 Unity特效颜色的选择与搭配

 

    1.8.1 配色基本知识

 

    1.8.2 特效中光感的表现

 

    1.8.3 不同风格之间颜色的选择倾向

 

    1.8.4 特效搭配参考

 

  1.9 资源优化

在移动平台上,内存相对较小, 如果不注意控制特效的性能损耗, 则可能造成内存过载/手机过热等问题. 导致程序无法启动甚至崩溃. 所以,在注重画面效果的同时, 还要注意如何优化美术资源, 在相对节约的情况下表现出最好的效果  

    1.9.1 控制粒子数量

一般在手游项目中, 单个特效的粒子数量不超过100个, 复杂的特效也争取控制在150~200个. 单个粒子系统的最大粒子数不要设置为默认的1000, 需要多少设置多少, 一般为0~30 

    1.9.2 去除阴影选项

关闭 CastShadows (投射阴影), Receive Shadows (接收阴影) 

    1.9.3 避免使用灯光系统

制作特效时, 尽量不要使用灯光系统. 虽然使用灯光可以产生很棒的实时光照效果, 但是对性能的损耗也很大

游戏中的很多光线照射效果都是由粒子系统模拟的

除了光线外, 游戏中的光晕/光斑等效果都可以由粒子系统制作表现

    1.9.4 尽量避免使用粒子碰撞/尽量不使用物理系统 

虽然在制作时播放查看可能不会有明显的卡顿感, 但是我们知道在游戏场景中同时存在场景模型, 动画, UI界面, 角色等多个资源, 它们已经占用了大部分性能, 这时如果播放特效, 就很容易造成游戏卡顿或者游戏帧数下降等问题

    1.9.5 尽量减少使用Sub Emitters(子发射器)

    1.9.6 优化层级数量

特效层级一般控制在8~10层以内, 特殊效果可以适当增加

    1.9.7 子层级数量控制

如非必要, 不要有过多向下层级

    1.9.8 优化模型面数

新建模型时, 面数需要控制在300面以下, 特殊情况除外 

    1.9.9 关闭模型阴影 

    1.9.10 修改动画帧数

创建动画文件时, 需把默认60帧改为30帧 

    1.9.11 优化动画组件 

    1.9.12 检查坐标位置

    1.9.13 贴图尺寸及应用

1. 修改贴图尺寸

一般贴图的像素尺寸在128 x 128到256 x 256之间, 最大可以是512 x 512, 有特殊需求时也可以适当增加

2. 尽量一图多用

3. 减少重复贴图 

    1.9.14 将不需要移动的物体标记为Static

    1.9.15 尽量避免使用高能耗材质

在特效制作中, 有时为了完成更丰富, 更绚丽的效果, 可能会添加一些高级Shader(着色器), 例如扭曲, 溶解, 这些Shader(着色器)往往需要用到显卡的部分功能, 会造成较大的性能损耗. 为了避免这种情况, 除了需要程序的优化外, 在制作特效时也需要注意尽量避免使用这些高能耗Shader(着色器)

那么高能耗Shader(着色器)有哪些特点呢? 以下是高耗能材质的部分功能特点: 反射/折射, 动态纹理解算, 发光/辉光, 摄像机渲染

例如, 扭曲材质包含折射效果, 溶解材质包含动态纹理解算效果, 发光材质包含摄像机渲染效果. 以上这三种材质都属于典型的高能耗材质Shader 

    1.9.16 将贴图类型修改为Advanced

    1.9.17 尽量使用8位通道图片代替16位通道图片

第2章 Shader(着色器)材质

  2.1 认识Shader(着色器) 

    2.1.1 什么是Shader(着色器)

    2.1.2 在Unity中创建Shader(着色器)文件

    2.1.3 Shader(着色器)文件的导入方法和使用说明

    2.1.4 新版着色器系统

 

    2.1.5 常用Shader(着色器)说明

 

    2.1.6 用于移动设备的材质Shader(着色器)说明

 

  2.2 运用Shader(着色器)来实现一些特殊效果 

    2.2.1 Additive(叠加材质)的显示级别控制

 

// Upgrade NOTE: replaced \'mul(UNITY_MATRIX_MVP,*)\' with \'UnityObjectToClipPos(*)\'

//Edit BY jingyu.Zhao    
Shader "Jingyu/Additive Lv1" {
Properties {
    _TintColor ("Tint Color", Color) = (0.5,0.5,0.5,0.5)
    _MainTex ("Particle Texture (A = Transparency)", 2D) = "white" {}
    _InvFade ("Soft Particles Factor", Range(0.01,3.0)) = 1.0
}

Category {
    Tags { "Queue"="Transparent+300" "IgnoreProjector"="True" "RenderType"="Transparent" }
    Blend SrcAlpha One
    AlphaTest Greater .01
    ColorMask RGB
    Cull Off Lighting Off ZWrite Off Fog { Color (0,0,0,0) }
    BindChannels {
        Bind "Color", color
        Bind "Vertex", vertex
        Bind "TexCoord", texcoord
    }
    
    // ---- Fragment program cards
    SubShader {
        Pass {
        
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma fragmentoption ARB_precision_hint_fastest
            #pragma multi_compile_particles

            #include "UnityCG.cginc"

            sampler2D _MainTex;
            fixed4 _TintColor;
            
            struct appdata_t {
                float4 vertex : POSITION;
                fixed4 color : COLOR;
                float2 texcoord : TEXCOORD0;
            };

            struct v2f {
                float4 vertex : POSITION;
                fixed4 color : COLOR;
                float2 texcoord : TEXCOORD0;
                #ifdef SOFTPARTICLES_ON
                float4 projPos : TEXCOORD1;
                #endif
            };
            
            float4 _MainTex_ST;

            v2f vert (appdata_t v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                #ifdef SOFTPARTICLES_ON
                o.projPos = ComputeScreenPos (o.vertex);
                COMPUTE_EYEDEPTH(o.projPos.z);
                #endif
                o.color = v.color;
                o.texcoord = TRANSFORM_TEX(v.texcoord,_MainTex);
                return o;
            }

            sampler2D _CameraDepthTexture;
            float _InvFade;
            
            fixed4 frag (v2f i) : COLOR
            {
                #ifdef SOFTPARTICLES_ON
                float sceneZ = LinearEyeDepth (UNITY_SAMPLE_DEPTH(tex2Dproj(_CameraDepthTexture, UNITY_PROJ_COORD(i.projPos))));
                float partZ = i.projPos.z;
                float fade = saturate (_InvFade * (sceneZ-partZ));
                i.color.a *= fade;
                #endif
                
                return 2.0f * i.color * _TintColor * tex2D(_MainTex, i.texcoord);
            }
            ENDCG 
        }
    }     
    
    // ---- Dual texture cards
    SubShader {
        Pass {
            SetTexture [_MainTex] {
                constantColor [_TintColor]
                combine constant * primary
            }
            SetTexture [_MainTex] {
                combine texture * previous DOUBLE
            }
        }
    }
    
    // ---- Single texture cards (does not do color tint)
    SubShader {
        Pass {
            SetTexture [_MainTex] {
                combine texture * primary
            }
        }
    }
}
}
Additive Lv1
// Upgrade NOTE: replaced \'mul(UNITY_MATRIX_MVP,*)\' with \'UnityObjectToClipPos(*)\'

//Edit BY jingyu.Zhao
Shader "Jingyu/Additive Lv2" {
Properties {
    _TintColor ("Tint Color", Color) = (0.5,0.5,0.5,0.5)
    _MainTex ("Particle Texture (A = Transparency)", 2D) = "white" {}
    _InvFade ("Soft Particles Factor", Range(0.01,3.0)) = 1.0
}

Category {
    Tags { "Queue"="Transparent+400" "IgnoreProjector"="True" "RenderType"="Transparent" }
    Blend SrcAlpha One
    AlphaTest Greater .01
    ColorMask RGB
    Cull Off Lighting Off ZWrite Off Fog { Color (0,0,0,0) }
    BindChannels {
        Bind "Color", color
        Bind "Vertex", vertex
        Bind "TexCoord", texcoord
    }
    
    // ---- Fragment program cards
    SubShader {
        Pass {
        
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma fragmentoption ARB_precision_hint_fastest
            #pragma multi_compile_particles

            #include "UnityCG.cginc"

            sampler2D _MainTex;
            fixed4 _TintColor;
            
            struct appdata_t {
                float4 vertex : POSITION;
                fixed4 color : COLOR;
                float2 texcoord : TEXCOORD0;
            };

            struct v2f {
                float4 vertex : POSITION;
                fixed4 color : COLOR;
                float2 texcoord : TEXCOORD0;
                #ifdef SOFTPARTICLES_ON
                float4 projPos : TEXCOORD1;
                #endif
            };
            
            float4 _MainTex_ST;

            v2f vert (appdata_t v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                #ifdef SOFTPARTICLES_ON
                o.projPos = ComputeScreenPos (o.vertex);
                COMPUTE_EYEDEPTH(o.projPos.z);
                #endif
                o.color = v.color;
                o.texcoord = TRANSFORM_TEX(v.texcoord,_MainTex);
                return o;
            }

            sampler2D _CameraDepthTexture;
            float _InvFade;
            
            fixed4 frag (v2f i) : COLOR
            {
                #ifdef SOFTPARTICLES_ON
                float sceneZ = LinearEyeDepth (UNITY_SAMPLE_DEPTH(tex2Dproj(_CameraDepthTexture, UNITY_PROJ_COORD(i.projPos))));
                float partZ = i.projPos.z;
                float fade = saturate (_InvFade * (sceneZ-partZ));
                i.color.a *= fade;
                #endif
                
                return 2.0f * i.color * _TintColor * tex2D(_MainTex, i.texcoord);
            }
            ENDCG 
        }
    }     
    
    // ---- Dual texture cards
    SubShader {
        Pass {
            SetTexture [_MainTex] {
                constantColor [_TintColor]
                combine constant * primary
            }
            SetTexture [_MainTex] {
                combine texture * previous DOUBLE
            }
        }
    }
    
    // ---- Single texture cards (does not do color tint)
    SubShader {
        Pass {
            SetTexture [_MainTex] {
                combine texture * primary
            }
        }
    }
}
}
Additive Lv2
// Upgrade NOTE: replaced \'mul(UNITY_MATRIX_MVP,*)\' with \'UnityObjectToClipPos(*)\'

//Edit BY jingyu.Zhao
Shader "Jingyu/Additive Lv3" {
Properties {
    _TintColor ("Tint Color", Color) = (0.5,0.5,0.5,0.5)
    _MainTex ("Particle Texture (A = Transparency)", 2D) = "white" {}
    _InvFade ("Soft Particles Factor", Range(0.01,3.0)) = 1.0
}

Category {
    Tags { "Queue"="Transparent+500" "IgnoreProjector"="True" "RenderType"="Transparent" }
    Blend SrcAlpha One
    AlphaTest Greater .01
    ColorMask RGB
    Cull Off Lighting Off ZWrite Off Fog { Color (0,0,0,0) }
    BindChannels {
        Bind "Color", color
        Bind "Vertex", vertex
        Bind "TexCoord", texcoord
    }
    
    // ---- Fragment program cards
    SubShader {
        Pass {
        
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma fragmentoption ARB_precision_hint_fastest
            #pragma multi_compile_particles

            #include "UnityCG.cginc"

            sampler2D _MainTex;
            fixed4 _TintColor;
            
            struct appdata_t {
                float4 vertex : POSITION;
                fixed4 color : COLOR;
                float2 texcoord : TEXCOORD0;
            };

            struct v2f {
                float4 vertex : POSITION;
                fixed4 color : COLOR;
                float2 texcoord : TEXCOORD0;
                #ifdef SOFTPARTICLES_ON
                float4 projPos : TEXCOORD1;
                #endif
            };
            
            float4 _MainTex_ST;

            v2f vert (appdata_t v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                #ifdef SOFTPARTICLES_ON
                o.projPos = ComputeScreenPos (o.vertex);
                COMPUTE_EYEDEPTH(o.projPos.z);
                #endif
                o.color = v.color;
                o.texcoord = TRANSFORM_TEX(v.texcoord,_MainTex);
                return o;
            }

            sampler2D _CameraDepthTexture;
            float _InvFade;
            
            fixed4 frag (v2f i) : COLOR
            {
                #ifdef SOFTPARTICLES_ON
                float sceneZ = LinearEyeDepth (UNITY_SAMPLE_DEPTH(tex2Dproj(_CameraDepthTexture, UNITY_PROJ_COORD(i.projPos))));
                float partZ = i.projPos.z;
                float fade = saturate (_InvFade * (sceneZ-partZ));
                i.color.a *= fade;
                #endif
                
                return 2.0f * i.color * _TintColor * tex2D(_MainTex, i.texcoord);
            }
            ENDCG 
        }
    }     
    
    // ---- Dual texture cards
    SubShader {
        Pass {
            SetTexture [_MainTex] {
                constantColor [_TintColor]
                combine constant * primary
            }
            SetTexture [_MainTex] {
                combine texture * previous DOUBLE
            }
        }
    }
    
    // ---- Single texture cards (does not do color tint)
    SubShader {
        Pass {
            SetTexture [_MainTex] {
                combine texture * primary
            }
        }
    }
}
}
Additive Lv3 

    2.2.2 Additive_mask (遮罩叠加)材质

//Edit BY jingyu.Zhao
Shader "Jingyu/Additive_mask" 
{
    Properties
    {
        _TintColor ("Tint Color", Color) = (0.5,0.5,0.5,0.5)
        _MainTex ("Base (RGB)", 2D) = "white" {}
        _AlphaTex ("Alpha (RGB)", 2D) = "white" {}
    }

    SubShader 
    {
        Tags { "Queue"="Transparent" "RenderType"="Transparent" }
        
        Blend SrcAlpha One
        AlphaTest Greater .01
        ColorMask RGB        
        Cull Off 
        Lighting Off 
        ZWrite Off
        Fog { Color (0,0,0,0) }
        
        BindChannels 
        {
            Bind "Vertex", vertex                
            Bind "TexCoord", texcoord
            Bind "Color", color
        }
    
        Pass 
        {                    
            SetTexture [_MainTex] 
            {
                constantColor [_TintColor]
                combine constant * primary DOUBLE              
            }    
            
            SetTexture [_MainTex] 
            {
                combine texture * previous
            }     

            SetTexture [_AlphaTex] 
            {
                constantColor [_TintColor]
                combine texture * previous, constant * texture
            }   
        }
    }
} 
Additive_mask

    2.2.3 Additive_mask_animation (动态遮罩叠加)材质

该Shader需要在运行状态下能够查看到最终的UV滚动效果

// Upgrade NOTE: replaced \'mul(UNITY_MATRIX_MVP,*)\' with \'UnityObjectToClipPos(*)\'

//Edit BY jingyu.Zhao
Shader "Jingyu/Additive_mask_animation" {
Properties {
 _TintColor ("Tint Color", Color) = (0.5,0.5,0.5,0.5)
 _MainTex ("Main Texture", 2D) = "white" {}
 _MaskTex ("Mask (R)", 2D) = "white" {}
 _ScrollTimeX  ("Scroll Speed X", Float) = 0
 _ScrollTimeY  ("Scroll Speed Y", Float) = 0
}

Category {
 Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
 Blend SrcAlpha One
 Cull Off Lighting Off ZWrite Off
 BindChannels {
     Bind "Color", color
     Bind "Vertex", vertex
     Bind "TexCoord", texcoord
 }
 
 // ---- Fragment program cards
 SubShader {
     Pass {
     
         CGPROGRAM
         #pragma vertex vert
         #pragma fragment frag
         #pragma fragmentoption ARB_precision_hint_fastest
         #pragma multi_compile_particles
         
         #include "UnityCG.cginc"

         sampler2D _MainTex;
         sampler2D _MaskTex;
         half _ScrollTimeX;
         half _ScrollTimeY;
         fixed4 _TintColor;
         
         struct appdata_t {
             float4 vertex : POSITION;
             fixed4 color : COLOR;
             float2 texcoord : TEXCOORD0;
         };

         struct v2f {
             float4 vertex : POSITION;
             fixed4 color : COLOR;
             float2 texcoord : TEXCOORD0;
         };
         
         v2f vert (appdata_t v)
         {
             v2f o;
             o.vertex = UnityObjectToClipPos(v.vertex);
             o.color = v.color;
             o.texcoord = v.texcoord;
             return o;
         }
         fixed4 frag (v2f i) : COLOR
         {
             half2 uvoft = i.texcoord;
             uvoft.x += _Time.y*_ScrollTimeX;
             uvoft.y += _Time.y*_ScrollTimeY;
             fixed4 offsetColor = tex2D(_MaskTex, uvoft);
             fixed grayscale = offsetColor.r;
             fixed4 mainColor = tex2D(_MainTex, i.texcoord);
             return 2.0f * i.color * _TintColor * mainColor * grayscale;
         }
         ENDCG
     }
 }   
}
}
Additive_mask_animation

    2.2.4 Additive_mask_niuqu (遮罩纹理扭曲)材质

// Upgrade NOTE: replaced \'mul(UNITY_MATRIX_MVP,*)\' with \'UnityObjectToClipPos(*)\'

//Edit BY jingyu.Zhao    
Shader "Jingyu/Additive_mask_niuqu" {
Properties {
 _TintColor ("Tint Color", Color) = (0.5,0.5,0.5,0.5)
 _MainTex ("Main Texture", 2D) = "white" {}
 _DispMap ("Displacement Map (RG)", 2D) = "white" {}
 _FlowMap ("FlowMap (RG)", 2D) = ""{}
 _Mask ("Mask (R)", 2D) = "white" {}

 _DispScrollSpeedX  ("Displacement Map Scroll Speed X", Float) = 0
 _DispScrollSpeedY  ("Displacement Map Scroll Speed Y", Float) = 0
 _DispX  ("Displacement Strength X", Float) = 0
 _DispY  ("Displacement Strength Y", Float) = 0.2
}

Category {
 Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
 Blend SrcAlpha One
 Cull Off Lighting Off ZWrite Off
 BindChannels {
     Bind "Color", color
     Bind "Vertex", vertex
     Bind "TexCoord", texcoord
 }
 
 // ---- Fragment program cards
 SubShader {
     Pass {
     
         CGPROGRAM
         #pragma vertex vert
         #pragma fragment frag
         #pragma fragmentoption ARB_precision_hint_fastest
         #pragma multi_compile_particles
         
         #include "UnityCG.cginc"

         uniform sampler2D _MainTex;
         uniform sampler2D _DispMap;
         uniform sampler2D _FlowMap;
         uniform sampler2D _Mask;

         
         uniform half _DispScrollSpeedX;
         uniform half _DispScrollSpeedY;
         uniform half _DispX;
         uniform half _DispY;


         uniform fixed4 _TintColor;
         
         struct appdata_t {
             float4 vertex : POSITION;
             fixed4 color : COLOR;
             float2 texcoord : TEXCOORD0;
             float2 param : TEXCOORD1;
         };

         struct v2f {
             float4 vertex : POSITION;
             fixed4 color : COLOR;
             float2 texcoord : TEXCOORD0;
             float2 param : TEXCOORD1;
         }; 
         

         //PARAM X: offset x
         //PARAM Y: offset y

         //param.y - param.x = stretch length

         v2f vert (appdata_t v)
         {
             v2f o;
             o.vertex = UnityObjectToClipPos(v.vertex);
             o.color = v.color;
             o.texcoord = v.texcoord;
             o.param = v.param;
             return o;
         }
         fixed4 frag (v2f i) : COLOR
         {

             //get displacement offset
             half2 mapoft = half2(_Time.y*_DispScrollSpeedX, _Time.y*_DispScrollSpeedY);
             half4 dispColor = tex2D(_DispMap, i.texcoord + mapoft);
             half noise1 =  dispColor.r * _DispX;
             half noise2 =  dispColor.g * _DispY;


             //get flow
             half4 flowMap = tex2D (_FlowMap, i.texcoord);
             flowMap.r = flowMap.r * 2.0f - 1.011765;
             flowMap.g = flowMap.g * 2.0f - 1.003922;


             half s = i.param.x;


             half s1 = fmod(s, 2.0f * i.param.y);
             half s2 = fmod(i.param.y + s, 2.0f * i.param.y);

             half4 t1 = tex2D (_MainTex, i.texcoord + flowMap.rg * s1  + noise1);              
             half4 t2 = tex2D (_MainTex, i.texcoord + flowMap.rg * s2  + noise2);
             
             fixed t = abs (i.param.y - s1) / (i.param.y);
            

             half4 final = lerp( t1, t2, t);

             //get mask
             fixed mask = tex2D(_Mask, i.texcoord).r;

             //final
             return 2.0f * i.color * _TintColor * final * mask;
         }
         ENDCG
     }
 }   
}
}
Additive_mask_niuqu

Tint Color (色调): 用来设置色调(可以在这一栏修改材质的作色信息)

Main Texture (主要颜色信息贴图): 用来设置主要颜色信息贴图

Displacement Map (RG)(扭曲贴图): 用来设置扭曲贴图

FlowMap (RG)(流动扭曲图): 用来设置流动扭曲图

Mask (R)(遮罩/黑白图): 用来设置遮罩/黑白图(黑色透明, 白色不透明)

Displacement Map Scroll Speed X(X轴方向的纹理扭曲运动速度): 用来设置X轴方向的纹理扭曲运动速度

Displacement Map Scroll Speed Y(Y轴方向的纹理扭曲运动速度): 用来设置Y轴方向的纹理扭曲运动速度

Displacement Strength X(X轴方向的扭曲强度): 用来设置X轴方向的扭曲强度

Displacement Strength Y(Y轴方向的扭曲强度): 用来设置Y轴方向的扭曲强度 

    2.2.5 Alpha Blend (阿尔法混合材质)的显示级别控制

 

// Upgrade NOTE: replaced \'mul(UNITY_MATRIX_MVP,*)\' with \'UnityObjectToClipPos(*)\'

//Edit BY jingyu.Zhao    
Shader "Jingyu/Alpha Blended Lv3" {
Properties {
    _TintColor ("Tint Color", Color) = (0.5,0.5,0.5,0.5)
    //_MainTex ("Particle Texture", 2D) = "white" {}
    _MainTex("Particle Texture (A = Transparency)", 2D) = "white"{}
    _InvFade ("Soft Particles Factor", Range(0.01,3.0)) = 1.0
}

Category {
    Tags { "Queue"="Transparent+200" "IgnoreProjector"="True" "RenderType"="Transparent" }
    Blend SrcAlpha OneMinusSrcAlpha
    AlphaTest Greater .01
    ColorMask RGB
    Cull Off Lighting Off ZWrite Off
    BindChannels {
        Bind "Color", color
        Bind "Vertex", vertex
        Bind "TexCoord", texcoord
    }
    
    // ---- Fragment program cards
    SubShader {
        Pass {
        
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma fragmentoption ARB_precision_hint_fastest
            #pragma multi_compile_particles
            
            #include "UnityCG.cginc"

            sampler2D _MainTex;
            fixed4 _TintColor;
            
            struct appdata_t {
                float4 vertex : POSITION;
                fixed4 color : COLOR;
                float2 texcoord : TEXCOORD0;
            };

            struct v2f {
                float4 vertex : POSITION;
                fixed4 color : COLOR;
                float2 texcoord : TEXCOORD0;
                #ifdef SOFTPARTICLES_ON
                float4 projPos : TEXCOORD1;
                #endif
            };
            
            float4 _MainTex_ST;

            v2f vert (appdata_t v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                #ifdef SOFTPARTICLES_ON
                o.projPos = ComputeScreenPos (o.vertex);
                COMPUTE_EYEDEPTH(o.projPos.z);
                #endif
                o.color = v.color;
                o.texcoord = TRANSFORM_TEX(v.texcoord,_MainTex);
                return o;
            }

            sampler2D _CameraDepthTexture;
            float _InvFade;
            
            fixed4 frag (v2f i) : COLOR
            {
                #ifdef SOFTPARTICLES_ON
                float sceneZ = LinearEyeDepth (UNITY_SAMPLE_DEPTH(tex2Dproj(_CameraDepthTexture, UNITY_PROJ_COORD(i.projPos))));
                float partZ = i.projPos.z;
                float fade = saturate (_InvFade * (sceneZ-partZ));
                i.color.a *= fade;
                #endif
                
                return 2.0f * i.color * _TintColor * tex2D(_MainTex, i.texcoord);
            }
            ENDCG 
        }
    }     
    
    // ---- Dual texture cards
    SubShader {
        Pass {
            SetTexture [_MainTex] {
                constantColor [_TintColor]
                combine constant * primary
            }
            SetTexture [_MainTex] {
                combine texture * previous DOUBLE
            }
        }
    }
    
    // ---- Single texture cards (does not do color tint)
    SubShader {
        Pass {
            SetTexture [_MainTex] {
                combine texture * primary
            }
        }
    }
}
}
Alpha Blended Lv3
// Upgrade NOTE: replaced \'mul(UNITY_MATRIX_MVP,*)\' with \'UnityObjectToClipPos(*)\'

//Edit BY jingyu.Zhao
Shader "Jingyu/Alpha Blended Lv2" {
Properties {
    _TintColor ("Tint Color", Color) = (0.5,0.5,0.5,0.5)
    //_MainTex ("Particle Texture", 2D) = "white" {}
    _MainTex("Particle Texture (A = Transparency)", 2D) = "white"{}
    _InvFade ("Soft Particles Factor", Range(0.01,3.0)) = 1.0
}

Category {
    Tags { "Queue"="Transparent+100" "IgnoreProjector"="True" "RenderType"="Transparent" }
    Blend SrcAlpha OneMinusSrcAlpha
    AlphaTest Greater .01
    ColorMask RGB
    Cull Off Lighting Off ZWrite Off
    BindChannels {
        Bind "Color", color
        Bind "Vertex", vertex
        Bind "TexCoord", texcoord
    }
    
    // ---- Fragment program cards
    SubShader {
        Pass {
        
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma fragmentoption ARB_precision_hint_fastest
            #pragma multi_compile_particles
            
            #include "UnityCG.cginc"

            sampler2D _MainTex;
            fixed4 _TintColor;
            
            struct appdata_t {
                float4 vertex : POSITION;
                fixed4 color : COLOR;
                float2 texcoord : TEXCOORD0;
            };

            struct v2f {
                float4 vertex : POSITION;
                fixed4 color : COLOR;
                float2 texcoord : TEXCOORD0;
                #ifdef SOFTPARTICLES_ON
                float4 projPos : TEXCOORD1;
                #endif
            };
            
            float4 _MainTex_ST;

            v2f vert (appdata_t v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                #ifdef SOFTPARTICLES_ON
                o.projPos = ComputeScreenPos (o.vertex);
                COMPUTE_EYEDEPTH(o.projPos.z);
                #endif
                o.color = v.color;
                o.texcoord = TRANSFORM_TEX(v.texcoord,_MainTex);
                return o;
            }

            sampler2D _CameraDepthTexture;
            float _InvFade;
            
            fixed4 frag (v2f i) : COLOR
            {
                #ifdef SOFTPARTICLES_ON
                float sceneZ = LinearEyeDepth (UNITY_SAMPLE_DEPTH(tex2Dproj(_CameraDepthTexture, UNITY_PROJ_COORD(i.projPos))));
                float partZ = i.projPos.z;
                float fade = saturate (_InvFade * (sceneZ-partZ));
                i.color.a *= fade;
                #endif
                
                return 2.0f * i.color * _TintColor * tex2D(_MainTex, i.texcoord);
            }
            ENDCG 
        }
    }     
    
    // ---- Dual texture cards
    SubShader {
        Pass {
            SetTexture [_MainTex] {
                constantColor [_TintColor]
                combine constant * primary
            }
            SetTexture [_MainTex] {
                combine texture * previous DOUBLE
            }
        }
    }
    
    // ---- Single texture cards (does not do color tint)
    SubShader {
        Pass {
            SetTexture [_MainTex] {
                combine texture * primary
            }
        }
    }
}
}
Alpha Blended Lv2
// Upgrade NOTE: replaced \'mul(UNITY_MATRIX_MVP,*)\' with \'UnityObjectToClipPos(*)\'

//Edit BY jingyu.Zhao
Shader "Jingyu/Alpha Blended Lv1" {
Properties {
    _TintColor ("Tint Color", Color) = (0.5,0.5,0.5,0.5)
    //_MainTex ("Particle Texture", 2D) = "white" {}
    _MainTex("Particle Texture (A = Transparency)", 2D) = "white"{}
    _InvFade ("Soft Particles Factor", Range(0.01,3.0)) = 1.0
}

Category {
    Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
    Blend SrcAlpha OneMinusSrcAlpha
    AlphaTest Greater .01
    ColorMask RGB
    Cull Off Lighting Off ZWrite Off
    BindChannels {
        Bind "Color", color
        Bind "Vertex", vertex
        Bind "TexCoord", texcoord
    }
    
    // ---- Fragment program cards
    SubShader {
        Pass {
        
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma fragmentoption ARB_precision_hint_fastest
            #pragma multi_compile_particles
            
            #include "UnityCG.cginc"

            sampler2D _MainTex;
            fixed4 _TintColor;
            
            struct appdata_t {
                float4 vertex : POSITION;
                fixed4 color : COLOR;
                float2 texcoord : TEXCOORD0;
            };

            struct v2f {
                float4 vertex : POSITION;
                fixed4 color : COLOR;
                float2 texcoord : TEXCOORD0;
                #ifdef SOFTPARTICLES_ON
                float4 projPos : TEXCOORD1;
                #endif
            };
            
            float4 _MainTex_ST;

            v2f vert (appdata_t v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                #ifdef SOFTPARTICLES_ON
                o.projPos = ComputeScreenPos (o.vertex);
                COMPUTE_EYEDEPTH(o.projPos.z);
                #endif
                o.color = v.color;
                o.texcoord = TRANSFORM_TEX(v.texcoord,_MainTex);
                return o;
            }

            sampler2D _CameraDepthTexture;
            float _InvFade;
            
            fixed4 frag (v2f i) : COLOR
            {
                #ifdef SOFTPARTICLES_ON
                float sceneZ = LinearEyeDepth (UNITY_SAMPLE_DEPTH(tex2Dproj(_CameraDepthTexture, UNITY_PROJ_COORD(i.projPos))));
                float partZ = i.projPos.z;
                float fade = saturate (_InvFade * (sceneZ-partZ));
                i.color.a *= fade;
                #endif
                
                return 2.0f * i.color * _TintColor * tex2D(_MainTex, i.texcoord);
            }
            ENDCG 
        }
    }     
    
    // ---- Dual texture cards
    SubShader {
        Pass {
            SetTexture [_MainTex] {
                constantColor [_TintColor]
                combine constant * primary
            }
            SetTexture [_MainTex] {
                combine texture * previous DOUBLE
            }
        }
    }
    
    // ---- Single texture cards (does not do color tint)
    SubShader {
        Pass {
            SetTexture [_MainTex] {
                combine texture * primary
            }
        }
    }
}
}
Alpha Blended Lv1

    2.2.6 Katongbian (卡通外边)材质

 

// Upgrade NOTE: replaced \'mul(UNITY_MATRIX_MVP,*)\' with \'UnityObjectToClipPos(*)\'

//Edit BY jingyu.Zhao    
Shader "Jingyu/Katongbian" {
    Properties {
        _Color ("Main Color", Color) = (1,1,1,1)
        _OutlineColor ("Outline Color", Color) = (1,1,1,1)
        _Outline ("Outline width", Range (0.0, 0.03)) = .005
        _MainTex ("Base (RGB)", 2D) = "white" { }
        _BumpMap ("Bumpmap", 2D) = "bump" {}
    }
 
CGINCLUDE
#include "UnityCG.cginc"
 
struct appdata {
    float4 vertex : POSITION;
    float3 normal : NORMAL;
};
 
struct v2f {
    float4 pos : POSITION;
    float4 color : COLOR;
};
 
uniform float _Outline;
uniform float4 _OutlineColor;
 
v2f vert(appdata v) {
    // just make a copy of incoming vertex data but scaled according to normal direction
    v2f o;
    o.pos = UnityObjectToClipPos(v.vertex);
 
    float3 norm   = mul ((float3x3)UNITY_MATRIX_IT_MV, v.normal);
    float2 offset = TransformViewToProjection(norm.xy);
 
    o.pos.xy += offset * o.pos.z * _Outline;
    o.color = _OutlineColor;
    return o;
}
ENDCG
 
    SubShader {
        Tags { "Queue" = "Transparent" }
 
        // note that a vertex shader is specified here but its using the one above
        Pass {
            Name "OUTLINE"
            Tags { "LightMode" = "Always" }
            Cull Off
            ZWrite Off
            ZTest Always
 
            // you can choose what kind of blending mode you want for the outline
            Blend SrcAlpha OneMinusSrcAlpha // Normal
            //Blend One One // Additive
            //Blend One OneMinusDstColor // Soft Additive
            //Blend DstColor Zero // Multiplicative
            //Blend DstColor SrcColor // 2x Multiplicative
 
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
 
half4 frag(v2f i) : COLOR {
    return i.color;
}
ENDCG
        }
 
 
CGPROGRAM
#pragma surface surf Lambert
struct Input {
    float2 uv_MainTex;
    float2 uv_BumpMap;
};
sampler2D _MainTex;
sampler2D _BumpMap;
uniform float3 _Color;
void surf(Input IN, inout SurfaceOutput o) {
    o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb * _Color;
    o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
}
ENDCG
 
    }
 
    SubShader {
        Tags { "Queue" = "Transparent" }
 
        Pass {
            Name "OUTLINE"
            Tags { "LightMode" = "Always" }
            Cull Front
            ZWrite Off
            ZTest Always
            Offset 15,15
 
            // you can choose what kind of blending mode you want for the outline
            Blend SrcAlpha OneMinusSrcAlpha // Normal
            //Blend One One // Additive
            //Blend One OneMinusDstColor // Soft Additive
            //Blend DstColor Zero // Multiplicative
            //Blend DstColor SrcColor // 2x Multiplicative
 
            CGPROGRAM
            #pragma vertex vert
            #pragma exclude_renderers gles xbox360 ps3
            ENDCG
            SetTexture [_MainTex] { combine primary }
        }
 
CGPROGRAM
#pragma surface surf Lambert
struct Input {
    float2 uv_MainTex;
    float2 uv_BumpMap;
};
sampler2D _MainTex;
sampler2D _BumpMap;
uniform float3 _Color;
void surf(Input IN, inout SurfaceOutput o) {
    o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb * _Color;
    o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
}
ENDCG
 
    }
 
    Fallback "Outlined/Silhouetted Diffuse"
}
Katongbian

    2.2.7  Katongbian_only (卡通外边单独显示)材质

 

// Upgrade NOTE: replaced \'mul(UNITY_MATRIX_MVP,*)\' with \'UnityObjectToClipPos(*)\'

//Edit BY jingyu.Zhao    
Shader "Jingyu/Katongbian_only" {
    Properties {
        _OutlineColor ("Outline Color", Color) = (1,1,1,1)
        _Outline ("Outline width", Range (0.0, 0.03)) = .005
    }
 
CGINCLUDE
#include "UnityCG.cginc"
 
struct appdata {
    float4 vertex : POSITION;
    float3 normal : NORMAL;
};
 
struct v2f {
    float4 pos : POSITION;
    float4 color : COLOR;
};
 
uniform float _Outline;
uniform float4 _OutlineColor;
 
v2f vert(appdata v) {
    // just make a copy of incoming vertex data but scaled according to normal direction
    v2f o;
    o.pos = UnityObjectToClipPos(v.vertex);
 
    float3 norm   = mul ((float3x3)UNITY_MATRIX_IT_MV, v.normal);
    float2 offset = TransformViewToProjection(norm.xy);
 
    o.pos.xy += offset * o.pos.z * _Outline;
    o.color = _OutlineColor;
    return o;
}
ENDCG
 
    SubShader {
        Tags { "Queue" = "Transparent" }
 
        Pass {
            Name "BASE"
            Cull Back
            Blend Zero One
 
            // uncomment this to hide inner details:
            //Offset -8, -8
 
            SetTexture [_OutlineColor] {
                ConstantColor (0,0,0,0)
                Combine constant
            }
        }
 
        // note that a vertex shader is specified here but its using the one above
        Pass {
            Name "OUTLINE"
            Tags { "LightMode" = "Always" }
            Cull Front
 
            // you can choose what kind of blending mode you want for the outline
            //Blend SrcAlpha OneMinusSrcAlpha // Normal
            //Blend One One // Additive
            Blend One OneMinusDstColor // Soft Additive
            //Blend DstColor Zero // Multiplicative
            //Blend DstColor SrcColor // 2x Multiplicative
 
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
 
half4 frag(v2f i) :COLOR {
    return i.color;
}
ENDCG
        }
 
 
    }
 
    Fallback "Diffuse"
}
Katongbian_only

    2.2.8 Liangbian (亮边)材质

 

// Upgrade NOTE: replaced \'mul(UNITY_MATRIX_MVP,*)\' with \'UnityObjectToClipPos(*)\'

//Edit BY jingyu.Zhao    
Shader "Jingyu/Liangbian" {
    Properties {
        _MainTex ("Base (RGB)", 2D) = "white" {}
        _Color ("Main Color", Color) = (1,1,1,1)
        _RimColor ("Rim Color", Color) = (1, 1, 1, 1)
        _RimWidth ("Rim Width", Float) = 0.7
    }
    SubShader {
        Pass {
               Lighting Off
            CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag
                #include "UnityCG.cginc"

                struct appdata {
                    float4 vertex : POSITION;
                    float3 normal : NORMAL;
                    float2 texcoord : TEXCOORD0;
                };

                struct v2f {
                    float4 pos : SV_POSITION;
                    float2 uv : TEXCOORD0;
                    fixed3 color : COLOR;
                };

                uniform float4 _MainTex_ST;
                uniform fixed4 _RimColor;
                float _RimWidth;

                v2f vert (appdata_base v) {
                    v2f o;
                    o.pos = UnityObjectToClipPos (v.vertex);

                    float3 viewDir = normalize(ObjSpaceViewDir(v.vertex));
                    float dotProduct = 1 - dot(v.normal, viewDir);
                   
                    o.color = smoothstep(1 - _RimWidth, 1.0, dotProduct);
                    o.color *= _RimColor;

//                    o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
                    o.uv = v.texcoord.xy;
                    return o;
                }

                uniform sampler2D _MainTex;
                uniform fixed4 _Color;

                fixed4 frag(v2f i) : COLOR {
                    fixed4 texcol = tex2D(_MainTex, i.uv);
                    texcol *= _Color;
                    texcol.rgb += i.color;
                    return texcol;
                }
            ENDCG
        }
    }
}
Liangbia

    2.2.9 Liangbian_only (亮边单独显示) 材质

 

//Edit BY jingyu.Zhao    
Shader "Jingyu/Liangbian_only" {
Properties {


_RimColor ("Rim Color", Color) = (0.5,0.5,0.5,0.5)
_InnerColor ("Inner Color", Color) = (0.5,0.5,0.5,0.5)
_InnerColorPower ("Inner Color Power", Range(0.0,1.0)) = 0.5
_RimPower ("Rim Power", Range(0.0,5.0)) = 2.5
_AlphaPower ("Alpha Rim Power", Range(0.0,8.0)) = 4.0
_AllPower ("All Power", Range(0.0, 10.0)) = 1.0


}
SubShader {
Tags { "Queue" = "Transparent" }

CGPROGRAM
#pragma surface surf Lambert alpha
struct Input {
float3 viewDir;
INTERNAL_DATA
};
float4 _RimColor;
float _RimPower;
float _AlphaPower;
float _AlphaMin;
float _InnerColorPower;
float _AllPower;
float4 _InnerColor;
void surf (Input IN, inout SurfaceOutput o) {
half rim = 1.0 - saturate(dot (normalize(IN.viewDir), o.Normal));
o.Emission = _RimColor.rgb * pow (rim, _RimPower)*_AllPower+(_InnerColor.rgb*2*_InnerColorPower);
o.Alpha = (pow (rim, _AlphaPower))*_AllPower;
}
ENDCG
}
Fallback "VertexLit"
} 
Liangbian_only

    2.2.10 Model_xulie (模型序列播放) 材质

 

//Edit BY jingyu.Zhao    
Shader "Jingyu/Model_xulie" {
Properties {
    _Color ("Main Color", Color) = (1,1,1,1)
    _MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
    _SizeX ("Columns", Float) = 4
    _SizeY ("Rows", Float) = 4
    _Speed ("Speed", Float) = 200
}

SubShader {
    Tags { "RenderType"="Opaque"}
    LOD 200

CGPROGRAM
#pragma surface surf Lambert alpha

sampler2D _MainTex;
fixed4 _Color;

uniform fixed _SizeX;
uniform fixed _SizeY;
uniform fixed _Speed;

struct Input {
    float2 uv_MainTex;
};

void surf (Input IN, inout SurfaceOutput o) {
    
    int index = floor(_Time .x * _Speed);
    int indexY = index/_SizeX;
    int indexX = index - indexY*_SizeX;
    float2 testUV = float2(IN.uv_MainTex.x /_SizeX, IN.uv_MainTex.y /_SizeY);
    
    testUV.x += indexX/_SizeX;
    testUV.y += indexY/_SizeY;
    
    fixed4 c = tex2D(_MainTex, testUV) * _Color;
    o.Albedo = c.rgb;
    
    o.Alpha = c.a;
    //o.Albedo = float3( floor(_Time .x * _Speed) , 1.0, 1.0);
}
ENDCG
}

Fallback "Transparent/VertexLit"
}
Model_xulie

推荐读者使用脚本来实现模型序列播放功能(顺序正确),

     2.2.11 Niuqu (扭曲) 材质

// Upgrade NOTE: replaced \'mul(UNITY_MATRIX_MVP,*)\' with \'UnityObjectToClipPos(*)\'

//Edit BY jingyu.Zhao    
Shader "Jingyu/Niuqu" {
Properties {
 _BumpAmt  ("Distortion", range (0,128)) = 10
 _MainTex ("Tint Color (RGB)", 2D) = "white" {}
 _BumpMap ("Normalmap", 2D) = "bump" {}
}

CGINCLUDE
#pragma fragmentoption ARB_precision_hint_fastest
#pragma fragmentoption ARB_fog_exp2
#include "UnityCG.cginc"

sampler2D _GrabTexture : register(s0);
float4 _GrabTexture_TexelSize;
sampler2D _BumpMap : register(s1);
sampler2D _MainTex : register(s2);


struct v2f {
 float4 vertex : POSITION;
 float4 uvgrab : TEXCOORD0;
 float2 uvbump : TEXCOORD1;
 float2 uvmain : TEXCOORD2;
};

uniform float _BumpAmt;


half4 frag( v2f i ) : COLOR
{
 // calculate perturbed coordinates
 half2 bump = UnpackNormal(tex2D( _BumpMap, i.uvbump )).rg; // we could optimize this by just reading the x & y without reconstructing the Z
 float2 offset = bump * _BumpAmt * _GrabTexture_TexelSize.xy;
 i.uvgrab.xy = offset * i.uvgrab.z + i.uvgrab.xy;
 
 half4 col = tex2Dproj( _GrabTexture, i.uvgrab );
 half4 tint = tex2D( _MainTex, i.uvmain );
 return col * tint;
}
ENDCG

Category {

 // We must be transparent, so other objects are drawn before this one.
 Tags { "Queue"="Transparent+100" "RenderType"="Opaque" }


 SubShader {

  // This pass grabs the screen behind the object into a texture.
  // We can access the result in the next pass as _GrabTexture
  GrabPass {       
   Name "BASE"
   Tags { "LightMode" = "Always" }
   }
   
   // Main pass: Take the texture grabbed above and use the bumpmap to perturb it
   // on to the screen
  Pass {
   Name "BASE"
   Tags { "LightMode" = "Always" }
   
CGPROGRAM
#pragma vertex vert
#pragma fragment frag

struct appdata_t {
 float4 vertex : POSITION;
 float2 texcoord: TEXCOORD0;
};

v2f vert (appdata_t v)
{
 v2f o;
 o.vertex = UnityObjectToClipPos(v.vertex);
 #if UNITY_UV_STARTS_AT_TOP
 float scale = -1.0;
 #else
 float scale = 1.0;
 #endif
 o.uvgrab.xy = (float2(o.vertex.x, o.vertex.y*scale) + o.vertex.w) * 0.5;
 o.uvgrab.zw = o.vertex.zw;
 o.uvbump = MultiplyUV( UNITY_MATRIX_TEXTURE1, v.texcoord );
 o.uvmain = MultiplyUV( UNITY_MATRIX_TEXTURE2, v.texcoord );
 return o;
}
ENDCG
  }
 }

 // ------------------------------------------------------------------
 // Fallback for older cards and Unity non-Pro
 
 SubShader {
  Blend DstColor Zero
  Pass {
   Name "BASE"
   SetTexture [_MainTex] { combine texture }
  }
 }
}

}
Niuqu

Distortion (扭曲强度): 用来设置扭曲强度

Tint Color (着色贴图): 用来设置着色贴图(如不需要, 可以不指定)

Normalmap (法线贴图): 用来设置法线贴图(影响到扭曲范围和扭曲形状) 

    2.2.12 Niuqu_animation (动态扭曲)材质

// Upgrade NOTE: replaced \'mul(UNITY_MATRIX_MVP,*)\' with \'UnityObjectToClipPos(*)\'

//Edit BY jingyu.Zhao    
Shader "Jingyu/Niuqu_animation" {
Properties {
    _DispMap ("Displacement Map (RG)", 2D) = "white" {}
    _MaskTex ("Mask (R)", 2D) = "white" {}
    _DispScrollSpeedX  ("Map Scroll Speed X", Float) = 0
    _DispScrollSpeedY  ("Map Scroll Speed Y", Float) = 0
    _StrengthX  ("Displacement Strength X", Float) = 1
    _StrengthY  ("Displacement Strength Y", Float) = -1
}

Category {
    Tags { "Queue"="Transparent+99" "RenderType"="Transparent" }
    Blend SrcAlpha OneMinusSrcAlpha
    //AlphaTest Greater .01
    Cull Off Lighting Off ZWrite Off ZTest Always
    
    BindChannels {
        Bind "Color", color
        Bind "Vertex", vertex
        Bind "TexCoord", texcoord
    }

    SubShader {
        GrabPass {                            
            Name "BASE"
            Tags { "LightMode" = "Always" }
         }

        Pass {
            Name "BASE"
            Tags { "LightMode" = "Always" }
            
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
#include "UnityCG.cginc"

struct appdata_t {
    float4 vertex : POSITION;
    fixed4 color : COLOR;
    float2 texcoord: TEXCOORD0;
    float2 param : TEXCOORD1;
};

struct v2f {
    float4 vertex : POSITION;
    fixed4 color : COLOR;
    float2 uvmain : TEXCOORD0;
    float2 param : TEXCOORD1;
    float4 uvgrab : TEXCOORD2;
};

uniform half _StrengthX;
uniform half _StrengthY;

uniform float4 _DispMap_ST;
uniform sampler2D _DispMap;
uniform sampler2D _MaskTex;
uniform half _DispScrollSpeedY;
uniform half _DispScrollSpeedX;

v2f vert (appdata_t v)
{
    v2f o;
    o.vertex = UnityObjectToClipPos(v.vertex);
    #if UNITY_UV_STARTS_AT_TOP
    float scale = -1.0;
    #else
    float scale = 1.0;
    #endif
    o.uvgrab.xy = (float2(o.vertex.x, o.vertex.y*scale) + o.vertex.w) * 0.5;
    o.uvgrab.zw = o.vertex.zw;
    o.uvmain = TRANSFORM_TEX( v.texcoord, _DispMap );
    o.color = v.color;
    o.param = v.param;
    return o;
}

sampler2D _GrabTexture;

half4 frag( v2f i ) : COLOR
{
    //scroll displacement map.
    half2 mapoft = half2(_Time.y*_DispScrollSpeedX, _Time.y*_DispScrollSpeedY);

    //get displacement color
    half4 offsetColor = tex2D(_DispMap, i.uvmain + mapoft);

    //get offset
    half oftX =  offsetColor.r * _StrengthX * i.param.x;
    half oftY =  offsetColor.g * _StrengthY * i.param.x;

    i.uvgrab.x += oftX;
    i.uvgrab.y += oftY;

    half4 col = tex2Dproj( _GrabTexture, UNITY_PROJ_COORD(i.uvgrab));

    //intensity is controlled by particle color.
    col.a = i.color.a;

    //use mask\'s red channel to determine visibility.
    fixed4 tint = tex2D( _MaskTex, i.uvmain );

    col.a *= tint.r;

    return col;
}
ENDCG
        }
}

    // ------------------------------------------------------------------
    // Fallback for older cards and Unity non-Pro
    
    SubShader {
        Blend SrcAlpha OneMinusSrcAlpha
        Pass {
            Name "BASE"
            SetTexture [_MainTex] {    combine texture * primary double, texture * primary }
        }
    }
}
}
Niuqu_animation

    2.2.13 Rongjie (溶解)材质

 

//Edit BY jingyu.Zhao
Shader "Jingyu/Rongjie" {
Properties {
    _Color ("Main Color", Color) = (1,1,1,1)
    _SpecColor ("Specular Color", Color) = (0.5, 0.5, 0.5, 1)
    _Shininess ("Shininess", Range (0.03, 1)) = 0.078125
    _Amount ("Amount", Range (0, 1)) = 0.5
    _StartAmount("StartAmount", float) = 0.1
    _Illuminate ("Illuminate", Range (0, 1)) = 0.5
    _Tile("Tile", float) = 1
    _DissColor ("DissColor", Color) = (1,1,1,1)
    _ColorAnimate ("ColorAnimate", vector) = (1,1,1,1)
    _MainTex ("Base (RGB) Gloss (A)", 2D) = "white" {}
    _BumpMap ("Normalmap", 2D) = "bump" {}
    _DissolveSrc ("DissolveSrc", 2D) = "white" {}
    _DissolveSrcBump ("DissolveSrcBump", 2D) = "white" {}

}
SubShader { 
    Tags { "RenderType"="Opaque" }
    LOD 400
    cull off
    
    
CGPROGRAM
#pragma target 3.0
#pragma surface surf BlinnPhong addshadow



sampler2D _MainTex;
sampler2D _BumpMap;
sampler2D _DissolveSrc;
sampler2D _DissolveSrcBump;

fixed4 _Color;
half4 _DissColor;
half _Shininess;
half _Amount;
static half3 Color = float3(1,1,1);
half4 _ColorAnimate;
half _Illuminate;
half _Tile;
half _StartAmount;



struct Input {
    float2 uv_MainTex;
    float2 uv_BumpMap;
    float2 uvDissolveSrc;
};

void vert (inout appdata_full v, out Input o) {}

void surf (Input IN, inout SurfaceOutput o) {
    fixed4 tex = tex2D(_MainTex, IN.uv_MainTex);
    o.Albedo = tex.rgb * _Color.rgb;
    
    float ClipTex = tex2D (_DissolveSrc, IN.uv_MainTex/_Tile).r ;
    float ClipAmount = ClipTex - _Amount;
    float Clip = 0;
    float4 DematBump =  tex2D (_DissolveSrcBump,IN.uv_MainTex/_Tile);
    o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
if (_Amount > 0)
{
    if (ClipAmount <0)
    {
        Clip = 1; //clip(-0.1);
    
    }
     else
     {
    
        if (ClipAmount < _StartAmount)
        {
            if (_ColorAnimate.x == 0)
                Color.x = _DissColor.x;
            else
                Color.x = ClipAmount/_StartAmount;
          
            if (_ColorAnimate.y == 0)
                Color.y = _DissColor.y;
            else
                Color.y = ClipAmount/_StartAmount;
          
            if (_ColorAnimate.z == 0)
                Color.z = _DissColor.z;
            else
                Color.z = ClipAmount/_StartAmount;

            o.Albedo  = (o.Albedo *((Color.x+Color.y+Color.z))* Color*((Color.x+Color.y+Color.z)))/(1 - _Illuminate);
            o.Normal = UnpackNormal(tex2D(_DissolveSrcBump, IN.uvDissolveSrc));
        
        }
     }
 }

 
if (Clip == 1)
{
clip(-0.1);
}

   
    //////////////////////////////////
    //
    o.Gloss = tex.a;
    o.Alpha = tex.a * _Color.a;
    o.Specular = _Shininess;
    
}
ENDCG
}

FallBack "Specular"
}
Rongjie

Main Color (主要颜色): 用来设置主要颜色

Specular Color (高光色): 用来设置高光色

Shininess (反光): 用来设置反光

Amount (溶解程度): 用来设置溶解程度控制(数值范围为0~1, 0不发生溶解, 1完全溶解消失)

StartAmount (溶解边缘颜色范围): 用来设置溶解边缘颜色范围控制. 通过该数值可以修改溶解纹理边缘的过渡控制. 数值小于等于0时参数ColorAnimate(颜色变换动画)失效

Illuminate (照亮): 用来设置溶解边缘纹理亮度控制, 该数值需要结合参数StartAmount(溶解边缘颜色范围)来控制(数值范围为0~1, 数值为0时不影响, 设置为1时边缘全白)

Tile (磁贴): 用来设置溶解纹理排布

DissColor (溶解颜色): 溶解边缘颜色控制, 需要结合参数ColorAnimate(颜色动画)控制 

第3章 插件/脚本

  3.1 常用的脚本

 

    3.1.1 脚本使用方法

 

    3.1.2 Y轴旋转脚本

 

    3.1.3 全轴向旋转脚本

 

    3.1.4 随机旋转脚本

 

    3.1.5 UV动画脚本

 

    3.1.6 延迟产生脚本

 

    3.1.7 死亡脚本

 

    3.1.8 自动销毁脚本

 

    3.1.9 模型序列动画脚本

 

    3.1.10 全局缩放脚本

 

    3.1.11 动画播放速度随机脚本

 

    3.1.12 摄像机控制脚本

 

  3.2 常用插件

 

    3.2.1 Xffect插件介绍

 

    3.2.2 FX Maker插件介绍

 

    3.2.3 Melee Weapon Trail (刀光插件) 介绍

 

    3.2.4 破碎插件RayFire介绍

 

    3.2.5 特效自发光实现方法

 

    3.2.6 Unity3D镜头特效

 

  3.3 录屏工具

 

    3.3.1 Bandicam录屏软件的介绍

 

    3.3.2 Bandicam菜单栏介绍

 

    3.3.3 使用方法

 

    3.3.4 将录制的视频转换为GIF高清动态图

 

第4章 综合实例

  4.1 游戏类型

 

  4.2 特效类别

 

  4.3 基本要求

 

  4.4 实例操作

 

    4.4.1 场景特效的制作

 

    4.4.2 Buff特效的制作

 

    4.4.3 武器特效的制作

 

    4.4.4 消除游戏中连线效果的制作

 

    4.4.5 条带拖尾效果的制作

 

    4.4.6 UI特效的制作

 

    4.4.7 偏卡通风格龙卷风效果的制作

 

    4.4.8 能量性爆炸效果的制作

 

    4.4.9 岩浆气泡爆破动画, UV调节效果, 幻影效果的制作

 

    4.4.10 地面爆破延迟效果的制作

 

    4.4.11 刀光效果, 物品掉落效果的制作

 

    4.4.12 自爆效果的制作

 

    4.4.13 网格体变形动画高级控制

 

    4.4.14 激光受击效果的制作