UGUI与NGUI的区别汇总
?
圖集打包Atlas
制作
NGUI是必須先打出圖集然后才能開始做界面。因為始終都要去考慮你的UI圖集。比如圖集會不會超1024 ,圖集該如何來規劃等等。
?
UGUI 讓開發者徹底模糊圖集的概念,讓開發者不要去關心自己的圖集。做界面的時候只用小圖,而在最終打包的時候unity才會把你的小圖和并在一張大的圖集里面。然而這一切都是自動完成的,開發者不需要去care它。
?
NGUI在打包圖集的時候圖集的默認格式是RGBA32,也就是支持帶透明通道的圖片,這樣一張1024的圖集也就是4M內存。為了優化圖集,我們可以選擇把帶透明通道圖片 和 不帶透明通道的圖片分開打圖集,這樣可以減少內存的占用量。然而著一切的一切在NGUI上都需要手動操作,而SpritePacker則全自動完成。Sprite上的Packing Tag 同一標識的圖片。
UGUI會把相同圖片格式的圖片打包成同一圖集。MomoAtals和RUORUOAtlas就是Packing Tag的標識符,那么此時根據這兩個標識符SpritePacker將打出兩個圖集出來。 因為MomoAtlas這些圖片中,一部分是RGBA32格式,還有一部分是ETC 4bits格式,那么MomoAtlas將被在分成兩個圖集,就是尾綴帶Group的。
?
?
打包Sprite Packer有兩個打包模式
DefaultPackerPolicy:是默認的打包方式,也是矩形打包方式。他會把所有的小圖按照矩形的方式來排列,如果寬高不一樣的圖片,它們會自動補起。
TightPackerPolicy:是緊密打包方式,也就是盡可能的把圖片都打包在圖集上,這種方式要比DefaultPackerPolicy打包的圖片更多一些,也就是更省空間。
?
?
圖中[TIGHT]開頭的就表示單獨這張圖采用TightPackerPolicy打包模式。
?
自定義打包
假如我想自定義打包方式咋辦?比如我想設置圖片打包格式,或者圖集大小等等怎么辦?把如下代碼放在Editor文件夾下, 在代碼里面就可以設置圖集的屬性了。
?
using System;
using System.Linq;
using UnityEngine;
using UnityEditor;
using UnityEditor.Sprites;
using System.Collections.Generic;
? ?
// DefaultPackerPolicy will pack rectangles no matter what Sprite mesh type is unless their packing tag contains "[TIGHT]".
class DefaultPackerPolicySample : UnityEditor.Sprites.IPackerPolicy
{
????protected class Entry
????{
????????public Sprite????????????sprite;
????????public AtlasSettings???? settings;
????????public string????????????atlasName;
????????public SpritePackingMode packingMode;
????}
????
????public virtual int GetVersion() { return 1; }
????
????protected virtual string TagPrefix { get { return "[TIGHT]"; } }
????protected virtual bool AllowTightWhenTagged { get { return true; } }
????
????public void OnGroupAtlases(BuildTarget target, PackerJob job, int[] textureImporterInstanceIDs)
????{
????????List<Entry> entries = new List<Entry>();
????????
????????foreach (int instanceID in textureImporterInstanceIDs)
????????{
????????????TextureImporter ti = EditorUtility.InstanceIDToObject(instanceID) as TextureImporter;
????????????
????????????TextureImportInstructions ins = new TextureImportInstructions();
????????????ti.ReadTextureImportInstructions(ins, target);
????????????
????????????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 = ins.desiredFormat;
????????????????entry.settings.usageMode = ins.usageMode;
????????????????entry.settings.colorSpace = ins.colorSpace;
????????????????entry.settings.compressionQuality = ins.compressionQuality;
????????????????entry.settings.filterMode = Enum.IsDefined(typeof(FilterMode), ti.filterMode) ? ti.filterMode : FilterMode.Bilinear;
????????????????entry.settings.maxWidth = 1024;
????????????????entry.settings.maxHeight = 1024;
????????????????entry.atlasName = ParseAtlasName(ti.spritePackingTag);
????????????????entry.packingMode = GetPackingMode(ti.spritePackingTag, tis.spriteMeshType);
????????????????
????????????????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);
????????????????
????????????????job.AddAtlas(atlasName, settingsGroup.Key);
????????????????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;
????}
}
?
雖然可以全選在設置圖片的pack tag,但是我覺得最好全自動完成,比如我們把圖片放在不同的文件夾下,那么文件夾的名子就可以用做Atals的名子。最后在分享一條這樣的腳本。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | using UnityEngine; using System.Collections; using UnityEditor; using System.IO; ? ? public class??Post : AssetPostprocessor { ? ? ????void OnPostprocessTexture (Texture2D texture) ????{ ????????string AtlasName =??new DirectoryInfo(Path.GetDirectoryName(assetPath)).Name; ????????TextureImporter textureImporter??= assetImporter as TextureImporter; ????????textureImporter.textureType = TextureImporterType.Sprite; ????????textureImporter.spritePackingTag = AtlasName; ????????textureImporter.mipmapEnabled = false; ????} ? ? } |
?
總結
以上是生活随笔為你收集整理的UGUI与NGUI的区别汇总的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 优化Image设置Tiled类型产生过多
- 下一篇: 机器学习_的应用网站记录01_可以上色的