Динамический скайбокс
1) Импортируйте изображения для скайбокса. Отлично подойдут скайбоксы с сайта www.93i.de. (TropicalSunnyDay и DarkStormy) или другие скайбоксы, между которыми будет осуществляться плавный переход.
2) Выбрать каждое изображение текстуры и в инспекторе в списке Wrap Mode выбрать вариант Clamp.
3) Создайте новый материал. Правой кнопкой мыши в папке ассетов, Create->Material. В меню Shader этого материала выбрать вариант Skybox ->6-Sided.
4) Перетащите в ячейки этого материла текстуры из первого скайбокса.
5) На главной панели открыть вкладку Window->Lightning. В поле скайбокс в этой вкладке перетащить новый созданный материал с текстурами скайбокса.
6) Проверить, запустив приложение, отображается ли новый скайбокс.
7) Создайте еще один скайбокс, только для DarkStormy (второго скайбокса).
8) Создаём свой шейдер (в нем и будут смешиваться 2 скайбокса). Для этого вызываем Create->Shader. Называем его SkyboxBlended. Дважды по нему кликаем, чтобы открылся код.
9) К шейдеру добавляем следующий код:
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 } |
10) Перетащите внутри папки созданный шейдер на материал (например материал первого созданного скайбокса). Выбрав в этот материал с новым шейдером можно обнаружить 12 полей для текстур. Первые 6 соответственно заполняем текстурами первого, остальные 6 текстурами второго скайбокса. Также в инспекторе шейдера можно увидеть параметр Blend, который принимает значения от 0 до 1. Этот параметр и осуществляет переход от одного скайбокса к другому, где 0 – чисто первый скайбокс, а 1 – чисто второй скайбокс.
11) Создаем пустой объект на сцене и называем его Controller. Создаем новый скрипт WeatherController:
using UnityEngine; using System.Collections; public class WeatherController: MonoBehaviour { [SerializeField] private Material sky; //материал с вашим шейдером [SerializeField] private Light sun;//главный источник освещения private float _fullIntensity;//интенсивность освещения private float _cloudValue = 0f;//облочность bool todark = true;//определяем улучшаем или ухудшаем погоду void Start() { _fullIntensity = sun.intensity;//принимаем исходную интенсивность за максимальную } void Update() { SetOvercast(_cloudValue);//вызываем функцию смены погоды, передавая значение //облачности if (todark && _cloudValue < 1) _cloudValue +=.0005f;//если ухудшаем погоду //то увеличиваем облачность else if (todark) todark = false;//когда достигли максимального значения, //начинаем улучшать погоду if (!todark && _cloudValue > 0) _cloudValue -=.0005f;//улучшаем погоду else if (!todark) todark = true; } private void SetOvercast(float value) { sky.SetFloat("_Blend", value);//устанавливаем в материале параметр blend //также как и облачность на сцене sun.intensity = _fullIntensity - (_fullIntensity * value);//устанавливаем интенсивность освещения в зависимости от облачности } } |
12) Помещаем скрипт WeatherController на пустой объект Controller и проверяем, как циклично меняется погода не сцене. Не забываем в инспекторе указать для скрипта WeatherController источник освещения и материал.