SummerGame/Assets/Scripts/TextureAtlasSliderController.cs

82 lines
3.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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