82 lines
3.5 KiB
C#
82 lines
3.5 KiB
C#
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);
|
||
}
|
||
} |