Загрузка данных


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