Menyelesaikan skenario Sprite Atlas yang berbeda
Sprite Paket Mode

Sprite Packer

Sprite Packer deprecation

Harap dicatat bahwa SpriteA 2D graphic objects. If you are used to working in 3D, Sprites are essentially just standard textures but there are special techniques for combining and managing sprite textures for efficiency and convenience during development. More info
See in Glossary
Packer
diuraikan untuk Unity 2020.1 dan yang lebih baru, dan tidak akan lagi tersedia sebagai pilihan dari Sprite Paket Mode. Proyek yang ada telah menggunakan Sprite Packer masih dapat terus menggunakannya, namun setiap Proyek baru yang dibuat pada 2020.1 seterusnya akan default ke sistem Atlas AsniTekstur yang terdiri dari beberapa tekstur yang lebih kecil. Juga disebut sebagai atlas tekstur, sprite gambar, sprite sheet atau tekstur dikemas. More info
Lihat di Glossary
ketika kemasan Tekstur.

Introduction

Ketika merancang grafis Sprite, nyaman untuk bekerja dengan file Tekstur terpisah untuk setiap karakter. Namun, sebagian besar Tekstur Sprite seringkali akan diambil oleh ruang kosong antara elemen grafis dan ruang ini akan menghasilkan memori video yang terbuang saat ini. Untuk kinerja optimal, yang terbaik untuk mengemas grafis dari beberapa tekstur Sprite dengan erat bersama dalam satu Tekstur yang dikenal sebagai atlas. Unity menyediakan utilitas Sprite Packer untuk mengotomatiskan proses pembuatan dilase dari tekstur Sprite individu.

Unity menangani generasi dan penggunaan tekstur atlas Sprite di balik scenesAdegan berisi lingkungan dan menu permainan Anda. Pikirkan setiap file Adegan unik sebagai tingkat yang unik. Di setiap Adegan, Anda menempatkan lingkungan, hambatan, dan dekorasi, pada dasarnya merancang dan membangun permainan Anda dalam potongan-potongan. More info
Lihat di Glossary
sehingga pengguna harus tidak melakukan tugas manual. Atlas dapat secara opsional dikemas dalam memasukkan mode Play atau selama membangun dan grafis untuk objek Sprite akan diperoleh dari atlas setelah dihasilkan.

Pengguna diwajibkan untuk menentukan Tag Pengepakan dalam Pengimpor Tekstur untuk mengaktifkan kemasan untuk Sprites Tekstur itu.

Menggunakan Sprite Packer

Sprite Packer dinonaktifkan secara default tetapi Anda dapat mengkonfigurasinya dari jendela Editor (menu: Edit > Project Settings, kemudian pilih kategori Editor). Mode kemasan Sprite dapat diubah dari Disabled ke Enabled for Builds (paket digunakan untuk membangun tetapi tidak Play mode) atau Always Enabled (paket diaktifkan untuk mode Play dan builds).

Jika Anda membuka jendela Sprite Packer (menu: Window > 2D > Sprite Packer) dan klik tombol Pack di sudut kiri atas, Anda akan melihat pengaturan tekstur dikemas dalam atlas.

Jika Anda memilih Sprite di panel Proyek, ini juga akan disorot untuk menunjukkan posisinya di atlas. Garis besar sebenarnya adalah garis keluar render meshGrafik utama primitif Unity. Mesh membuat sebagian besar dunia 3D Anda. Unity mendukung mesh poligon triangulat atau Quadrangulasi. Nurbs, Nurms, permukaan Subdiv harus dikonversi ke poligon. More info
Lihat di Glossary
dan juga mendefinisikan area yang digunakan untuk kemasan ketat.

toolbarSe baris tombol dan kontrol dasar di bagian atas Editor Unity yang memungkinkan Anda untuk berinteraksi dengan Editor dengan berbagai cara (misalnya scaling, terjemahan). More info
Lihat di Glossary
di bagian atas jendela Sprite Packer memiliki sejumlah kontrol yang mempengaruhi pengepakan dan melihat. Tombol Pack memulai operasi kemasan tetapi tidak akan memaksa pembaruan jika atlas belum berubah karena dikemas terakhir. ( Tombol Repack terkait akan muncul ketika Anda menerapkan kebijakan kemasan kustom seperti yang dijelaskan dalam Customizing the Sprite Packer di bawah). Menu View Atlas dan Page # memungkinkan Anda untuk memilih halaman mana yang dilas ditunjukkan di jendela (las tunggal dapat dibagi menjadi lebih dari satu "halaman" jika tidak ada cukup ruang untuk semua Sprites dalam ukuran Tekstur maksimum). Menu di sebelah nomor halaman memilih yang "polis kemasan" digunakan untuk atlas (lihat di bawah). Di sebelah kanan bilah alat adalah dua kontrol untuk memperbesar tampilan dan beralih antara warna dan tampilan alfa untuk atlas.

Kebijakan pengepakan

Sprite Packer menggunakan packing policy untuk memutuskan cara menetapkan Sprites ke dalam lase. Mungkin untuk membuat kebijakan kemasan Anda sendiri (lihat di bawah) tetapi opsi Default Packer Policy, Tight Packer Policy dan Tight Rotate Enabled Sprite Packer Policy selalu tersedia. Dengan kebijakan ini, properti Packing Tag di Tekstur Importer langsung memilih nama atlas di mana Sprite akan dikemas dan sehingga semua Sprites dengan tag kemasan yang sama akan dikemas dalam atlas yang sama. Atlas kemudian lebih diurutkan oleh pengaturan impor Tekstur sehingga mereka mencocokkan apa pun set pengguna untuk tekstur sumber. Sprites dengan pengaturan tekstur compressionMetode menyimpan data yang mengurangi jumlah ruang penyimpanan yang dibutuhkan. Kompresi Tekstur, Kompresi Animasi, Kompresi Audio, Membangun Kompresi.
Lihat di Glossary
yang sama akan dikelompokkan ke atlas yang sama di mana mungkin.

  • DefaultPackerPolicy akan menggunakan kemasan persegi panjang secara default kecuali “[TIGHT]” ditentukan dalam Packing Tag (yaitu mengatur tag kemasan Anda ke “[TIGHT]Character” akan memungkinkan kemasan ketat).
  • TightPackerPolicy akan menggunakan kemasan ketat secara default jika Sprite memiliki jala ketat. Jika “[RECT]” ditentukan dalam kemasan Packing Tag, persegi panjang akan dilakukan (yaitu mengatur tag kemasan Anda ke “[RECT]UI_Elements” akan memaksa kemasan yang benar).
  • TightRotateEnabledSpritePackerPolicy akan menggunakan kemasan ketat secara default jika Sprite memiliki jala yang ketat dan akan mengaktifkan rotasi Sprites. Jika “[RECT]” ditentukan dalam kemasan Packing Tag, persegi panjang akan dilakukan (yaitu mengatur tag kemasan Anda ke “[RECT]UI_Elements” akan memaksa kemasan yang benar).

Kustomisasi Paket Sprite

Opsi DefaultPackerPolicy cukup untuk sebagian besar tujuan tetapi Anda juga dapat menerapkan kebijakan kemasan kustom Anda sendiri jika Anda perlu. Untuk melakukan ini, Anda perlu menerapkan UnityEditor. Sprites.IPackerPolicy antarmuka untuk kelas di script editor. Antarmuka ini memerlukan metode berikut:

  • DapatkanVersion - kembali nilai versi dari kebijakan paket Anda. Versi harus dibenci jika modifikasi dilakukan pada skrip kebijakan dan kebijakan ini disimpan ke version controlSistem untuk mengelola perubahan file. Anda dapat menggunakan Unity bersama dengan alat kontrol versi yang paling umum, termasuk Perforce, Git, Mercurial dan PlasticSCM. More info
    Lihat di Glossary
    .
  • OnGroupAtlases - menerapkan logika kemasan Anda di sini. Define dilase pada PackerJob dan menetapkan Sprites dari TextureImporters yang diberikan.

DefaultPackerPolicy menggunakan kemasan rect (lihat SpritePackingMode) secara default. Ini berguna jika Anda melakukan efek ruang tekstur atau ingin menggunakan mesh yang berbeda untuk rendering Sprite. Kebijakan kustom dapat menimpa ini dan menggunakan kemasan ketat.

  • Tombol repack hanya diaktifkan ketika kebijakan kustom dipilih.
    • OnGroupAtlase tidak akan disebut kecuali metadata TeksturImporter atau perubahan nilai versi PackerPolicy yang dipilih.
    • Gunakan tombol Repack saat bekerja pada kebijakan kustom Anda.
  • Sprit dapat dikemas berputar dengan TightRotateEnabledSpritePackerPolicy secara otomatis.
    • SpritePackingRotation adalah jenis yang disediakan untuk versi Unity masa depan.

Other

  • Atlassian cache dalam Proyek\Library\AtlasCache.
    • Menghapus folder ini dan kemudian meluncurkan Unity akan memaksa dilase untuk dibongkar. Unity harus ditutup ketika melakukannya.
  • Atlas cache tidak dimuat pada awal.
    • Semua tekstur harus diperiksa ketika pengepakan untuk pertama kalinya setelah Unity direstart. Operasi ini mungkin memakan waktu tergantung pada jumlah total tekstur dalam proyek.
    • Hanya dilase yang diperlukan dimuat.
  • Ukuran atlas maksimum default adalah 2048x2048.
  • Ketika PackingTag diatur, Tekstur tidak akan dikompresi sehingga SpritePacker dapat mengambil nilai pixelUnit terkecil dalam gambar komputer. Ukuran piksel tergantung pada resolusi layar Anda. Pencahayaan pixel dihitung pada setiap piksel layar. More info
    Lihat di Glossary
    asli dan kemudian melakukan kompresi di atlas.

Datasheet

using System;
using System.Linq;
using UnityEngine;
using UnityEditor;
using System.Collections.Generic;


public class DefaultPackerPolicySample : UnityEditor.Sprites.IPackerPolicy
{
        protected class Entry
        {
            public Sprite            Sprite;
        public UnityEditor.Sprites.AtlasSettings settings;
            public string            atlasName;
            public SpritePackingMode packingMode;
            public int               anisoLevel;
        }

        private const uint kDefaultPaddingPower = 3; // Good for base and two mip levels.

        public virtual int GetVersion() { return 1; }
        protected virtual string TagPrefix { get { return "[TIGHT]"; } }
        protected virtual bool AllowTightWhenTagged { get { return true; } }
        protected virtual bool AllowRotationFlipping { get { return false; } }

    public static bool IsCompressedFormat(TextureFormat fmt)
    {
        if (fmt >= TextureFormat.DXT1 && fmt <= TextureFormat.DXT5)
            return true;
        if (fmt >= TextureFormat.DXT1Crunched && fmt <= TextureFormat.DXT5Crunched)
            return true;
        if (fmt >= TextureFormat.PVRTC_RGB2 && fmt <= TextureFormat.PVRTC_RGBA4)
            return true;
        if (fmt == TextureFormat.ETC_RGB4)
            return true;
        if (fmt >= TextureFormat.ATC_RGB4 && fmt <= TextureFormat.ATC_RGBA8)
            return true;
        if (fmt >= TextureFormat.EAC_R && fmt <= TextureFormat.EAC_RG_SIGNED)
            return true;
        if (fmt >= TextureFormat.ETC2_RGB && fmt <= TextureFormat.ETC2_RGBA8)
            return true;
        if (fmt >= TextureFormat.ASTC_RGB_4x4 && fmt <= TextureFormat.ASTC_RGBA_12x12)
            return true;
        if (fmt >= TextureFormat.DXT1Crunched && fmt <= TextureFormat.DXT5Crunched)
            return true;
        return false;
    }

    public void OnGroupAtlases(BuildTarget target, UnityEditor.Sprites.PackerJob job, int[] textureImporterInstanceIDs)
        {
            List<Entry> entries = new List<Entry>();

            foreach (int instanceID in textureImporterInstanceIDs)
            {
                TextureImporter ti = EditorUtility.InstanceIDToObject(instanceID) as TextureImporter;

                TextureFormat desiredFormat;
                ColorSpace colorSpace;
                int compressionQuality;
                ti.ReadTextureImportInstructions(target, out desiredFormat, out colorSpace, out compressionQuality);

                TextureImporterSettings tis = new TextureImporterSettings();
                ti.ReadTextureSettings(tis);

            Sprite[] Sprites =
                AssetDatabase.LoadAllAssetRepresentationsAtPath(ti.assetPath)
                    .Select(x => x as Sprite)
                    .Where(x => x != null)
                    .ToArray();
                foreach (Sprite Sprite in Sprites)
                {
                    Entry entry = new Entry();
                    entry.Sprite = Sprite;
                    entry.settings.format = desiredFormat;
                    entry.settings.colorSpace = colorSpace;
                    // Use Compression Quality for Grouping later only for Compressed Formats. Otherwise leave it Empty.
                entry.settings.compressionQuality = IsCompressedFormat(desiredFormat) ? compressionQuality : 0;
                entry.settings.filterMode = Enum.IsDefined(typeof(FilterMode), ti.filterMode)
                    ? ti.filterMode
                    : FilterMode.Bilinear;
                    entry.settings.maxWidth = 2048;
                    entry.settings.maxHeight = 2048;
                    entry.settings.generateMipMaps = ti.mipmapEnabled;
                    entry.settings.enableRotation = AllowRotationFlipping;
                    if (ti.mipmapEnabled)
                        entry.settings.paddingPower = kDefaultPaddingPower;
                    else
                        entry.settings.paddingPower = (uint)EditorSettings.SpritePackerPaddingPower;
                    #if ENABLE_ANDROID_ATLAS_ETC1_COMPRESSION
                        entry.settings.allowsAlphaSplitting = ti.GetAllowsAlphaSplitting ();
                    #endif //ENABLE_ANDROID_ATLAS_ETC1_COMPRESSION

                    entry.atlasName = ParseAtlasName(ti.SpritePackingTag);
                    entry.packingMode = GetPackingMode(ti.SpritePackingTag, tis.SpriteMeshType);
                    entry.anisoLevel = ti.anisoLevel;

                    entries.Add(entry);
                }

                Resources.UnloadAsset(ti);
            }

            // First split Sprites into groups based on atlas name
            var atlasGroups =
                from e in entries
                group e by e.atlasName;
            foreach (var atlasGroup in atlasGroups)
            {
                int page = 0;
                // Then split those groups into smaller groups based on texture settings
                var settingsGroups =
                    from t in atlasGroup
                    group t by t.settings;
                foreach (var settingsGroup in settingsGroups)
                {
                    string atlasName = atlasGroup.Key;
                    if (settingsGroups.Count() > 1)
                        atlasName += string.Format(" (Group {0})", page);

                UnityEditor.Sprites.AtlasSettings settings = settingsGroup.Key;
                    settings.anisoLevel = 1;
                    // Use the highest aniso level from all entries in this atlas
                    if (settings.generateMipMaps)
                        foreach (Entry entry in settingsGroup)
                            if (entry.anisoLevel > settings.anisoLevel)
                                settings.anisoLevel = entry.anisoLevel;

                    job.AddAtlas(atlasName, settings);
                    foreach (Entry entry in settingsGroup)
                    {
                        job.AssignToAtlas(atlasName, entry.Sprite, entry.packingMode, SpritePackingRotation.None);
                    }

                    ++page;
                }
            }
        }

        protected bool IsTagPrefixed(string packingTag)
        {
            packingTag = packingTag.Trim();
            if (packingTag.Length < TagPrefix.Length)
                return false;
            return (packingTag.Substring(0, TagPrefix.Length) == TagPrefix);
        }

        private string ParseAtlasName(string packingTag)
        {
            string name = packingTag.Trim();
            if (IsTagPrefixed(name))
                name = name.Substring(TagPrefix.Length).Trim();
            return (name.Length == 0) ? "(unnamed)" : name;
        }

        private SpritePackingMode GetPackingMode(string packingTag, SpriteMeshType meshType)
        {
            if (meshType == SpriteMeshType.Tight)
                if (IsTagPrefixed(packingTag) == AllowTightWhenTagged)
                    return SpritePackingMode.Tight;
            return SpritePackingMode.Rectangle;
        }
}

TightPackerPolicy

using System;
using System.Linq;
using UnityEngine;
using UnityEditor;
using UnityEditor.Sprites;
using System.Collections.Generic;

// TightPackerPolicy will tightly pack non-rectangle Sprites unless their packing tag contains "[RECT]".
class TightPackerPolicySample : DefaultPackerPolicySample
{
        protected override string TagPrefix { get { return "[RECT]"; } }
        protected override bool AllowTightWhenTagged { get { return false; } }
        protected override bool AllowRotationFlipping { get { return false; } }
}

TightRotateEnabledSpritePackerPolicy

```` menggunakan sistem; menggunakan sistem. Linq; menggunakan UnityEngine; menggunakan UnityEditor; menggunakan UnityEditor.Sprites; menggunakan System. Sitemap Generik;

// TightPackerPolicy akan secara ketat mengemas Sprites non persegi panjang kecuali tag kemasan mereka mengandung “[RECT]”. kelas TightRotateEnabledSpritePackerPolicySample : DefaultPackerPolicySample { dilindungi override string TagPrefix { get { return "[RECT]"; } } dilindungi override bool AllowTight KetikaTagged { get { kembali palsu; } } dilindungi override bool AllowRotation Login


  • Sprite Packer deprecated di NewIn20191
Menyelesaikan skenario Sprite Atlas yang berbeda
Sprite Paket Mode