腾讯的天涯明月刀的天气很棒,以前我也在CE3的基础上做了一个效果差不多的,但是在手机上,还是斜下固定视角的游戏,是否还需要一个天气系统?

而且没有G-Buffer的支持,很多牛逼效果实现不了,比如角色身上的湿润感,水面的波纹涟漪等

考虑了一下,觉得可以做一个简单高效的.

以下雨天为例子.一阵风吹来,天色逐渐变暗,突然下起了雨来,雨越来越大,夹杂着雷声和闪电,过几分钟,雨逐渐消失...

1.风

前面文章已经实现了风引起植被的摆动

2.天色

这个比较麻烦,由于移动平台的场景用的基本都是lightmap烘焙,不是实时光照,所以不好实现过渡,即使是切换光照图效果也不好.那么只好用雾来简单模拟下.

3.雨

为了效率和效果,不要用粒子特效,我尝试过后处理,效率也不是最好的,后来换成了面片.效率和效果都很满意.

4.闪电

和雨一样,用同一个shader处理

5.雷声

这个简单,播放声音

 

最后,渐变的处理,用贝塞尔曲线.庆幸的是Unity用AnimationCurve帮我们实现:

 

脚本代码:

 

[csharp] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. public class Rain : MonoBehaviour  
  5. {  
  6.     public AnimationCurve rainCurve;  
  7.     public AnimationCurve lightningCurve;  
  8.     public float thunderThreshold = 0.2f;  
  9.   
  10.     private Color lightingColor = Color.white;  
  11.     private bool isThunder = false;  
  12.     private bool isPlayingSound = false;  
  13.   
  14.     private Material material = null;  
  15.   
  16.     void Start()  
  17.     {  
  18.         MeshRenderer r = gameObject.GetComponent<MeshRenderer>();  
  19.         if (r != null)  
  20.         {  
  21.             material = r.material;  
  22.         }  
  23.     }  
  24.   
  25.     void Update()  
  26.     {  
  27.         if (material == null)  
  28.             return;  
  29.   
  30.         // 雨  
  31.         if (rainCurve != null)  
  32.         {  
  33.             float val = rainCurve.Evaluate(Time.time);  
  34.             material.SetFloat("_Intensity", val * 0.4f);  
  35.   
  36.             // 雾  
  37.             if (RenderSettings.fogMode == FogMode.ExponentialSquared  
  38.                 || RenderSettings.fogMode == FogMode.Exponential)  
  39.             {  
  40.                 float density = 0.01f + val * 0.02f;  
  41.                 RenderSettings.fogDensity = density;  
  42.             }  
  43.         }  
  44.   
  45.   
  46.         // 闪电  
  47.         if (lightningCurve != null)  
  48.         {  
  49.             float val = lightningCurve.Evaluate(Time.time);  
  50.             material.SetColor("_LightningColor", lightingColor * val);  
  51.   
  52.             // 雷  
  53.             isThunder = val > thunderThreshold ? true : false;  
  54.             if (isThunder)  
  55.             {  
  56.                 if (!isPlayingSound)  
  57.                 {  
  58.                     // TODO:播放  
  59.                     isPlayingSound = true;  
  60.                 }  
  61.             }  
  62.             else  
  63.             {  
  64.                 isPlayingSound = false;  
  65.             }  
  66.         }  
  67.     }  
  68. }  

静态效果截图看不出啥:

 

 

 
 
posted on 2016-08-18 22:38  chenzhao  阅读(998)  评论(1编辑  收藏  举报