C#

Unity. Как отключить видимость объекта в камере

Моя задача такова: я хочу через скрипт сделать так, чтобы камера не отрисовывала определённый объект, но НЕ используя теги и слои.
Шейдеры помогут решить такую задачу, ценой быстродействия и времени разработки. Но...

Вы точно понимаете, для чего нужны тэги и слои?
Тэги - инструмент для прототипирования, без них вполне можно обойтись в любом проекте, они не обеспечивают уникальных возможностей.
Слои - ключевой инструмент для решения проблемы "объект А должен игнорировать объект Б", будь то физика или рендеринг.

Как решается ваша проблема:
1) заводится СЛОЙ единственной задачей которого будет скрывать рендереры для главной камеры - этот слой исключается из Culling Mask камеры.
2) к объектам, которые могут быть сокрыты, добавляется компонент, который хранит путь в иерархии до всех скрываемых рендереров на объекте.
3) сами дочерние объекты с рендерерами не должны быть нагружены лишними логическими компонентами, чтобы изменение их слоя никак не повлияло, например, на физику (вы, полагаю, как раз этой проблемы пытаетесь избежать, отказываясь от слоёв).
4) когда выполняется условие для скрытия / раскрытия объекта, управляющий компонент выносит свои дочерние рендереры на скрытый слой, или (при раскрытии) возвращает их на изначальный слой (не обязательно Default - можно сделать чтобы компонент запоминал слои рендереров перед сокрытием).

Если решение вам не подходит, пожалуйста, объясните почему избегаете слоёв - инструмента предназначенного именно для решения таких проблем.
Руслан Кайгородов
Руслан Кайгородов
5 779
Лучший ответ
Достон Насриддинов Спасибо за ответ, способа не подходит, потому что моя задача сделать скрипт, который нужно повесить на камеру, и она без лишних действий будет игнорировать объект, созданный командой Instiantiate()
Можно по имени:
GameObject.Find("object_name").SetActive(false);

можно по ссылке
public GameObject obj = null; //<- в инспекторе перетащить нужный объект в это поле
...
obj.SetActive(false);

если не подходит деактивация объекта, можно сделать невидимым через
GetComponent < Renderer >().enabled = false;
Достон Насриддинов Спасибо за ответ, но мне требуется чуть другое, мне нужно, чтобы в главной камере он был, а во второстепенной - нет. Это решение подходит только для того, чтобы скрыть во ВСЕХ камерах.
Но при этом всё это не должно использовать слои и теги
Вадим Казанцев Можно написать постпроцессинговвый шейдер, который будет игнорировать объект по определённому параметру (по порогу цвета, например). Но шейдеры с условиями медленные, и я бы всё-таки копал в сторону тегов и слоёв. Почему именно нельзя использовать? Может обойти эту проблему будет проще...
Без слоев никак
gameObject.layer = index; // индекс слоя