using UnityEngine; using UnityEngine.UI; // Обязательно для работы со Slider public class TextureAtlasSliderController : MonoBehaviour { [Header("Ссылки на объекты")] [SerializeField] private Renderer targetRenderer; // Модель, на которой меняем текстуру [SerializeField] private Slider sliderX; // Слайдер для смещения по оси X [SerializeField] private Slider sliderY; // Слайдер для смещения по оси Y [Header("Масштаб текстуры (Tiling)")] [SerializeField] private Vector2 tiling = new Vector2(0.5f, 0.5f); // Например, 0.5 для сетки 2х2 private Material targetMaterial; void Start() { // Если рендерер не назначен вручную, пытаемся найти его на этом же объекте if (targetRenderer == null) { targetRenderer = GetComponent(); } if (targetRenderer != null) { // Кешируем материал, чтобы не создавать копии в памяти каждый кадр targetMaterial = targetRenderer.material; // Устанавливаем начальный масштаб (Tiling) targetMaterial.mainTextureScale = tiling; } // Настраиваем слайдер X if (sliderX != null) { sliderX.minValue = 0f; sliderX.maxValue = 1f; // Подписываемся на событие изменения значения слайдера sliderX.onValueChanged.AddListener(OnOffsetXChanged); // Устанавливаем начальное положение слайдера под текущее смещение материала sliderX.value = targetMaterial != null ? targetMaterial.mainTextureOffset.x : 0f; } // Настраиваем слайдер Y if (sliderY != null) { sliderY.minValue = 0f; sliderY.maxValue = 1f; sliderY.onValueChanged.AddListener(OnOffsetYChanged); sliderY.value = targetMaterial != null ? targetMaterial.mainTextureOffset.y : 0f; } } // Метод вызывается автоматически при движении слайдера X private void OnOffsetXChanged(float value) { if (targetMaterial != null) { Vector2 currentOffset = targetMaterial.mainTextureOffset; currentOffset.x = value; targetMaterial.mainTextureOffset = currentOffset; } } // Метод вызывается автоматически при движении слайдера Y private void OnOffsetYChanged(float value) { if (targetMaterial != null) { Vector2 currentOffset = targetMaterial.mainTextureOffset; currentOffset.y = value; targetMaterial.mainTextureOffset = currentOffset; } } private void OnDestroy() { // Отписываемся от событий при уничтожении объекта во избежание утечек памяти if (sliderX != null) sliderX.onValueChanged.RemoveListener(OnOffsetXChanged); if (sliderY != null) sliderY.onValueChanged.RemoveListener(OnOffsetYChanged); } }