Buffer icon Проекты

10 мая 2016-го

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

Загрузка спрайтов в 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));
	}
}
4 мая 2016   · · ·
← Ctrl →
· · ·   23 мая 2016