Ручное управление расстоянием просмотра в игре, но только выборочное применение его к объектам

В настоящее время я работаю над игрой с открытым миром, поэтому мне нужно немного оптимизировать ее, потому что многое нужно отрисовать. В игре я вручную задаю расстояние просмотра, чтобы скрыть объекты, находящиеся далеко (для экономии времени рендеринга). Однако я хочу, чтобы некоторые объекты были скрыты таким образом.

Чтобы определить, какие объекты должны иметь такое поведение, я в настоящее время думаю о добавлении нового типа настройки Static (в раскрывающийся список Static на GameObject), чтобы я мог проверить, имеет ли объект эту настройку Static и должен ли он выборочно отображаться. Можно ли это сделать?


person DzoniGames    schedule 06.04.2016    source источник
comment
Что вы подразумеваете под новым... статическим? Статическая переменная? Статический метод? Пожалуйста, уточните свой вопрос, чтобы мы лучше поняли ход ваших мыслей.   -  person Serlite    schedule 06.04.2016
comment
Что вы подразумеваете под «статичностью» и «созданием расстояния просмотра»? Вы пытаетесь ограничить расстояние просмотра для игрока? В этом случае использования слоев + свойств камеры должно быть достаточно.   -  person Phil McLaren    schedule 06.04.2016
comment
Я имею в виду часть флажка Static в окне Inspector в Unity.   -  person DzoniGames    schedule 06.04.2016
comment
Конечно, решать вам, но я бы не стал полагаться на эту функцию «Статика». Может быть, я не знаю о нем чего-то невероятно важного, но для меня он кажется совершенно бесполезным. Если вы хотите иметь доступ из своего класса к некоторому статическому объекту, вы можете использовать статические классы. Можете ли вы описать, чего вы хотите достичь, используя статический объект? Возможно, мы сможем найти лучший способ обойти это.   -  person Phil McLaren    schedule 06.04.2016
comment
Я хочу проверить только некоторые объекты как ViewDistance Static, которые я назвал бы новыми статическими, и только эти объекты будут затронуты ViewDistance. Я бы использовал это, например. деревья на расстоянии. Некоторые будут отображаться, а некоторые нет, и я могу проверить, чтобы они были статичными. И я не хочу создавать скрипт для этого, потому что почти каждый объект в игре должен был бы загружать скрипт, который снижает производительность.   -  person DzoniGames    schedule 06.04.2016
comment
Вы создаете экземпляры этих статических GameObjects или они уже на месте, когда игра начинается?   -  person Serlite    schedule 06.04.2016
comment
Они уже на месте, но не будут отображаться, если они не находятся на расстоянии просмотра. Также есть 3 режима рендеринга. Мгновенно, медленно и быстро. Instant мгновенно отображает объекты при запуске игры. Fast заставляет расстояние просмотра увеличиваться до тех пор, пока не достигнет расстояния просмотра, на которое оно установлено в быстром прошлом, а медленное такое же, как быстрое, но при медленной вставке.   -  person DzoniGames    schedule 06.04.2016
comment
Также по какой-то причине это работает: GameObject.FindWithTag(environment).GetComponent.‹MeshRenderer›().enabled = false;   -  person DzoniGames    schedule 06.04.2016
comment
О, подождите, я понимаю, о чем вы говорите. Вы спрашиваете, можете ли вы добавить новый тип настройки в раскрывающийся список Static? Я не думаю, что это можно изменить. Вместо этого, как насчет создания триггерного коллайдера вокруг игрока и включения/отключения объектов окружения/рендереров (идентифицируемых через слой, тег или класс — любую гибкость, которая вам нужна), когда они входят/выходят из коллайдера? Это один из способов выборочной имитации расстояния прорисовки.   -  person Serlite    schedule 06.04.2016
comment
Я сделал это, но я хочу, чтобы это не влияло на некоторые объекты, добавляя к ним новый статический   -  person DzoniGames    schedule 06.04.2016
comment
Как насчет того, чтобы вместо этого добавить к ним класс и запустить GetComponent(), чтобы проверить, есть ли он у них? (Поскольку, как я уже сказал, я не думаю, что вы можете изменить параметры, перечисленные в раскрывающемся списке Static.) Вы можете еще больше сузить их поведение, добавив перечисление в класс, если это необходимо. Это также даст вам больше гибкости в будущем, если вы захотите запрограммировать переход GameObjects, а не всплывающее окно.   -  person Serlite    schedule 06.04.2016
comment
Я сделаю это со сценариями. Просто надеюсь, что я не потеряю производительность. Вы должны опубликовать ответ, чтобы я мог поставить вам галочку и проголосовать :)   -  person DzoniGames    schedule 06.04.2016
comment
Конечно! Добавлен ответ. Рад, что смог помочь, надеюсь, вы сможете заставить его работать для ваших целей.   -  person Serlite    schedule 06.04.2016


Ответы (1)


Я не думаю, что вы можете изменить доступные вам параметры в раскрывающемся списке Static — они встроены в движок Unity. Однако в этом нет необходимости, так как у вас есть множество других вариантов идентификации объектов.

Похоже, вы уже пробовали использовать тег, но указали, что вам нужно больше гибкости, поэтому я предлагаю добавить класс к любым объектам окружающей среды, на которые вы хотите повлиять с помощью этого выборочного расстояния просмотра. Затем добавьте триггер-коллайдер вокруг вашего объекта игрока и запустите GetComponent(), чтобы идентифицировать объекты окружения, когда они входят в коллайдер. Включайте объекты/рендереры, когда они входят в коллайдер, и отключайте их, когда они покидают его.

Для дополнительной гибкости вы можете добавить enum к классу, чтобы объекты окружения вели себя по-разному, когда они входят в триггерный коллайдер игрока. хотите, чтобы один исчезал из прозрачного, а другой всплывал из-под земли и т. д.

Изменить:

Альтернативный подход, который я искал, — это переменная Camera.layerCullDistances, которая позволяет вам установить разные расстояния, на которых камера будет отображать слои. В зависимости от ваших требований это также может работать для вас — например, ландшафт может быть на одном слое, а деревья — на другом, поэтому на больших расстояниях вы все еще можете видеть ландшафт, но не растительность.

Этот подход должен быть дешевле, чем подход на основе классов/коллайдеров, поэтому он удобен, если вы ориентируетесь на мобильные устройства. Это (возможно) не лучший подход, если у вас есть более мощное оборудование, поскольку объекты будут всплывать / исчезать, и вы не сможете сгладить их переход в видимость.

person Serlite    schedule 06.04.2016