Загрузка спрайтов в iOS
Бывает нужно дозагрузить какие-нибудь картинки с сервера и показать их в игре, например, чтобы сделать размер установочного файла меньше.
Для загрузки спрайта из внешнего файла, я использовал такую функцию:
public static Sprite LoadSprite (string folder, string image) {
string path = string.Format ("{0}/{1}/{2}.png", Application.temporaryCachePath, folder, image);
if (!System.IO.File.Exists (path))
return null;
else {
byte[] data = System.IO.File.ReadAllBytes (path);
Texture2D texture = new Texture2D(2, 2);
texture.LoadImage(data);
return Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(.5f, .5f));
}
}
...
MyIcon.sprite = LoadSprite ("loaded_images", "new_icon");
Ничего необычного — читаем файл в текстуру, из текстуры делаем спрайт и применяем его к картинке. Если запустить этот код в редакторе или на android устройстве, то все будет в порядке. Но запустив его на iPhone или iPad — спрайт загрузится некорректно. Это происходит потому iOS не поддерживает формат сжатия DXT. Нужно использовать PVRTC_RGBA4.
Поэтому, немного изменяем функцию и теперь все картинку будут показываться правильно:
public static Sprite LoadSprite (string folder, string image) {
string path = string.Format ("{0}/{1}/{2}.png", Application.temporaryCachePath, folder, image);
if (!System.IO.File.Exists (path))
return null;
else {
byte[] data = System.IO.File.ReadAllBytes (path);
Texture2D texture;
#if UNITY_ANDROID
texture = new Texture2D(2, 2);
#elif UNITY_IOS
texture = new Texture2D(2, 2, TextureFormat.PVRTC_RGBA4, false);
#endif
texture.LoadImage(data);
return Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(.5f, .5f));
}
}