5 заметок с тегом

графика

О Texture2D и памяти

Если погуглить на тему Unity Texture2D, memory leak, www.texture — то можно обнаружить кучу постов с вопросами о том, почему не освобождается память. И это на на самом деле так, если ничего не предпринимать.

Намучившись со всем этим, составил небольшой список мыслей/советов:

  • Создавайте, как можно меньше Texture2D, в идеале использовать пул. И обязательно делать Destroy, когда объект уже не будет использоваться, иначе память не освободится.
  • При использовании класса WWW, также нужно удалять www.texture и делать www.Dispose.
  • Сжатие «на лету» не работает, т. е. если вы например загружаете изображение из интеренетов и потом вставляете в Image, способом ниже, то на мобильном устройстве, картинка полностью развернется в память, без сжатия. И это печально.
// data is downloaded byte[]
...
Texture2D texture = null;
#if UNITY_ANDROID
	texture = new Texture2D(2, 2, TextureFormat.ETC2_RGBA8, false);
#elif UNITY_IOS
	texture = new Texture2D(2, 2, TextureFormat.PVRTC_RGBA4, false);
#endif
texture.LoadImage(data); 
Sprite sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(.5f, .5f)));
MyImage.sprite = sprite;
  • Используйте сжатие предназначенное под конкретную платформу. Для iOS — это PVRTC4, для новых моделей подойдёт ASTC, начиная с iPhone 6. Для Android — ETC. Подробнее про это можно прочитать в мануале Unity.
  • Кроме того, сжатие не будет работать в некоторых случаях, если размеры спрайтов и атласов не равны степени 2. Т. е. размеры должны быть 128x128, 2048x2048 и т. д.
11 мая   unity   графика   разработка

Использование альфа маски

В Unity стандартная маска (компонент Mask) работает без альфа канала, т. е. красивые «мягкие» края сделать не получится. Особенно это актуально, если у вас маска сложной формы.

Но тут нас спасет очень хорошая библиотека скриптов от Simon Jackson — Unity UI Extensions. И один из скриптов из этой библиотеки как раз и позволяет делать «soft smooth ui alpha mask».

Нужно скопировать в свой проект скрипт SoftMaskScript.cs и шейдер с таким же именем. И кинуть скрипт на UI Image.

Получим такой результат. Намного лучше чем стандартная маска.

Да и вообще, в этой либе много других интересных и полезных вещей, рекомендую.

2016   unity   графика   интерфейс   ссылки

Рисование кривых в Unity

Как нарисовать линию в Unity? А как кривую Безье? Очень просто! В Unity уже есть достаточно продвинутый компонент LineRenderer, его то я и использовал в одном из своих проектов. После упаковки в один скрипт, я бы даже сказал — в одну функцию, получилось вот что:

Можно настраивать количество сегментов в линии (качество), начальный и конечный цвет, и конечно ширину.

Исходник на Github

2016   unity   графика   разработка

2D графика для игр

Суперский блог про создание 2D графики для игр. Отличные видео и пошаговые уроки про то, как создать персонажа и подготовить его для анимации, как нарисовать камни и горы, фон и все остальное для вашей игры.

Если вы из тех, кто хочет сделать (и делает) игру полностью сам, то это то, что вам надо.

2016   графика   игры   ссылки   уроки

Загрузка спрайтов в 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));
	}
}
2016   ios   unity   графика