Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

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

Владислав Сидельников Ученик (115), закрыт 4 года назад
Моя задача такова: я хочу через скрипт сделать так, чтобы камера не отрисовывала определённый объект, но НЕ используя теги и слои.
Лучший ответ
FF Мыслитель (5815) 4 года назад
Шейдеры помогут решить такую задачу, ценой быстродействия и времени разработки. Но...

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

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

Если решение вам не подходит, пожалуйста, объясните почему избегаете слоёв - инструмента предназначенного именно для решения таких проблем.
Владислав СидельниковУченик (115) 4 года назад
Спасибо за ответ, способа не подходит, потому что моя задача сделать скрипт, который нужно повесить на камеру, и она без лишних действий будет игнорировать объект, созданный командой Instiantiate()
FF Мыслитель (5815) Движок Unity позволяет добавить на камеру скрипты, которые бы производили действия с изображением *после* рендеринга, а вам надо *до* рендеринга сделать объект невидимым для камеры - скриптом на камере такое не делается, но у самой камеры есть параметр Culling Mask, и это именно тот параметр который позволяет игнорировать объекты. Так что, настройте маску на камере и слои на объектах - и задача решена. Насчёт избегания лишних действий, есть два пути быстро и чётко создать игнорируемый камерой объект: а) Можно вызывать Instantiate() для префаба, у которого уже заранее настроен нужный слой. б) Можно сохранить результат функции Instantiate() в виде ссылки на объект, которому затем из кода задать нужный слой - лишних действий ровно на одну строку кода.
Остальные ответы
Интернетный Червь Гуру (4208) 4 года назад
Без слоев никак
gameObject.layer = index; // индекс слоя
Xttx Мыслитель (9251) 4 года назад
Можно по имени:
GameObject.Find("object_name").SetActive(false);

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

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