using UnityEngine;
public class InfiniteBackground : MonoBehaviour
{
public Transform cameraTransform;
private float backgroundSize;
private Transform[] layers;
private int leftIndex;
private int rightIndex;
// Запас в пикселях/юнитах, чтобы фон перепрыгивал глубоко за экраном
private float buffer = 3f;
void Start()
{
if (cameraTransform == null)
cameraTransform = Camera.main.transform;
// Считаем ширину одного куска
backgroundSize = GetComponentInChildren<SpriteRenderer>().bounds.size.x;
// Собираем дочерние куски фона
layers = new Transform[transform.childCount];
for (int i = 0; i < transform.childCount; i++)
{
layers[i] = transform.GetChild(i);
}
leftIndex = 0;
rightIndex = layers.Length - 1;
}
void Update()
{
// Получаем половину ширины камеры, чтобы знать, где её края
float cameraHalfWidth = Camera.main.orthographicSize * Camera.main.aspect;
// Проверяем правый край: если камера подходит к правому краю правого куска
if (cameraTransform.position.x + cameraHalfWidth > layers[rightIndex].position.x - buffer)
{
ScrollRight();
}
// Проверяем левый край: если камера подходит к левому краю левого куска
if (cameraTransform.position.x - cameraHalfWidth < layers[leftIndex].position.x + buffer)
{
ScrollLeft();
}
}
private void ScrollRight()
{
// Переносим самый левый кусок направо
layers[leftIndex].position = new Vector3(layers[rightIndex].position.x + backgroundSize, layers[leftIndex].position.y, layers[leftIndex].position.z);
rightIndex = leftIndex;
leftIndex++;
if (leftIndex == layers.Length)
{
leftIndex = 0;
}
}
private void ScrollLeft()
{
// Переносим самый правый кусок налево
layers[rightIndex].position = new Vector3(layers[leftIndex].position.x - backgroundSize, layers[rightIndex].position.y, layers[rightIndex].position.z);
leftIndex = rightIndex;
rightIndex--;
if (rightIndex < 0)
{
rightIndex = layers.Length - 1;
}
}
}