Unity и Addressables: спрайт или текстура? Оба!

Представим типичную ситуацию при работе с ассетами: у вас куча ассетов с одним и тем же лейблом и вы хотите их загрузить разом. А ассеты могут быть разного типа, поэтому в дженерик вы передаёте тип Object. Что же происходит в этом случае с картинками? Загрузятся они как спрайты? Или как текстуры? Что ж…

Unity и Addressables: спрайт или текстура? Оба!

Добавим в проект картинку и навесим Label.

Unity и Addressables: спрайт или текстура? Оба!

Теперь попробуем загрузить её по имени лейбла.

public class Tests : MonoBehaviour { void Start() { LoadByLabel<Object>("test"); } public void LoadByLabel<T>(string label) { Addressables.LoadResourceLocationsAsync(label).Completed += obj => { if (obj.Status != AsyncOperationStatus.Succeeded) return; if (obj.Result == null) return; foreach (var irl in obj.Result ) { AsyncOperationHandle loadHandle = Addressables.LoadAssetAsync<T>(irl.PrimaryKey); loadHandle.Completed += asset => { Debug.LogWarning($"LoadByLabel: {irl.PrimaryKey} => {irl.ResourceType}, {asset.Result.GetType().FullName}]"); }; } }; } }

Увидим такой лог:

LoadByLabel: Dolan => UnityEngine.Texture2D, UnityEngine.Texture2D] LoadByLabel: Dolan => UnityEngine.Sprite, UnityEngine.Texture2D]

Во-первых, одна и та же картинка загрузилась два раза.

Но проблема тут в том, что оба объекта имеют разный ResourceType, но при этом тип у объектов одинаковый.

99
4 комментария

Хоба!
Люблю дорогу на Эльдорадо)

1

Время загрузки разное? А что по памяти?)

Да в памяти то и спрайт, и текстура будут в любом случае. Но в зависимости от того, что грузишь, будет по-разному выглядеть очистка памяти.

1

Подозреваю, что это даже в каком-то смысле правильное поведение. Мне кажется, что спрайт на самом деле является не ассетом, а просто рантайм контейнером для текстуры из-за чего и возникает эта проблема