using UnityEngine;
using UnityEngine.UI; // Добавлено для работы с Image/Renderer
public class EnvironmentManager : MonoBehaviour
{
[Header("Ссылки на объекты сцены")]
[SerializeField] private Light directionalLight;
[SerializeField] private Material waterMaterialIsland;
[SerializeField] private Material waterMaterialOcean;
[Tooltip("Все CursorAnimator на сцене (по одному на каждого игрока)")]
[SerializeField] private CursorAnimator[] cursorAnimators;
[Header("Пресеты окружения")]
[SerializeField] private EnvironmentPreset[] presets;
private int _currentPresetIndex = -1;
[System.Serializable]
public class EnvironmentPreset
{
public string name; // Для удобства в инспекторе
public Material skybox;
public Color lightColor = Color.white;
[Range(0, 8)] public float lightIntensity = 1.0f;
[Header("Вода (Остров)")]
public Color waterShallowColorIsland;
public Color waterDeepColorIsland;
public Color waterFresnelColorIsland;
[Header("Вода (Океан)")]
public Color waterShallowColorOcean;
public Color waterDeepColorOcean;
public Color waterFresnelColorOcean;
[Header("UI Курсор")]
public Color cursorFreeColor = new Color(0.1f, 1f, 0.1f, 0.85f);
public Color cursorBlockedColor = new Color(1f, 0.1f, 0.1f, 0.85f);
}
private void Start()
{
// Подписываемся на событие изменения настроек
if (SettingsManager.instance != null)
{
SettingsManager.instance.OnSettingsChanged.AddListener(OnSettingsChanged);
}
// Устанавливаем начальное состояние
OnSettingsChanged();
}
private void OnDestroy()
{
// Отписываемся от события
if (SettingsManager.instance != null)
{
SettingsManager.instance.OnSettingsChanged.RemoveListener(OnSettingsChanged);
}
}
private void OnSettingsChanged()
{
if (SettingsManager.instance == null) return;
string timeOfDay = SettingsManager.instance.GetSettingValue("Игровая тема");
if (timeOfDay == "День")
{
SwitchToPreset(0);
}
else if (timeOfDay == "Ночь")
{
SwitchToPreset(1);
}
else if(timeOfDay == "День_2")
{
SwitchToPreset(2);
}
}
///
/// Переключает на следующий пресет в массиве.
///
public void SwitchToNextPreset()
{
if (presets == null || presets.Length == 0) return;
int nextIndex = (_currentPresetIndex + 1) % presets.Length;
SwitchToPreset(nextIndex);
}
///
/// Переключает на пресет по указанному индексу.
///
public void SwitchToPreset(int index)
{
if (presets == null || index < 0 || index >= presets.Length)
{
Debug.LogWarning("Неверный индекс пресета или массив пресетов пуст.");
return;
}
ApplyPreset(presets[index]);
_currentPresetIndex = index;
}
///
/// Мгновенно применяет все параметры из указанного пресета.
///
private void ApplyPreset(EnvironmentPreset preset)
{
if (directionalLight != null)
{
directionalLight.color = preset.lightColor;
directionalLight.intensity = preset.lightIntensity;
}
if (preset.skybox != null)
RenderSettings.skybox = preset.skybox;
if (waterMaterialIsland != null)
{
waterMaterialIsland.SetColor("_ShallowColor", preset.waterShallowColorIsland);
waterMaterialIsland.SetColor("_DeepColor", preset.waterDeepColorIsland);
waterMaterialIsland.SetColor("_FresnelColor", preset.waterFresnelColorIsland);
}
if (waterMaterialOcean != null)
{
waterMaterialOcean.SetColor("_ShallowColor", preset.waterShallowColorOcean);
waterMaterialOcean.SetColor("_DeepColor", preset.waterDeepColorOcean);
waterMaterialOcean.SetColor("_FresnelColor", preset.waterFresnelColorOcean);
}
if (cursorAnimators != null)
foreach (var ca in cursorAnimators)
if (ca != null)
ca.SetColors(preset.cursorFreeColor, preset.cursorBlockedColor);
}
}