Unity Effects

作者 Claymore 日期 2016-06-20
Unity Effects

写在前面

这篇文章主要介绍unity的高级功能,Effects和Image Effect相关的功能。
unity 自带的Effect资源包邮不少资源,点击导航菜单栏->Assets->Import Package->Effects 导入Effects包。
Effects功能可以建空对象再添加相关组件实现,组件位于 导航菜单栏->Component->Effects

尾径渲染器


它可以实现刀剑挥舞的残影,喷气尾焰等效果。下面就来实践:
新建场景,新建一个胶囊体,拉成条状,建立空物体为剑的底部,设置为子物体。

建空物体名为 top ,是剑的上端,设置为子物体。添加Trail Renderer。配置如下:

有几点待补充,

  • Materials里是带拖尾贴图的材质球
  • Time 是拖尾贴图消失的时间
  • start width 是 挥动时头部的宽度。
  • end width 是挥动末尾小尾巴的宽度。
  • color 就是光影的颜色了 ,可以调成渐变的比较好
  • Autodestruct 是自动销毁,挥动完可以销毁。

为圆柱体添加代码:

using UnityEngine;
using System.Collections;

public class Sword : MonoBehaviour {
    public Transform bot;
    public float timeMax = 0.2f;
    public float speed = 100f;
    private float time = 0;
    private Vector3 startPos;
    private Vector3 starAngles;

    void Awake()
    {
        startPos = transform.position;
        starAngles = transform.eulerAngles;
    }

    void OnGUI()
    {
       //按下按钮开始挥剑
       if(GUILayout.Button("挥剑"))
        {
            time = timeMax;
            transform.position = startPos;
            transform.eulerAngles = starAngles;
        }
    }

    // Update is called once per frame
    void Update () {
        if (time > 0)
        {
            time -= Time.deltaTime;
            Swing(); 
        }
    }
//更新剑的旋转
    void Swing()
    {
        transform.RotateAround(bot.position, Vector3.forward, speed * Time.deltaTime);
    }
}

线段渲染器

Line Renderer
一组3D点,在每个点之间用材质绘制一条线。比如闪电。
如果闪电用一张普通的贴图,用面片也能显示,但是形状是固定的,劈下来的过程也是固定的,二使用Line Renderer,这闪电可以不同的形状路径劈下来。

镜头光晕

镜头光晕(Lens Flare) 是模拟摄像机镜头内折射光线的效果,用来表现真正的光源(太阳)
空物体 添加 Lens Flare组件:

光晕

Halo 光晕是光源周围的光线区域,常用来表现光线照射空气中细小灰尘颗粒产生的效果,也可以表现一些自发光物体,如萤火虫,新建物体添加 Halo

投影仪

Projector
Effects包中包含Projector文件夹,包含一些常用的资源。

原理

将一个Material投影到所设定平截头体内的物体上,通常包含两张贴图Cookie 和 Falloff。
Cookie 是要投射的图案,Falloff是根据距离来决定投影的明暗(Alpha)。

下面我们来为一个人物添加阴影

虽然说unity的实时光照很好,但是有的旧设备不支持,所以有那种地面上就一个圆的阴影,我们来个例子,也好熟悉其功能。

  • 导入effects包
  • 关闭平行光和点光源的shadow type 设置为 no shadow。
  • 为主角添加一个空物体,作为子物体,名为projector,添加projector组件。
  • 新建一个Material,shader类型选择为 Projector/Multiply (如果不导入包这里是没有的)。
  • 将Cookie贴图设置为shadow贴图,falloff贴图设置为falloff贴图,包里自带。
  • 将此Material给空物体,调整空物体的位置,放到人物头部上方,调整角度,z轴,使阴影向下。
  • 这时会发现,人物因为阴影而变黑,设置人物的Layers,比如为Player。在Projector组件中的Ignore Layers设置成Player就可以了。

人物选择光圈

在3D游戏开发中,经常选取人物脚下的旋转光圈。用投影做,光圈不会被障碍物挡住。

  • 前面和上面一样,把Cookie贴图换成 一个光环(图片导入设置中Warp Mode设置为Clamp),给自物体添加脚本,让其自己旋转。
  • 为人物添加碰撞,用于射线检测
  • 建空物体Manager,建立CharacterSelector脚本:

    using UnityEngine;
    using System.Collections;
    
    public class CharacterSeletcor : MonoBehaviour {
        //摄像机
        public Camera cam;
        private GameObject lastSelectedChar; //上次选择的角色
    
        void Update () {
            if (Input.GetMouseButtonDown(0))
            {
                Ray ray = cam.ScreenPointToRay(Input.mousePosition); //从相机发射射线到屏幕点击的位置
                RaycastHit hitInfo;
                if(Physics.Raycast(ray,out hitInfo))
                {
                    //如果射线碰到了碰撞体,并且碰撞体对象的层为Girl
                    if (hitInfo.collider != null && hitInfo.collider.gameObject.layer == LayerMask.NameToLayer("Girl"))
                    {
                        //如果有上次选取角色且不是将要选取的角色,则取消选择
                        if(lastSelectedChar!=null&&lastSelectedChar.GetInstanceID()!= hitInfo.collider.gameObject.GetInstanceID())
                        {
                            lastSelectedChar.transform.FindChild("Projector").GetComponent<Projector>().enabled = false;
                        }                            hitInfo.collider.transform.FindChild("Projector").GetComponent<Projector>().enabled = true;
                        //记录选取的角色
                        lastSelectedChar = hitInfo.collider.gameObject;
                    }
                }
            }
        }
    }
    

image Effects

导入effects包后,image effects效果可以通过 Component > iamge effects 添加。

Sun Shaft 太阳光束


就是太阳光被挡住后又散射的部分。

  • 添加草地和立方体,添加带lens flares的组件的空物体。
  • 调整直射光和lens flares同一个方向。
  • 为摄像机添加组件 sun shafts shafts caster 为刚才的空物体,组件的threshold color可调光的强弱。
    Twirl 旋转
    图像扭曲,为摄像机添加自带Twirl脚本:

Vortex 漩涡

和旋转相似,区别是Twirl是围绕一个点,二漩涡是围绕一个区域

Depth of Field 景深

景深是一种常见的后期处理效果,可模拟摄像机的属性,在关键地方明亮,在其他地方模糊,突出距离感和写实。

在相机添加 Depth of Field(Lens Bur、Scatter、DX11)组件,Focus On transform 为此立方体。

Tilt Shift 移轴特效

它是景深的一种特殊版本,可以使失焦区域和聚焦区域的过渡更加光滑。不容易造成图像瑕疵,但是它依赖纹理查找,造成更高的处理开销。

Blur 模糊

使全部图像模糊,比如游戏暂停时。
同样,也是为相机添加Blur组件。

Motion Blur 动态模糊

大多数模拟摄像机系统的光随时间基类,快速摄像机或对象移动造成动态模糊的情况。

Bloom 泛光

强光源看起来影响到了周围物体,是一种高校的独特效果,可以烘托出梦幻的环境。
新建材质,将Emission自发光栏强度设置为一,摄像机添加Bloom,这样,用这个材质的物体会发出泛光。

Noise And Scratches 噪点和刮痕

模拟电视机信号差的图像

Noise And Grains 噪点和颗粒

模拟噪波和胶片颗粒,电影和摄影常出现的经典效果。

抗锯齿

首先,锯齿的产生原因是最终显示到显示器的像素点数量是有限的。某像素点对应的真实图像也许是混合的颜色,而像素点只能采集单一颜色并显示,在两种颜色相邻的边缘,沿着边缘一排像素点取到的是一种颜色,而到了某一点,取到的颜色变成了零一种,因此有了锯齿。

抗锯齿(Anti-aliasing)就是解决这个问题,大部分抗锯齿的思路是,将锯齿相关的像素点取几个临近像素,把这些采样混合成最终像素,这样具有了临近像素的特征。
Unity抗锯齿分为两大类:

  • 硬件抗锯齿:多重采样MSAA(MultiSampling Anti-Aliasing)。
    实现方法:Edit->Project Settings -> Quality,在Inspector窗口中Anti Aliasing栏中选择一种,倍数越高效果也好,但是占用显卡的性能也会越多。
  • 软件抗锯齿:后期处理,包括SSAA,NFAA,DLAA,FXAA。
    实现方法: 导入effects包后,选中摄像机,Component->Image effects -> Other ->Antialiasing,在Technique栏采取所要的技术即可,相对较快的是SSAA,效果最好的是FXAA3console,FXAA Preset A 和 FXAA Preset B。
    推荐使用MSAA硬件采样(尤其是移动平台),效率高而且所有平台都支持

ToonShading 卡通渲染

基本原理是在角色外侧绘制一圈黑色的轮廓,并且让受到光照的颜色亮度离散化,明的地方更亮,暗的地方更。

将一个模型的shader改为Toon/Lit OutLine。
Base(rbg)是它本身的贴图,Toon Ramp是effects包里带的UnilToonGradient贴图。