Параллакс
¶ Бесконечный параллакс
Когда пара картинок проползают перед камерой сменяя друг друга
Один из примеров (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
Чтобы не напрягать компьютер и не бояться дальних блуждающих предметов следует поделить сцену на зоны и деактивировать дальние. Активировать при приближении к ним.