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.
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.
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.
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.
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:
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.
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;
}
}
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; } }
}
```` 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