0评论

Unity实现水下模糊效果

文章来自https://blog.csdn.net/u010989951/article/details/52768794 2019-03-08 457浏览

想免费获取内部独家PPT资料库?观看行业大牛直播?点击加入腾讯游戏学院游戏开发行业精英群711501594

想要实现水下模糊效果,很多人通常是通过景深(depth of field)实现,但是看了一些具体的实现案例,发现效果并不好,虽然也能实现水下模糊,但是效果真的不敢恭维,为此,本篇就给大家分享下另外一个水下模糊效果的实现,采用浅蓝色的雾加blur实现,先上效果图:

水面图

水下图

水下模糊效果实现方法如下:

第一步:

为了实现相机判断是不是处于水面下,我这里采用一个cube来填充整个水下空间,这样利于判断是不是处于水面下,在hierarchy面板下点击gameobject,创建一个cube,修改名字和tag为shuixia,调整cube的大小,使cube填充到整个水面以下空间。勾选cube的box collider组件下的is Trigger,否则相机无法穿入cube。

第二步:

给camera添加blur组件,该组件在image effects目录下,如果你的unity下没有image effects,那么不用担心,那是因为你没有导入标准资源,在project下导入标准资源即可。将blur的iterations 参数设置为1,blur spread 参数设置为0.3,你也可以设置其他值去调试效果。

第三步:

设置开启浓雾效果,老版本的unity在edit的render setting下,新版本的fog在window/lighting中。勾选fog即能打开浓雾效果,设置浓雾的颜色可以实现模拟水下效果。当然,这里的浓雾和blur默认是所有场景,我们可以通过代码控制fog和blur效果的显示和关闭。

第四步:

具体脚本的编写,我这里的思路是当摄像机与水面下的cube碰撞,就开启fog和blur下过,当相机离开cube就关闭fog和blur效果,当然,初始化时要关闭fog和blur,除非初始时你的相机就在水下。

具体的脚本如下:
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using System;
using UnityEngine.EventSystems;
using UnityStandardAssets.ImageEffects;
public class shijiao : MonoBehaviour
{
 public GameObject Cm;//获取摄像机
 public GameObject shuixia;//获取水下的cube
 void Start ()
    {
      RenderSettings.fog = false;//初始化关闭fog
      Cm = GameObject.Find("Mcam");
      Cm.GetComponent<Blur>().enabled = false;
   }
    void OnTriggerStay(Collider hit)
    {
        if (hit.gameObject == shuixia)
        {
            Cm.GetComponent<Blur>().enabled = true;
            RenderSettings.fog = true;
            RenderSettings.fogColor=new Color(0, 0.4f, 0.7f, 0.6f);
            RenderSettings.fogDensity = 0.04f;
        }
    }
    void OnTriggerExit(Collider hit)
    {
        if (hit.gameObject == shuixia)
        {
            Cm.GetComponent<Blur>().enabled = false;
            RenderSettings.fog = false;
        }
    }
}