Прозрачный слой Unity
В моей сцене у меня 2 камеры (разделенный экран). можно ли изменить прозрачность слоя только для одной камеры? например, "layer1" имеет alphatrasparency = 0.5 для правой камеры, в то время как левая камера показывает "layer1" без прозрачности.
1 ответ
Якобы нет
Хотя есть способ сделать это. Это немного хакерство, так как это не зависит от физических уровней, а скорее от наличия собственного монобихворческого скрипта. Вот что я помню по этому поводу в голове (я могу выкопать реализацию позже, если потребуется).
Шаг 1: вам понадобится скрипт MonoBehaviour, прикрепленный к каждому игровому объекту, который вы хотите визуализировать по-разному. Этот скрипт абсолютно необходим.
Шаг 2: этот сценарий будет содержать одну функцию (вы можете использовать существующий сценарий поведения, если все объекты уже имеют один общий и вы можете просто добавить эту функцию в этот сценарий). Называй как хочешь, но как то AboutToBeRendered(Camera cam)
Шаг 3: создайте другой скрипт и прикрепите его к обеим камерам. Этот скрипт также будет иметь одну функцию: OnPreRender()
Шаг 4: В этом методе OnPreRender вам нужно будет сделать:
- найти все игровые объекты из шага 1
- получить их компонент с помощью метода AboutToBeRendered
- вызвать этот метод, передавая камеру в качестве параметра
Шаг 5: Написание метода AboutToBeRendered.
- определите, какая из двух камер была передана методу
- установить цвет материала, чтобы быть прозрачным или нет, по мере необходимости
OnPreRender()
вызывается только для сценариев с компонентом камеры в том же GameObject, указывающем, что эта камера собирается визуализировать сцену. Но на самом деле мы хотим, чтобы объект, который собирается визуализировать, знал, что он собирается визуализироваться и какой камерой. Вот почему нам нужен сценарий на шаге 1.
Я полагаю, что вы могли бы пропустить шаг 1 и посмотреть только на каждый объект в сцене и посмотреть на его физический слой, но выяснить это будет дороже, чем "достать мне все экземпляры этого компонента". Вместо этого вы можете сделать это на основе тега, так как FindObjectsWithTag обычно считается довольно быстрым, но если вы уже используете тег для чего-то другого, вам не повезло, и нет никакого сопоставимого метода для получения объектов в заданном физический слой.
Однако вам придется настроить альфа-значение материала в сценарии камеры, а не позволять самому объекту решать, каким оно должно быть.
В любом случае материал объекта должен поддерживать прозрачность. Когда я сделал это, я не дал объекту полностью отрисоваться, поэтому я просто отключил его компонент MeshRenderer.