Jump to content

Unity динамически сменить день на ночь


Recommended Posts

Unity динамически сменить день на ночь! Мощный пак Unity3d для смены суток с большим количеством настроек. Динамическая смена дня и ночи позволяет видеть закаты и рассветы, появляются звезды. Небесные тела и объекты движутся согласно реальному поведению - облака плывут по небу по ветру, Солнце и Луна двигаются, как должны, звезды также вращаются по небосклону. Можно задать продолжительность суток, изменение освещенности со временем. Включить и выключить Солнце или Луну.

 

Unity-пак для динамической смены дня и ночи. Особенности:

  • дневное небо плавно сменяется на ночное
  • расчет продолжительности дня, положения солнца и луны в зависимости от часа, дня и года
  • движущиеся облака, звезды, Луна и Солнце
  • настройки всего и вся
  • осадки и атмосферные явления (вроде, я не тестил пока)
  • вы можете сохранить и загрузить настройки через файл .xml

Скачать пак Time of Day - Dynamic Sky Dome v3.0.0https://yadi.sk/d/rcGt4Tkb3Y69ph или зеркало.

 

Сокращенный перевод официальной инструкции с моими дополнениями:

Time of Day - Dynamic Sky Dome v3.0.0

Unity3d-пакет для визуализации реалистичных динамических куполов неба с дневным и ночным циклом, реалистичными объектами на небе, динамическими (движущимися) облаками и атмосферным рассеянием.

Какие-то понты:

Спойлер

 

Небо в Unity-паке смены дня и ночи:

  • Затенение неба на физической основе
  • Лучи от Солнца и Луны
  • Воздушная перспектива

Освещение:

  • Поддержка PBR и HDR
  • Рассеянный свет и отражение в реальном времени

Облака:

  • Тени от облаков на физической основе
  • Движущиеся облака по небу
  • Регулируемая скорость облаков и направление ветра

Настройка скайбокса в зависимости от времени и местоположение на планете:

  • Плавно сменяемый дневной и ночной цикл
  • В настройках можно указать долготу, широту и часовые пояса
  • Реалистичное положение солнца и фаз Луны
  • Реалистичные Звездные созвездия

Системные требования:

  • оптимизированные шейдеры и скрипты
  • shader model 2.0
  • все платформы
  • прямой и отложенный рендеринг
  • рендеринг HDR и LDR
  • VR 

 

Как установить динамическую смену дня и ночи в unity3d

  1. Сделайте бекап вашего проекта на всякий случай.
  2. Распакуйте ассет-пак в ваш проект Unity, при запросе API Update Required нажмите "I Made a Backup, Go Ahead!".
  3. Отключите свой Directional light в иерархии, уберите skybox из вкладки Windows>Lightning>Settings>Scene>Skybox Material (выберите none).
  4. Перетащите prefab "Time of Day/Prefabs/Sky Dome" в сцену.
  5. Выставите масштаб и позицию префаба  так, чтобы он охватывал всю сцену (т.е. поместите сцену в шар-неба).
  6. Добавьте скрипт Time of Day Camera в свою основную камеру (Add Component - > Time of Day - > Camera Main Script)
  7. По желанию добавьте любой из дополнительных скриптов к основной камере (Add Component - > Time of Day - > ).
  8. Можно включить или отключить любые дочерние объекты на сцене в префабе Sky dome (там солнце, луна, облака и прочее)
  9. В родительском объекте Sky Dome на сцене куча настроек, теребонькайте их, пока не получите нужный результат!
Link to post
Share on other sites
 

Unity3d-настройка-Дня-и-Ночи-через-UI.jpgUnity3d настройка Дня и Ночи через UI

Скачать префаб ассет AdminTV для настроек погоды через UI https://yadi.sk/d/7ApOu1Ea3Y9ReK

 

 

Этот ассет работает вместе с Time of Day - Dynamic Sky Dome v3.0.0, он позволяет настраивать параметры погоды через монитор, находящийся на игровой сцене. Для установки необходимо вытащить на сцену префаб AdminTV, в его переменных указать ссылки на Sky Dome, и некоторые его внутренние объекты в иерархии.

 

Превью скрипта (но одного скрипта мало, в префабе куча кнопочек и слайдеров):

Спойлер

 


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; // не забываем подключать для скриптов работающих с UI
using System; //для перевода из одного типа переменных в другой (вроде)

public class AdminTV : MonoBehaviour
{
    [Header("Перетяните объекты:")]
    // основной объект, на котором настройки Sky Dome
    [Tooltip("Главный объект из иерархии префаба Time of Day")]
    public GameObject skyDome;

    // объекты из иерархии префаба Sky Dome
    [Tooltip("луна - объект из иерархии префаба Time of Day")]
    public GameObject prefMoon; // луна
    [Tooltip("облака - объект из иерархии префаба Time of Day")]
    public GameObject prefClouds; // облака
    [Tooltip("атмосфера - объект из иерархии префаба Time of Day")]
    public GameObject prefAtmosphere; // атмосфера
    [Tooltip("солнце - объект из иерархии префаба Time of Day")]
    public GameObject prefSun; // солнце
    [Tooltip("космос - объект из иерархии префаба Time of Day")]
    public GameObject prefSpace; // космос какой-то
    [Tooltip("свет - объект из иерархии префаба Time of Day")]
    public GameObject prefLight; // свет

    // переменные для ссылок на компоненты-скрипты на основном объекте
    TOD_Sky _TOD_Sky;
    TOD_Time _TOD_Time;
    TOD_Animation _TOD_Animation;
    TOD_Weather _TOD_Weather;

    [Header("Эти трогать не надо:")]
    public Slider _sliderTime; // слайдер скорость смены суток
    public Slider _sliderCloud; // слайдер скорость облаков
    public Slider _sliderLatitude; // слайдер латитуды (широты)
    public Slider _sliderLongitude; // слайдер долготы
    public Slider _sliderUTC; // слайдер UTC

    // слайдеры настройки атмосферы
    public Slider _sliderAtmMieMultiplier; // хз что за ми, что-то вроде рассеивания лучей
    public Slider _sliderAtmBrightness; // яркость
    public Slider _sliderAtmContrast; // контраст неба
    public Slider _sliderAtmDirectionaly; // опять что-то вроде рассеивание лучей от солнца
    public Slider _sliderAtmFogginess; // туман

    public Slider _sliderWeatherFadeTime; // слайдер скорости смены погоды

    // для вывода на экран часов, дня и месяца
    public Text textHours;
    public Slider _sliderHours;
    public Text textDays;
    public Slider _sliderDays;
    public Text textMonths;
    public Slider _sliderMonths;

    public Text textHelloUser; // текст привествия на экране

    void Start()
    {
        // ссылка на главный объект с настройками
        if (skyDome == null) Debug.LogAssertion("Перетяните в инспекторе Sky Dome, без него работа невозможна!");

        // проверка объектов из иерархии префаба Sky Dome
        if (prefMoon == null) Debug.Log("Перетяните в инспекторе в поле prefMoon соответсвующий объект из Sky Dome");
        if (prefClouds == null) Debug.Log("Перетяните в инспекторе в поле prefClouds соответсвующий объект из Sky Dome");
        if (prefAtmosphere == null) Debug.Log("Перетяните в инспекторе в поле prefAtmosphere соответсвующий объект из Sky Dome");
        if (prefSun == null) Debug.Log("Перетяните в инспекторе в поле prefSun соответсвующий объект из Sky Dome");
        if (prefSpace == null) Debug.Log("Перетяните в инспекторе в поле prefSpace соответсвующий объект из Sky Dome");
        if (prefLight == null) Debug.Log("Перетяните в инспекторе в поле prefLight соответсвующий объект из Sky Dome");

        // если компонент скрипта есть на объекте, то получаем ссылку, иначе выводим ошибку
        if (skyDome.GetComponent<TOD_Sky>() != null) _TOD_Sky = skyDome.GetComponent<TOD_Sky>(); else Debug.LogAssertion("Скрипта TOD_Sky нет на Sky Dome");
        if (skyDome.GetComponent<TOD_Time>() != null) _TOD_Time = skyDome.GetComponent<TOD_Time>(); else Debug.LogAssertion("Скрипта TOD_Time нет на Sky Dome");
        if (skyDome.GetComponent<TOD_Animation>() != null) _TOD_Animation = skyDome.GetComponent<TOD_Animation>(); else Debug.LogAssertion("Скрипта _TOD_Animation нет на Sky Dome");
        if (skyDome.GetComponent<TOD_Weather>() != null) _TOD_Weather = skyDome.GetComponent<TOD_Weather>(); else Debug.LogAssertion("Скрипта_TOD_Weather нет на Sky Dome");

        // проверка, не потеряли ли ссылки на UI элементы экрана
        if (_sliderTime == null) Debug.Log("Установите в настройках слайдер - скорость смены суток");
        if (_sliderCloud == null) Debug.Log("Установите в настройках слайдер - скорость облаков");
        if (_sliderLatitude == null) Debug.Log("Установите в настройках слайдер - латитуды (широты)");
        if (_sliderLongitude == null) Debug.Log("Установите в настройках слайдер - долготы");
        if (_sliderUTC == null) Debug.Log("Установите в настройках слайдер - UTC");

        // проверка слайдеров настройки атмосферы
        if (_sliderAtmMieMultiplier == null) Debug.Log("Установите в настройках слайдер - _sliderAtmMieMultiplier");
        if (_sliderAtmBrightness == null) Debug.Log("Установите в настройках слайдер - яркость _sliderAtmBrightness");
        if (_sliderAtmContrast == null) Debug.Log("Установите в настройках слайдер - контраст неба _sliderAtmContrast");
        if (_sliderAtmDirectionaly == null) Debug.Log("Установите в настройках слайдер - рассеивание лучей от солнца _sliderAtmDirectionaly");
        if (_sliderAtmFogginess == null) Debug.Log("Установите в настройках слайдер - туман _sliderFogginess");

        // проверка слайдер скорости смены погоды
        if (_sliderWeatherFadeTime == null) Debug.Log("Установите в настройках слайдер скорости смены погоды - _sliderWeatherFadeTime");

        // проверка есть ли тексты UI для вывода часов, дней и месяцев
        if (textHours == null) Debug.Log("Перетяните в инспекторе в поле textHours текст с UI");
        if (textDays == null) Debug.Log("Перетяните в инспекторе в поле textDays текст с UI");
        if (textMonths == null) Debug.Log("Перетяните в инспекторе в поле textMonths текст с UI");

        // устанавливаем слайдеры по значению переменных, на которые они указывают
        _sliderTime.value = _TOD_Time.DayLengthInMinutes;
        _sliderCloud.value = _TOD_Animation.WindSpeed;
        _sliderLatitude.value = _TOD_Sky.World.Latitude;
        _sliderLongitude.value = _TOD_Sky.World.Longitude;
        _sliderUTC.value = _TOD_Sky.World.UTC;

        _sliderAtmMieMultiplier.value = _TOD_Sky.Atmosphere.MieMultiplier;
        _sliderAtmBrightness.value = _TOD_Sky.Atmosphere.Brightness;
        _sliderAtmContrast.value = _TOD_Sky.Atmosphere.Contrast;
        _sliderAtmDirectionaly.value = _TOD_Sky.Atmosphere.Directionality;
        _sliderAtmFogginess.value = _TOD_Sky.Atmosphere.Fogginess;

        // проверка текста приветствия и задание его переменной текста
        if (textHelloUser == null) Debug.Log("Перетяните в инспекторе в поле textHelloUser текст с UI");
        textHelloUser.text = "Hello, " + Environment.UserName + "!";
    }

void Update()
    {
        // обновляем на UI тексты и слайдеры часов, дней и месяцев
        textHours.text = _TOD_Sky.Cycle.Hour.ToString("G4"); // с форматированием стандартных числовых типов, чтобы 12.51, а не 12.5124574
                                                             // https://docs.microsoft.com/ru-ru/dotnet/standard/base-types/standard-numeric-format-strings
        textDays.text = _TOD_Sky.Cycle.Day.ToString(); // дни текст и слайдер
        textMonths.text = _TOD_Sky.Cycle.Month.ToString(); // месяцы текст и слайдер
    }

    // функции для слайдеров
    public void TimeFromSlider() { _TOD_Time.DayLengthInMinutes = _sliderTime.value; } // смена скорости суток по слайдеру
    public void SpeedCloudFromSlider() { _TOD_Animation.WindSpeed = _sliderCloud.value; } // смена скорости облаков по слайдеру
    public void LatitudeFromSlider() { _TOD_Sky.World.Latitude = _sliderLatitude.value; } // широта
    public void LongitudeFromSlider() { _TOD_Sky.World.Longitude = _sliderLongitude.value; } // долгота
    public void UTCFromSlider() { _TOD_Sky.World.UTC = _sliderUTC.value; } // UTC

    // функции настройки атмосферы по слайдерам
    public void AtmosMieMultiplier() { _TOD_Sky.Atmosphere.MieMultiplier = _sliderAtmMieMultiplier.value; }
    public void AtmosBrightness() { _TOD_Sky.Atmosphere.Brightness = _sliderAtmBrightness.value; }
    public void AtmosContrast() { _TOD_Sky.Atmosphere.Contrast = _sliderAtmContrast.value; }
    public void AtmosDirectionality() { _TOD_Sky.Atmosphere.Directionality = _sliderAtmDirectionaly.value; }
    public void AtmosFogginess() { _TOD_Sky.Atmosphere.Fogginess = _sliderAtmFogginess.value; }

    // вкл/выкл всей системы Time of Day
    public void OnOffTOD() { skyDome.SetActive(!skyDome.activeInHierarchy); }

    // вкл/выкл объеков из иерархии префаба Sky Dome
    public void OnOffprefMoon() { prefMoon.SetActive(!prefMoon.activeInHierarchy); }
    public void OnOffprefClouds() { prefClouds.SetActive(!prefClouds.activeInHierarchy); }
    public void OnOffprefAtmosphere() { prefAtmosphere.SetActive(!prefAtmosphere.activeInHierarchy); }
    public void OnOffprefSun() { prefSun.SetActive(!prefSun.activeInHierarchy); }
    public void OnOffprefSpace() { prefSpace.SetActive(!prefSpace.activeInHierarchy); }
    public void OnOffprefLight() { prefLight.SetActive(!prefLight.activeInHierarchy); }

    // активация погоды
    public void WeatherClear() { _TOD_Weather.Weather = TOD_WeatherType.Clear; } // чистая
    public void WeatherDust() { _TOD_Weather.Weather = TOD_WeatherType.Dust; } // пыльная
    public void WeatherFog() { _TOD_Weather.Weather = TOD_WeatherType.Fog; } // туманная
    public void WeatherStorm() { _TOD_Weather.Weather = TOD_WeatherType.Storm; } // шторм
    public void WeatherFadeTime() { _TOD_Weather.FadeTime = _sliderWeatherFadeTime.value; } // скорость смены погоды

    public void FogOnOff()    {        RenderSettings.fog = !RenderSettings.fog;    } // туман вкл/выкл

    // настройка часов, дней и месяцев слайдерами
    public void ClockHours ()    {        _TOD_Sky.Cycle.Hour = _sliderHours.value;    }
    public void ClockDays()    {        _TOD_Sky.Cycle.Day = (Int32)_sliderDays.value;    }
    public void ClockMonths()    {        _TOD_Sky.Cycle.Month = (Int32)_sliderMonths.value;    }
}

 

 

 

 

Link to post
Share on other sites
 
 

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now

Powered by Invision Community
Поддержка Invision Community в России

×
  • Create New...