Андрей
Высший разум
(460615)
1 месяц назад
Зачем ты вращаешь одновременно и Луну и Солнце? У тебя же виден только 1 объект. Перенеси вращения в тот самый if, в котором ты выставляешь Sun.intensity и Moon.intensity - Солнце в первую ветку, Луну во вторую.
Вот это вот: RenderSettings.skybox.Lerp(NightSkybox, DaySkybox, SkyboxCurve.Evaluate(TimeOfDay)); явно делает что-то лишнее, раз ты отправляешь туда и NightSkybox и DaySkybox. Почему бы не разделить на две подпрограммы: отдельно для дня и отдельно для ночи.
А лучше полностью разделить отрисовку дня и ночи. Так, чтобы любые манипуляции с Луной и ночными текстурами были только в ночное время, а любые манипуляции с Солнцем и дневными текстурами - только в дневное время.
P.S. Нет, я не специалист в Unity. Это очевидные предположения, вытекающие из вида твоего кода.
Вова ДенисовУченик (201)
1 месяц назад
RenderSettings.skybox.Lerp(NightSkybox, DaySkybox, SkyboxCurve.Evaluate(TimeOfDay)) - это для плавного изменения скайбокса дня и ночи, а отправляю я NightSkybox и DaySkybox, чтобы бралось среднее значение экспозиции относительно времени значения моей кривой на графике. Разделение у меня на день и ночь есть, и там просто изменяется яркость луны или солнца в зависимости от времени(ночь или день). Никаких манипуляций с текстурами у меня нет и по сути я лишь меняю один параметр скайбокса постоянно, чтобы переход происходил плавно, как в реальности. И код не мой, я лишь немножко адаптировал его под мою игру, но это неважно
using UnityEngine;
public class DayCycleManager : MonoBehaviour
{
[Range(0, 1)]
public float TimeOfDay;
public float DayDuration = 30f;
public AnimationCurve SunCurve;
public AnimationCurve MoonCurve;
public AnimationCurve SkyboxCurve;
public Material DaySkybox;
public Material NightSkybox;
public ParticleSystem Stars;
public Light Sun;
public Light Moon;
private float sunIntensity;
private float moonIntensity;
private void Start()
{
sunIntensity = Sun.intensity;
moonIntensity = Moon.intensity;
}
private void Update()
{
TimeOfDay += Time.deltaTime / DayDuration;
if (TimeOfDay >= 1)
{
TimeOfDay -= 1;
}
// Настройки освещения (skybox и основное солнце)
if(TimeOfDay <= 0.5f)
{
Moon.intensity = 0f;
RenderSettings.sun = Sun;
Sun.intensity = sunIntensity * SunCurve.Evaluate(TimeOfDay);
}
else
{
Sun.intensity = 0f;
RenderSettings.sun = Moon;
Moon.intensity = moonIntensity * MoonCurve.Evaluate(TimeOfDay);
}
RenderSettings.skybox.Lerp(NightSkybox, DaySkybox, SkyboxCurve.Evaluate(TimeOfDay));
DynamicGI.UpdateEnvironment();
// Прозрачность звёзд
var mainModule = Stars.main;
mainModule.startColor = new Color(1, 1, 1, 1 - SkyboxCurve.Evaluate(TimeOfDay));
// Поворот луны и солнца
Sun.transform.localRotation = Quaternion.Euler(TimeOfDay * 360f, 180, 0);
Moon.transform.localRotation = Quaternion.Euler(TimeOfDay * 360f + 180f, 180, 0);
}
}