Скроллинг бэкграунда [2D]

При создании двухмерной игрушки, все спрайты располагаются в одной плоскости, мы лишь настраиваем слои для каждого спрайта, чтобы, например, выдвинуть его на передний план. Однако, в этом случаи, при движении камеры, все объекты будут двигаться одинаково, даже если по задумке на заднем плане у нас какие-нибудь горы или облака. И даже если мы сдвинем вглубь, по оси «зет», такие объекты всё равно будут двигаться словно они приклеены к одной плоскости. То есть для 2D камеры в режиме ортогональной проекции, нам нужно создать эффект глубины.

Как это работает. Мы создаем фон из различных спрайтов, затем группируем их. И этот объект/группу помещаем в массив скрипта. Тоже самое делаем и с другими группами объектов. Иначе говоря мы создаем слои. Далее, отодвигаем от камеры, по оси Z каждый слой, конечный эффект будет зависеть от того, как далеко мы отодвинем слой. Всё просто.


using UnityEngine;
using System.Collections;

public class Parallax2DBackground : MonoBehaviour {

	private enum Mode
	{
		Horizontal,
		Vertical,
		HorizontalAndVertical
	}

	[SerializeField] private Transform[] backgrounds;
	[SerializeField] private float smoothing = 0.5f;
	[SerializeField] private Mode parallaxMode;

	private float[] scales;
	private Transform cam;
	private Vector3 previousCamPos;
	private Vector3 position;

	void Awake()
	{
		cam = Camera.main.transform;
	}

	void Start()
	{
		previousCamPos = cam.position;

		scales = new float[backgrounds.Length];

		for(int i = 0; i < backgrounds.Length; i++)
		{
			if(backgrounds[i] != null) scales[i] = backgrounds[i].position.z * -1;
		}
	}

	void LateUpdate()
	{
		for(int i = 0; i < backgrounds.Length; i++)
		{
			if(backgrounds[i] != null)
			{
				Vector3 parallax = (previousCamPos - cam.position) * scales[i];

				switch(parallaxMode)
				{
				case Mode.Horizontal:
					position = new Vector3(backgrounds[i].position.x + parallax.x, backgrounds[i].position.y, backgrounds[i].position.z);
					break;
				case Mode.Vertical:
					position = new Vector3(backgrounds[i].position.x, backgrounds[i].position.y + parallax.y, backgrounds[i].position.z);
					break;
				case Mode.HorizontalAndVertical:
					position = new Vector3(backgrounds[i].position.x + parallax.x, backgrounds[i].position.y + parallax.y, backgrounds[i].position.z);
					break;
				}

				backgrounds[i].position = Vector3.Lerp(backgrounds[i].position, position, smoothing * Time.deltaTime);
			}
		}

		previousCamPos = cam.position;
	}
}



Здесь так же мы можем выбрать режимы скролла, для обычного платформера, подойдет "горизонтальный" режим. В некоторых играх, камера может двигаться только по оси Y, для таких игр есть режим "вертикальный", а можно использовать и оба сразу, получив уже другой эффект.

Скачать скрипт:

Внимание! Посетители, находящиеся в группе Гости, не могут скачивать файлы.

Комментариев 13

Офлайн
ООО спасибочки за очередной урок читаю с удовольствием!
Офлайн
Макс Котъ 20 октября 2016
А по производительности как?
Офлайн
Макс Котъ 20 октября 2016
Макс Котъ,
а ещё было бы круче двигать не чётко заданные скрипту объекты, а именно те объекты, что находятся на определённом физическом или сортировочном слое. Так префабить камеру удобнее
Офлайн
Я думал, скроллинг - это прокручивание, нет?
Офлайн
подскажите пожалуйста, на какую версию юнити этот скрипт? просто при использовании cam = Camera.main.transform; IDE показывает ошибку.
Онлайн
Light 27 января 2017
Nikolay Berezuev, если Camera.main выдает ошибку, значит у камеры не установлен стандартный тег MainCamera.
Офлайн
Light,
дело в том, что тэг установлен. текст ошибки: `Camera' does not contain a definition for `main'
Ошибка была в том, что у меня имелся скрипт, названный Camera. видимо это конфликтовало с имеющимся классом камеры.
Офлайн
sony 10 апреля 2017
Подскажите пожалуйста, как скроллить фон в 2D без движения камеры?
Онлайн
Light 10 апреля 2017
sony, сделать ссылку на любой другой трансформ, например, вместо cam = Camera.main.transform сделать cam = player.transform или что-то еще.
Офлайн
jeka 12 октября 2017
Макс Котъ,
Допиши)
Офлайн
Круто, спасибо.
Офлайн
Mr_Swersik 14 февраля 2020
Что-то я немножко не понял, создал пустой объект и сгруппировал в нём несколько слоёв, как соединить это всё со скриптом?
Онлайн
Light 15 февраля 2020
Mr_Swersik, скачай демо проект, там всё показано.
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
  • Яндекс.Метрика