Как сделать зеркало в игре?

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


Приступим к делу. Создаем GameObject > UI > Canvas и сразу настраиваем, в параметре Render Mode выбираем режим World Space, теперь мы можем перемещать UI как обычный игровой объект, так же ширину width и высоту height ставим на 1.



Далее, в любой папке проекта правый клик > Create > Render Texture, переименуем в Mirror Texture, эту текстуру будет использовать камера для вывода изображения. Настроим ее, добавим немного сглаживания Anti-Aliasing например:

Как сделать зеркало в игре?

Возвращаемся к зеркалу. Выбираем Canvas и добавим в него GameObject > UI > Raw Image переименуем в Mirror, здесь мы подключаем ранее созданную текстуру Render Texture.


Добавим на сцену новую камеру и удаляем у нее компонент Audio Listener, саму камеру делаем дочерней Canvas и сбрасываем позицию по нулям, чтобы выровнять по центру. Mirror Texture перетаскиваем в поле Target Texture, должно появится изображение.

Итак, чтобы сделать зеркало например, круглым, рисуем в каком-нибудь редакторе круг любого цвета на прозрачном фоне, допустим:


И сохраняем в формате PNG.

Теперь в Canvas добавим GameObject > UI > Image и переименуем в Mask, настройки трансформа такие же как и у Mirror, а в качестве источника изображение берем спрайт нарисованного круга. Дополнительно на объект вешаем компонент маску Add Component > UI > Mask, чтобы маска работала, нужно Mirror сделать дочерним к Mask.

Почти готово, остался последний штрих. Добавляем на сцену пустой объект, к нему компонент Sprite Renderer, без спрайта, просто один компонент. Делаем объект дочерним к Canvas и сбрасываем позицию по нулям, плюс цепляем на него небольшой скрипт Mirror:

using UnityEngine;
using System.Collections;

public class Mirror : MonoBehaviour {

	public Camera _camera;
	public int textureSize = 500;

	void Awake () 
	{
		_camera.targetTexture.width = textureSize;
		_camera.targetTexture.height = textureSize;
	}

	void OnBecameVisible () 
	{
		_camera.enabled = true;
	}
	
	void OnBecameInvisible () 
	{
		_camera.enabled = false;
	}
}

Тут мы подключаем камеру нашего зеркала. И выбираем разрешение для текстуры.

Собственно всё, остальное на усмотрение.

Скачать уже готовый проект:

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

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

Офлайн
Только зеркало не так работает немного %)

Стоило бы при видимости камеры, считать угол между персонажом и зеркалом, и поворачивать камеру зеркала на этот угол. https://phys-ege.sdamgia.ru/get_file?id=18416
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
  • Яндекс.Метрика