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
 
 

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

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

×
  • Create New...