Параллакс

Бесконечный параллакс

Когда пара картинок проползают перед камерой сменяя друг друга

Один из примеров (eng)

https://www.youtube.com/watch?v=AoRBZh6HvIk

Скрипты

Базовая идея. Взято отсюда.

using UnityEngine;

public class ParallaxController : MonoBehaviour
{
    private float length, startpos;
    public GameObject cam;
    public float parallaxEffect;

    void Start()
    {
        startpos = transform.position.x;
        length = GetComponent<SpriteRenderer>().bounds.size.x;
    }

    void Update()
    {
        float temp = (cam.transform.position.x * (1 - parallaxEffect));
        float dist = (cam.transform.position.x * parallaxEffect);

        transform.position = new Vector3(startpos + dist, transform.position.y, transform.position.z);

        if (temp > startpos + length) startpos += length;
        else if (temp < startpos - length) startpos -= length;
    }
}

Для зацикливания картинок

void Update()
{
    float temp = (cam.transform.position.x * (1 - parallaxEffect));
    float dist = (cam.transform.position.x * parallaxEffect);

    transform.position = new Vector3(startpos + dist, transform.position.y, transform.position.z);

    if (temp > startpos + length) startpos += length;
    else if (temp < startpos - length) startpos -= length;
}

 


Ещё вариант с реддит https://www.reddit.com/r/Unity2D/comments/13qssmf/how_i_achieved_a_nice_parallax_effect/

public class Parallax : MonoBehaviour
{
    public const float LARGE_NUMBER = 10000f;

    [SerializeField] float perceivedDistance = 10f;
    [SerializeField] bool onlyParallaxOnX = false;

    [SerializeField] float minXDelta = -LARGE_NUMBER;
    [SerializeField] float maxXDelta = LARGE_NUMBER;
    [SerializeField] float minYDelta = -LARGE_NUMBER;
    [SerializeField] float maxYDelta = LARGE_NUMBER;

    public float minX;
    public float maxX;
    public float minY;
    public float maxY;

    private Vector3 startingPosition;
    private Transform mainCamera;
    private Transform thisTransform;

    void Awake()
    {
        mainCamera = Camera.main.transform;
        thisTransform = transform;
       
        startingPosition = thisTransform.position;
        minX = minXDelta + startingPosition.x;
        maxX = maxXDelta + startingPosition.x;
        minY = minYDelta + startingPosition.y;
        maxY = maxYDelta + startingPosition.y;
    }


    void Update() 
    {
        var inverseOfDistance = 1f / perceivedDistance;
        var deltaChange = (mainCamera.position - startingPosition) * inverseOfDistance;
        var newX = mainCamera.position.x - deltaChange.x;
        var newY = onlyParallaxOnX ? thisTransform.position.y : mainCamera.position.y - deltaChange.y;
        var newPosition = new Vector3(
                Mathf.Min(Mathf.Max(newX, minX), maxX),
                Mathf.Min(Mathf.Max(newY, minY), maxY),
                thisTransform.position.z);
        thisTransform.position = Vector2.Lerp(thisTransform.position, newPosition, Time.deltaTime * 100);
    }
}

 


SetActive

Чтобы не напрягать компьютер и не бояться дальних блуждающих предметов следует поделить сцену на зоны и деактивировать дальние. Активировать при приближении к ним.