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); } }