Наложение background друг на друга
Делал parallax и scroll для платформера но столкнулся с проблемой наложения задних фонов друг на друга. Концепция такая, у меня 5 backround и в каждом находится свой слой, при движении персонажа левый фон перемещается вправо и наоборот. Однако что-то пошло не так и мой фон начинает накладываться друг на друга, тем самым уменьшая общий фон из 3 компонентов.
Однако двигаясь в ту или иную сторону, начинается наложение и фон уменьшается

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Parallax : MonoBehaviour
{
[SerializeField]
private float backgroundSize;
[SerializeField]
private float parallaxSpeed;
private Transform cameraTransform;
private Transform[] layers;
private float viewZone = 5;
private int leftIndex;
private int rightIndex;
private float lastCameraX;
private void Start()
{
cameraTransform = Camera.main.transform;
lastCameraX = cameraTransform.position.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;
}
private void Update()
{
float deltaX = cameraTransform.position.x - lastCameraX;
transform.position += Vector3.right * (deltaX * parallaxSpeed);
lastCameraX = cameraTransform.position.x;
if (cameraTransform.position.x < (layers[leftIndex].transform.position.x + viewZone))
{
ScrollLeft();
}
if (cameraTransform.position.x > (layers[rightIndex].transform.position.x - viewZone))
{
ScrollRight();
}
}
private void ScrollLeft()
{
int lastRight = rightIndex;
layers[rightIndex].position = Vector3.right * (layers[leftIndex].position.x - backgroundSize);
leftIndex = rightIndex;
rightIndex--;
if (rightIndex < 0 )
{
rightIndex = layers.Length - 1;
}
}
private void ScrollRight()
{
int lastLeft = leftIndex;
layers[leftIndex].position = Vector3.right * (layers[rightIndex].position.x + backgroundSize);
rightIndex = leftIndex;
leftIndex++;
if (leftIndex == layers.Length)
{
leftIndex = 0;
}
}
}
Ответы (1 шт):
Автор решения: Yaroslav
→ Ссылка
Одновременно на экране может быть только 2 изображения, поэтому нет смысла в пяти картинках, нужны только 2 меняющие спрайты.
public class ScrollBackground : MonoBehaviour
{
[SerializeField] private float _speed = 1;
[SerializeField] private SpriteRenderer[] _layers = new SpriteRenderer[2];
[SerializeField] private Sprite[] _images;
private float _spriteWidth;
private float _halfCameraWidth;
private Transform _camera;
private Transform[] _layersTransform;
private void Start ()
{
_spriteWidth = _images[0].rect.width;
Camera camera = Camera.main;
_camera = camera.transform;
float aspectRate = Screen.width/(float)Screen.height;
_halfCameraWidth = camera.orthographicSize*aspectRate;
_layersTransform = new Transform[_layers.Length];
for (int i = 0; i < _layers.Length; i++)
_layersTransform[i] = _layers[i].transform;
}
private void Update ()
{
float leftCameraBorder = _camera.position.x*_speed-_halfCameraWidth;
int layersCount = Mathf.FloorToInt(leftCameraBorder/_spriteWidth);
for (int i = 0; i < _layers.Length; i++) {
Vector3 position = _layersTransform[i].localPosition;
position.x = (layersCount+i+0.5f)*_spriteWidth;
_layersTransform[i].localPosition = position;
}
int leftSpriteIndex = layersCount%_images.Length;
for (int i = 0; i < _layers.Length; i++)
{
int spriteIndex = (leftSpriteIndex+i)%_images.Length;
_layers[i].sprite = _images[spriteIndex];
}
}
}

