Вопрос по созданию атласов для Sprite

Раздел, посвящённый всему, что связано с программированием для Редактора Юнити. Скрипты Редактора, Wizards и прочее.

Вопрос по созданию атласов для Sprite

Сообщение OlegGel 09 ноя 2010, 00:43

Использую SpriteManager. Имеется куча маленьких текстур-файлов, хочу построить для них один атлас, но не пойму как это делать. Нашел, на мой взгляд довольно убогий метод. Создаю кучу объектов, прикрепляю к ним PackedSprite-компонет, устанавливаю для всех объектов один и тот же материал, потом устанавливаю статичную маленькую текстуру для каждого объекта, которую хочу видеть в атласе. Затем выделяю все объекты вместе в Hierarchy View, жму Custom->Build Atlases, и тогда для данного материала построится один большой атлас, содержащий все эти текстуры. Хотелось бы продолжить использовать PackedSprite, но он не позволяет отображать конкретный участок атласа, поэтому удаляю все PackedSprite и заменяю их на компоненты Sprite, которые такой способностью обладают. Таким образом имею один материал, один большой атлас для спрайтов. Этот способ очень муторный и неудобный. Как проще построить атлас из набора текстур?
OlegGel
UNIт
 
Сообщения: 56
Зарегистрирован: 09 ноя 2010, 00:31


Re: Вопрос по созданию атласов для Sprite

Сообщение OlegGel 09 ноя 2010, 08:14

О, не знал, спасибо, сейчас на работу приеду попробую.
OlegGel
UNIт
 
Сообщения: 56
Зарегистрирован: 09 ноя 2010, 00:31

Re: Вопрос по созданию атласов для Sprite

Сообщение OlegGel 09 ноя 2010, 11:22

Хороший плагинчик, но мне потребовалось возможность создавать именно квадратный атлас, т.е. атлас 256х512 не подходит, надо 512х512, поэтому я немножко модифицировал его, добавил опцию Force Square , если выбрать он будет строить именно квадратный атлас, спасибо автору исходного плагина...и да, переписал его на C# ибо он эстетичней.
i3D_SpriteAtlasBuilderModified.cs

Синтаксис:
Используется csharp
using UnityEngine;
using UnityEditor;
using System.Collections;
using System.IO;

public class i3D_SpriteAtlasBuilderModified : ScriptableWizard
{
        public int quantity = 4;
        public Texture2D[] images = new Texture2D[16];
        public WWW img;
        public bool forceSquare = false;
       
        [MenuItem("i3D/Create/Sprite Atlas Modified")]
        public static void SpriteAtlas()
        {
                ScriptableWizard.DisplayWizard("Create Sprite Atlas", typeof(i3D_SpriteAtlasBuilderModified),"Create");
        }
       
        public void OnEnable(){}
       
        public void OnWizardCreate()
        {
                if(images.Length == 0)
                {
                        EditorUtility.DisplayDialog("Result", "No images were selected", "Ok");
                }
               
                for(int i = 0; i < images.Length; i++)
                {
                        Texture2D img = images[i];
                        if(img == null)
                        {
                                img = new Texture2D(0, 0, TextureFormat.RGB24, false);
                                img.Apply();
                        }
                }
               
                Texture2D outTexture = new Texture2D(0, 0, TextureFormat.RGB24, false);
                outTexture.PackTextures(images, 0, 1024);
               
                Texture2D forcedSquareTexture = null;
                if(forceSquare)
                {
                        if(outTexture.width < outTexture.height)
                        {
                                Texture2D temptex = new Texture2D(outTexture.height - outTexture.width, outTexture.height, TextureFormat.RGB24, false);
                                forcedSquareTexture = new Texture2D(0, 0, TextureFormat.RGB24, false);
                                forcedSquareTexture.PackTextures(new Texture2D[]{outTexture, forcedSquareTexture}, 0, 1024);
                        }
                        else if(outTexture.width > outTexture.height)
                        {
                                Texture2D temptex = new Texture2D(outTexture.width, outTexture.width - outTexture.height, TextureFormat.RGB24, false);
                                forcedSquareTexture = new Texture2D(0, 0, TextureFormat.RGB24, false);
                                forcedSquareTexture.PackTextures(new Texture2D[]{outTexture, forcedSquareTexture}, 0, 1024);
                        }
                        else
                        {
                                forcedSquareTexture = null;
                        }
                }
                if(outTexture == null)
                {
                        EditorUtility.DisplayDialog("Error", "There was a problem creating the atlas.", "Ok");
                        return;
                }
               
                string outPath = EditorUtility.SaveFilePanel("Where would you like to save the new sprite atlas?", Application.dataPath, "SpriteAtlas.png", "png");
                FileStream fs = new FileStream(outPath, FileMode.Create);
                BinaryWriter w = new BinaryWriter(fs);
                if(forcedSquareTexture != null)
                {
                        w.Write(forcedSquareTexture.EncodeToPNG());
                }
                else
                {
                        w.Write(outTexture.EncodeToPNG());
                }
               
                w.Close();
                fs.Close();
               
                AssetDatabase.Refresh();
                EditorUtility.DisplayDialog("Result", "Texture was saved successfully.", "Ok");
        }
       
        public void OnWizardUpdate()
        {
                helpString = "Please select all the images that will make up the sprite atlas.";
                KeepCurrentSelection();
        }
       
        private void KeepCurrentSelection()
        {
                if(quantity == images.Length)
                        return;
               
                Texture2D[] tmp_images = new Texture2D[quantity];
                int total_quantity_to_copy = images.Length > quantity ? quantity : images.Length;
                for(int i = 0; i < total_quantity_to_copy; i++)
                {
                        tmp_images[i] = images[i];
                }
                images = tmp_images;
        }
}

 
OlegGel
UNIт
 
Сообщения: 56
Зарегистрирован: 09 ноя 2010, 00:31

Re: Вопрос по созданию атласов для Sprite

Сообщение [bm] 07 янв 2011, 18:38

Mafia Rush: universal iOS game _https://goo.gl/CKq4D Android _https://goo.gl/slFLXx
Shooter Ball: Android _https://goo.gl/21QyPw
skype: bmindfield
Аватара пользователя
[bm]
UNIверсал
 
Сообщения: 426
Зарегистрирован: 11 май 2010, 22:33
Откуда: Россия, Ижевск


Вернуться в Editor

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2