#unity3d
Вопрос:
У меня есть Сцена, помеченная как Адресуемая. Учитывая Scene
само по себе, можно ли получить AssetReference
для этой сцены?
Например, в следующем фрагменте кода, что ??
должно быть?
Scene activeScene = SceneManager.GetActiveScene();
// What can I call here to get the AssetReference?
AssetReference activeSceneReference = ??;
Ответ №1:
Если это вообще возможно, я честно не могу сказать, так как до сих пор я никогда не работал с адресными файлами.
Однако, следуя API, это может быть возможно, но требует нескольких шагов:
Поскольку activeScene
это загруженная сцена, и одна и та же сцена может быть загружена несколько раз с помощью аддитивной загрузки, на самом деле она больше не является активом и, следовательно, вообще не имеет ссылки на актив.
Итак, первый шаг на самом деле
Получите ресурс для загруженной сцены
Имея загруженную сцену, вы все равно можете получить ее исходный путь к активу через Scene.path
.
var activeScene = SceneManager.GetActiveScene();
var activeScenePath = activeScene.path;
А затем используйте AssetDatabase.LoadAssetAtPath
для загрузки исходного ресурса
var activeSceneAsset = AssetDataBase.LoadAssetAtPath<Scene>(activeScenePath);
Теперь, когда у нас есть фактический ресурс загруженной сцены, мы можем
Получите идентификатор GUID актива
Уже имея актив activeSceneAsset
, который вы можете использовать AssetDatabase.TryGetGUIDAndLocalFileIdentifier
для получения идентификатора GUID, который нам нужен на последнем шаге:
if (AssetDatabase.TryGetGUIDAndLocalFileIdentifier(activeSceneAsset, out var guid, out var file))
{
// TODO see below
}
и теперь, имея это guid
, мы можем использовать его для того, чтобы
Получите AssetReference
через GUID
Причина, по которой мы хотели получить идентификатор GUID, заключается в том, что теперь мы можем использовать его для AssetReference
конструктора, принимающего идентификатор GUID в качестве параметра:
var activeSceneReference = new AssetReference(guid);
ПРИМЕЧАНИЕ: Все это, конечно, возможно только в самом редакторе Unity, поскольку AssetDataBase
вне его не существует.
Комментарии:
1. Я ценю обстоятельный ответ! Это здорово тем, что он возвращает ссылку на актив, но я должен был уточнить, что пытаюсь получить уже существующую ссылку на ресурс для сцены (ту же, которую вы получили бы, если бы перетащили сцену в слот для ссылки на активы в инспекторе). Насколько я понимаю, существует только один параметр, который можно использовать для создания любого количества версий одной и той же сцены, и я надеялся, что будет какой-то способ указать на этот исходный параметр.
2. Кроме того, если это поможет: вариант использования здесь-холодный старт с уровней в игре. Обычный поток в моей игре использует ссылку на активы для загрузки сцен, и этот поток сохраняет эту ссылку для ведения бухгалтерского учета. При запуске игры в середине уровня (при разработке/отладке) сцена уже загружена, и у меня нет дескриптора для ссылки на активы. Существуют ручные обходные пути, но я надеялся, что смогу программно захватить этот ресурс в игре.
3. Обновление: на самом деле это работает! После создания новой ссылки на активы вы можете сравнить
assetReference.editorAsset
. Огромное спасибо @derHugo