Unity 4 — использование AssetBundle для предварительной загрузки ресурсов, которые используются в нескольких сценах?

У меня есть несколько областей в моем игровом проекте, которые разделены на несколько сцен, например, скажем, есть первая область под названием «Подвал», которая разделена на сцены Подвал_1, Подвал_2 и Подвал_3; и еще одна область, «Чердак», разделена на чердак_1 и чердак_2.

Некоторые активы (атлас текстур и звуки) являются общими для всех сцен области, поэтому я подумал, что могу сделать AssetBundle со всеми общими активами для «Подвала» и еще один AssetBundle с общими активами для области «Чердак». . Затем, когда мой игрок собирается войти в область «Подвал», я загружаю AssetBundle «Подвал», чтобы при вызове Application.LoadLevel («Подвал_1»), Application.LoadLevel («Подвал_2») или Application.LoadLevel («Подвал_3»), общие ресурсы (которые были загружены в пакете) не перезагружаются без необходимости, будут загружены только ресурсы, относящиеся к сцене. Затем, если я дойду до точки, когда игра узнает, что активы Basement больше не нужны, или, по крайней мере, ненадолго, тогда я выгружу пакет, чтобы освободить память, и загружу любой другой пакет, который может быть уместным. (Чердак, например).

У меня вопрос: так ли это работает? Например, скажем, я собираюсь войти в «Подвал», поэтому, если я загружу свой «Подвал» AssetBundle с диска и, в основном, просто вызову LoadAllAssets() на нем, Application.LoadLevel("Basement_1") "автоматически" будет искать активы в пакете, который я загрузил? или Application.LoadLevel просто перезагрузит необходимые ресурсы заново?

Насколько я понимаю, Application.LoadLevel не будет автоматически искать в AssetBundle. Если да, то есть ли способ заставить его выглядеть в загруженном AssetBundle(s)? Есть ли другой способ, который я не вижу?

Идея состоит в том, чтобы попытаться сократить время загрузки, потому что, например, вход и выход из двери может вызвать вызов Application.LoadLevel("Подвал_X") и Application.LoadLevel("Подвал_Y") туда и обратно.

Заранее спасибо за любую информацию ;)

Ваше здоровье!


person Shikamu    schedule 18.06.2015    source источник


Ответы (1)


Asset Bundles можно использовать так, как вы предлагаете, но в основном они используются для решения проблемы загрузки контента с сервера. По сути, если вы не планируете ничего скачивать, у вас не так уж много причин для использования пакетов ресурсов.

С другой стороны, Prefabs кажется тем, что вам нужно. Это игровые объекты, которые вы «упаковываете» в префаб, который можно использовать повторно. Если вы хотите повторно использовать игровой объект в одной и той же сцене или в разных сценах, сборные — это то, что вам нужно.

Если вы программно создаете экземпляры и позиционируете игровые объекты, вы должны сделать это:

GameObject myItem = Instantiate(Resources.Load("myPrefab")) as GameObject;

Учитывая, что myPrefab — это префаб внутри папки с именем Resources.

Если вы создаете свои сцены в редакторе, вы просто перетаскиваете префабы на сцену, они становятся обычными игровыми объектами.

Вы можете оптимизировать использование игровых объектов между сценами, используя Object.DontDestroyOnLoad, чтобы предотвратить уничтожение объектов. . Я настоятельно рекомендую вам использовать его только в том случае, если они абсолютно не меняются. Такая преждевременная оптимизация (повторного использования объектов) потенциально может вызвать непредвиденные проблемы и задержать разработку вашей игры.

Тем не менее, также имейте в виду, что если вы сохраните ссылку на загруженный префаб, набор ресурсов, игровой объект или что-то еще, он никогда не будет удален сборщиком мусора, поэтому вы можете использовать Object.DontDestroyOnLoad и/или статические ссылки, чтобы хранить их в памяти. .

person Roberto    schedule 19.06.2015
comment
Спасибо за ответ. Я не уверен, что префаб — это то, что мне нужно, я понимаю, что префабы можно использовать повторно, но если я повторно использую префаб в нескольких сценах, конечно, когда я вызываю Application.LoadLevel в этих новых сценах, активы, содержащиеся в префабе перезагрузится, да? Поскольку, насколько я понимаю, Application.LoadLevel выгрузит текущую сцену (включая используемые префабы?) и загрузит новые сцены. И именно этого я хочу избежать в случае общих объектов между сценами: я хочу загрузить их только один раз. - person Shikamu; 19.06.2015
comment
DontDestroyOnLoad предотвратит их уничтожение - person Roberto; 20.06.2015