using UnityEngine;
public class InfiniteBackground : MonoBehaviour
{
public Transform cameraTransform; // Сюда перетащим Main Camera
private float viewZone = 10f; // Зона видимости (на сколько камера должна отойти)
private float backgroundSize; // Ширина одного куска фона
private Transform[] layers; // Сюда автоматически запишутся два наших куска
private int leftIndex;
private int rightIndex;
void Start()
{
// Находим камеру, если забыли привязать в инспекторе
if (cameraTransform == null)
cameraTransform = Camera.main.transform;
// Считаем ширину картинки по Sprite Renderer
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()
{
// Если камера ушла вправо дальше, чем крайний левый кусок
if (cameraTransform.position.x > (layers[rightIndex].transform.position.x - viewZone))
{
ScrollRight();
}
}
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;
}
}
}