对于不同天气下天空盒的实现。
天空盒时通过天空盒材质更改实现的,新建材质,选择shader/skybox/6sided,然后添加六个天空盒贴图就可以实现天空盒,如果想实现天气变化则需要至少两套贴图,并需要实现渐变。此时需要新建着色器shader。Create/shader/unityshader然后双击新建的shader,添加如下代码,然后将此shader添加到相应材质上,就会看到相应材质有12个贴图槽,即两套天空盒贴图,拖入相应的贴图,通过材质的setfloat方法控制参数_Blend的值即可实现渐变,如第二段代码所示,也可加入灯光强度的设置,以达到相关效果。
Shader "Skybox/Blended" { Properties{ _Tint("Tint Color", Color) = (.5, .5, .5, .5) _Blend("Blend", Range(0.0,1.0)) = 0.5 _FrontTex("Front (+Z)", 2D) = "white" {} _BackTex("Back (-Z)", 2D) = "white" {} _LeftTex("Left (+X)", 2D) = "white" {} _RightTex("Right (-X)", 2D) = "white" {} _UpTex("Up (+Y)", 2D) = "white" {} _DownTex("Down (-Y)", 2D) = "white" {} _FrontTex2("2 Front (+Z)", 2D) = "white" {} _BackTex2("2 Back (-Z)", 2D) = "white" {} _LeftTex2("2 Left (+X)", 2D) = "white" {} _RightTex2("2 Right (-X)", 2D) = "white" {} _UpTex2("2 Up (+Y)", 2D) = "white" {} _DownTex2("2 Down (-Y)", 2D) = "white" {} } SubShader{ Tags{ "Queue" = "Background" } Cull Off Fog{ Mode Off } Lighting Off Color[_Tint] Pass{ SetTexture[_FrontTex]{ combine texture } SetTexture[_FrontTex2]{ constantColor(0,0,0,[_Blend]) combine texture lerp(constant) previous } } Pass{ SetTexture[_BackTex]{ combine texture } SetTexture[_BackTex2]{ constantColor(0,0,0,[_Blend]) combine texture lerp(constant) previous } } Pass{ SetTexture[_LeftTex]{ combine texture } SetTexture[_LeftTex2]{ constantColor(0,0,0,[_Blend]) combine texture lerp(constant) previous } } Pass{ SetTexture[_RightTex]{ combine texture } SetTexture[_RightTex2]{ constantColor(0,0,0,[_Blend]) combine texture lerp(constant) previous } } Pass{ SetTexture[_UpTex]{ combine texture } SetTexture[_UpTex2]{ constantColor(0,0,0,[_Blend]) combine texture lerp(constant) previous } } Pass{ SetTexture[_DownTex]{ combine texture } SetTexture[_DownTex2]{ constantColor(0,0,0,[_Blend]) combine texture lerp(constant) previous } } } Fallback "Skybox/6 Sided", 1 }
using System.Collections; using System.Collections.Generic; using UnityEngine; public class SetWeather : MonoBehaviour { public Material sky; public Light sun; private float cloudValue = 0f; private float sunIntensity; private void SetOvercast(float value) { sky.SetFloat("_Blend", value); // sun.intensity = sunIntensity - (sunIntensity * value); } // Use this for initialization void Start () { sunIntensity = sun.intensity; } // Update is called once per frame void Update () { SetOvercast(cloudValue); cloudValue += 0.005f; } }