Часть 1 (циклическая смена погоды)




Динамический скайбокс

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 источник освещения и материал.

 


 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2018-01-08 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: