public override void OnPostprocessAllAssets(IAkyuiLoader loader, Object[] importAssets) { var spriteAtlasPath = spriteAtlasOutputPath.Replace("{name}", loader.LayoutInfo.Name) + ".spriteatlas"; var spriteAtlas = AssetDatabase.LoadAssetAtPath <SpriteAtlas>(spriteAtlasPath); if (spriteAtlas == null) { Debug.Log($"Create SpriteAtlas: {spriteAtlasPath}"); AkyuiEditorUtil.CreateDirectory(Path.GetDirectoryName(spriteAtlasPath)); spriteAtlas = new SpriteAtlas(); AssetDatabase.CreateAsset(spriteAtlas, spriteAtlasPath); } if (source != null) { EditorUtility.CopySerialized(source, spriteAtlas); } spriteAtlas.name = loader.LayoutInfo.Name; spriteAtlas.Remove(spriteAtlas.GetPackables()); spriteAtlas.Add(importAssets); SpriteAtlasUtility.PackAtlases(new[] { spriteAtlas }, EditorUserBuildSettings.activeBuildTarget); }
string CreateSpriteAtlasWithSprite() { // create a Sprite atlas, + sprite var spriteAtlasPath = GetAssetPath("testAtlas.spriteatlas"); SpriteAtlas spriteAtlas = new SpriteAtlas(); AssetDatabase.CreateAsset(spriteAtlas, spriteAtlasPath); Texture2D texture = Texture2D.whiteTexture; byte[] data = texture.EncodeToPNG(); var texturePath = GetAssetPath("testTexture.png"); File.WriteAllBytes(texturePath, data); AssetDatabase.ImportAsset(texturePath, ImportAssetOptions.ForceSynchronousImport | ImportAssetOptions.ForceUpdate); TextureImporter importer = TextureImporter.GetAtPath(texturePath) as TextureImporter; importer.textureType = TextureImporterType.Sprite; importer.spriteImportMode = SpriteImportMode.Single; importer.SaveAndReimport(); SpriteAtlasExtensions.Add(spriteAtlas, new[] { AssetDatabase.LoadAssetAtPath <Texture>(texturePath) }); SpriteAtlasUtility.PackAtlases(new SpriteAtlas[] { spriteAtlas }, EditorUserBuildSettings.activeBuildTarget, false); return(spriteAtlasPath); }
public override void OnPostprocessAllAssets(IAkyuiLoader loader, Object[] importAssets) { var spriteAtlasPath = spriteAtlasOutputPath.Replace("{name}", loader.LayoutInfo.Name) + ".spriteatlas"; var spriteAtlas = AssetDatabase.LoadAssetAtPath <SpriteAtlas>(spriteAtlasPath); if (spriteAtlas == null) { Debug.Log($"Create SpriteAtlas: {spriteAtlasPath}"); AkyuiEditorUtil.CreateDirectory(Path.GetDirectoryName(spriteAtlasPath)); spriteAtlas = new SpriteAtlas(); AssetDatabase.CreateAsset(spriteAtlas, spriteAtlasPath); } if (spriteAtlasPreset != null) { spriteAtlasPreset.ApplyTo(spriteAtlas); } spriteAtlas.name = loader.LayoutInfo.Name; spriteAtlas.Remove(spriteAtlas.GetPackables()); spriteAtlas.Add(importAssets); SpriteAtlasUtility.PackAtlases(new[] { spriteAtlas }, EditorUserBuildSettings.activeBuildTarget); // なにかのバグだと思うんだけど、ここでSaveしないとPresetが反映されないことがある Unity 2020.3.18 EditorUtility.SetDirty(spriteAtlas); AssetDatabase.SaveAssets(); }
protected override void OnInit() { var mainSO = ScriptableObject.CreateInstance <TestObject>(); var subSO = ScriptableObject.CreateInstance <TestSubObject>(); subSO.name = "sub"; m_ScriptableObjectPath = Path.Combine(k_TestConfigFolder, "testScriptableObject.asset"); AssetDatabase.CreateAsset(mainSO, m_ScriptableObjectPath); AssetDatabase.AddObjectToAsset(subSO, m_ScriptableObjectPath); AssetDatabase.ImportAsset(m_ScriptableObjectPath, ImportAssetOptions.ForceSynchronousImport | ImportAssetOptions.ForceUpdate); // create a Sprite atlas, + sprite m_SpriteAtlasPath = Path.Combine(k_TestConfigFolder, "testAtlas.spriteatlas"); SpriteAtlas spriteAtlas = new SpriteAtlas(); AssetDatabase.CreateAsset(spriteAtlas, m_SpriteAtlasPath); Texture2D texture = Texture2D.whiteTexture; byte[] data = texture.EncodeToPNG(); m_TexturePath = Path.Combine(k_TestConfigFolder, "testTexture.png"); File.WriteAllBytes(m_TexturePath, data); AssetDatabase.ImportAsset(m_TexturePath, ImportAssetOptions.ForceSynchronousImport | ImportAssetOptions.ForceUpdate); TextureImporter importer = TextureImporter.GetAtPath(m_TexturePath) as TextureImporter; importer.textureType = TextureImporterType.Sprite; importer.spriteImportMode = SpriteImportMode.Single; importer.SaveAndReimport(); SpriteAtlasExtensions.Add(spriteAtlas, new [] { AssetDatabase.LoadAssetAtPath <Texture>(m_TexturePath) }); SpriteAtlasUtility.PackAtlases(new SpriteAtlas[] { spriteAtlas }, EditorUserBuildSettings.activeBuildTarget, false); }
static void CreateFolderEntryAssets(string RootFolder, AddressableAssetSettings settings, AddressableAssetGroup group) { AssetDatabase.CreateFolder(RootFolder, "folderEntry"); string folderPath = RootFolder + "/folderEntry"; { var texture = new Texture2D(32, 32); var data = ImageConversion.EncodeToPNG(texture); UnityEngine.Object.DestroyImmediate(texture); AssetDatabase.GenerateUniqueAssetPath(RootFolder); var spritePath = folderPath + "/spritesheet.png"; File.WriteAllBytes(spritePath, data); AssetDatabase.ImportAsset(spritePath, ImportAssetOptions.ForceSynchronousImport | ImportAssetOptions.ForceUpdate); var spriteGuid = AssetDatabase.AssetPathToGUID(spritePath); var importer = (TextureImporter)AssetImporter.GetAtPath(spritePath); importer.textureType = TextureImporterType.Sprite; importer.spriteImportMode = SpriteImportMode.Multiple; importer.spritesheet = new SpriteMetaData[] { new SpriteMetaData() { name = "topleft", pivot = Vector2.zero, rect = new Rect(0, 0, 16, 16) }, new SpriteMetaData() { name = "botright", pivot = Vector2.zero, rect = new Rect(16, 16, 16, 16) } }; importer.SaveAndReimport(); } { var texture = new Texture2D(32, 32); var data = ImageConversion.EncodeToPNG(texture); UnityEngine.Object.DestroyImmediate(texture); var spritePath = folderPath + "/sprite.png"; File.WriteAllBytes(spritePath, data); AssetDatabase.ImportAsset(spritePath, ImportAssetOptions.ForceSynchronousImport | ImportAssetOptions.ForceUpdate); var spriteGuid = AssetDatabase.AssetPathToGUID(spritePath); var importer = (TextureImporter)AssetImporter.GetAtPath(spritePath); importer.textureType = TextureImporterType.Sprite; importer.SaveAndReimport(); string atlasPath = folderPath + "/atlas.spriteatlas"; var sa = new SpriteAtlas(); AssetDatabase.CreateAsset(sa, atlasPath); sa.Add(new UnityEngine.Object[] { AssetDatabase.LoadAssetAtPath <UnityEngine.Object>(AssetDatabase.GUIDToAssetPath(spriteGuid)) }); SpriteAtlasUtility.PackAtlases(new SpriteAtlas[] { sa }, EditorUserBuildSettings.activeBuildTarget, false); } var folderEntry = settings.CreateOrMoveEntry(AssetDatabase.AssetPathToGUID(folderPath), group, false, false); folderEntry.address = "folderEntry"; }
public SpriteAtlas SetUpSpriteAtlas(int numAtlasObjects, out List <Object> subAssets) { // Setup Sprite data var texture = new Texture2D(32, 32); var data = ImageConversion.EncodeToPNG(texture); UnityEngine.Object.DestroyImmediate(texture); // Setup Sprites subAssets = new List <Object>(); Directory.CreateDirectory(ConfigFolder + "/test"); var atlasPath = ConfigFolder + "/test" + "/testAtlas.spriteatlas"; var newAtlas = new SpriteAtlas(); var sprites = new Object[numAtlasObjects]; for (int i = 0; i < numAtlasObjects; i++) { // Create Sprite asset AssetDatabase.GenerateUniqueAssetPath(ConfigFolder); var newSpritePath = ConfigFolder + "/test" + "/testSprite" + i + ".png"; File.WriteAllBytes(newSpritePath, data); AssetDatabase.ImportAsset(newSpritePath, ImportAssetOptions.ForceSynchronousImport | ImportAssetOptions.ForceUpdate); var importer = (TextureImporter)AssetImporter.GetAtPath(newSpritePath); importer.textureType = TextureImporterType.Sprite; importer.spriteImportMode = SpriteImportMode.Multiple; importer.spritesheet = new SpriteMetaData[] { new SpriteMetaData() { name = "topleft", pivot = Vector2.zero, rect = new Rect(0, 0, 16, 16) }, new SpriteMetaData() { name = "testSprite" + i, pivot = Vector2.zero, rect = new Rect(16, 16, 16, 16) } }; importer.SaveAndReimport(); // Add sprite to subassets Object spr = AssetDatabase.LoadAssetAtPath(newSpritePath, typeof(Sprite)); spr.name = "testSprite" + i; sprites[i] = spr; subAssets.Add(spr); } // Setup Atlas newAtlas.Add(sprites); AssetDatabase.CreateAsset(newAtlas, atlasPath); AssetDatabase.Refresh(); SpriteAtlasExtensions.Add(newAtlas, sprites); SpriteAtlasUtility.PackAtlases(new SpriteAtlas[] { newAtlas }, EditorUserBuildSettings.activeBuildTarget, false); var atlasGuid = AssetDatabase.AssetPathToGUID(atlasPath); Settings.CreateOrMoveEntry(atlasGuid, Settings.groups[0]); return(newAtlas); }
protected string CreateSpriteAtlas(string atlasPath, string[] spriteTextureGuids) { var sa = new SpriteAtlas(); AssetDatabase.CreateAsset(sa, atlasPath); Object[] targetObjects = spriteTextureGuids.Select(g => AssetDatabase.LoadAssetAtPath <Object>(AssetDatabase.GUIDToAssetPath(g))).ToArray(); sa.Add(targetObjects); SpriteAtlasUtility.PackAtlases(new SpriteAtlas[] { sa }, EditorUserBuildSettings.activeBuildTarget, false); AssetDatabase.Refresh(); return(AssetDatabase.AssetPathToGUID(atlasPath)); }
public static string[] Export(SpriteAtlas atlas, string dirPath) { string platformName = "Standalone"; if (EditorUserBuildSettings.activeBuildTarget == BuildTarget.Android) { platformName = "Android"; } else if (EditorUserBuildSettings.activeBuildTarget == BuildTarget.iOS) { platformName = "iPhone"; } TextureImporterPlatformSettings tips = atlas.GetPlatformSettings(platformName); TextureImporterPlatformSettings cachedTips = new TextureImporterPlatformSettings(); tips.CopyTo(cachedTips); tips.overridden = true; tips.format = TextureImporterFormat.RGBA32; //tips.maxTextureSize = 1024; atlas.SetPlatformSettings(tips); List <string> texturePathList = new List <string>(); SpriteAtlasUtility.PackAtlases(new SpriteAtlas[] { atlas }, EditorUserBuildSettings.activeBuildTarget); MethodInfo getPreviewTextureMI = typeof(SpriteAtlasExtensions).GetMethod("GetPreviewTextures", BindingFlags.Static | BindingFlags.NonPublic); Texture2D[] atlasTextures = (Texture2D[])getPreviewTextureMI.Invoke(null, new SystemObject[] { atlas }); if (atlasTextures != null && atlasTextures.Length > 0) { for (int i = 0; i < atlasTextures.Length; i++) { Texture2D packTexture = atlasTextures[i]; byte[] rawBytes = packTexture.GetRawTextureData(); Texture2D nTexture = new Texture2D(packTexture.width, packTexture.height, packTexture.format, false, false); nTexture.LoadRawTextureData(rawBytes); nTexture.Apply(); string textPath = string.Format("{0}/{1}_{2}.png", dirPath, atlas.name, i); File.WriteAllBytes(textPath, nTexture.EncodeToPNG()); texturePathList.Add(textPath); } } atlas.SetPlatformSettings(cachedTips); return(texturePathList.ToArray()); }
void CreateSpriteAtlas(string path, string[] spriteAssetPaths) { var sa = new SpriteAtlas(); AssetDatabase.CreateAsset(sa, path); foreach (string spritePath in spriteAssetPaths) { sa.Add(new UnityEngine.Object[] { AssetDatabase.LoadAssetAtPath <UnityEngine.Object>(spritePath) }); } SpriteAtlasUtility.PackAtlases(new SpriteAtlas[] { sa }, EditorUserBuildSettings.activeBuildTarget, false); }
private void TryCloneSpriteAtlas() { SpriteAtlas atlas = _importer.Atlas; if (!atlas) { return; } //clone the sprite atlas asset SpriteAtlas newAtlas = CloneArtifact(atlas, "/Sprites"); //clear, then re-fill the atlas with used sprites newAtlas.Remove(newAtlas.GetPackables()); //add art tiles Object[] objects = _artTileSprites.OrderBy(p => p.name).Cast <Object>().ToArray(); newAtlas.Add(objects); //pack SpriteAtlasUtility.PackAtlases(new [] { newAtlas }, EditorUserBuildSettings.activeBuildTarget); }
static void CreateSpriteAtlas() { Object[] objs = Selection.objects; string selePath = AssetDatabase.GetAssetPath(objs[0]); string spriteAtlasName = Directory.GetParent(AssetDatabase.GetAssetPath(objs[0])).Name; //图集名字 if ((AssetDatabase.LoadAssetAtPath(selePath, typeof(Sprite))) == null) { Debug.LogError("请选择需要打包的Sprite图片"); return; //返回 } int index = selePath.LastIndexOf("/"); selePath = selePath.Remove(index, selePath.Length - index); SpriteAtlas spriteAtlas = new SpriteAtlas(); SpriteAtlasExtensions.Add(spriteAtlas, objs); AssetDatabase.CreateAsset(spriteAtlas, selePath + "/" + spriteAtlasName + ".spriteatlas"); SpriteAtlasUtility.PackAtlases(new SpriteAtlas[] { spriteAtlas }, EditorUserBuildSettings.activeBuildTarget); Debug.Log(ColorToolRich.ColorYellow("图集打包成功")); }
public static void SetAtlasMaxSize() { MethodInfo getPreviewTexturesMI = typeof(SpriteAtlasExtensions).GetMethod("GetPreviewTextures", BindingFlags.Static | BindingFlags.NonPublic); foreach (string atlasFile in EditorResourcePaths.GetAllAtlasFiles()) { if (atlasFile.EndsWith(LOW_ATLAS_SUFFIX)) { continue; } SpriteAtlas spriteAtlas = AssetDatabase.LoadAssetAtPath <SpriteAtlas>(atlasFile); List <Sprite> sprites = GetSpritesByAtlas(spriteAtlas); // 统计散图面积之和 int total = 0; int minSize = 128; foreach (Sprite sprite in sprites) { Rect rect = sprite.textureRect; int width = Mathf.CeilToInt(rect.width); int height = Mathf.CeilToInt(rect.height); minSize = Mathf.Max(minSize, width, height); total += width * height; } // 估算maxTextureSize值 float guessArea = EditorCommonUtils.ToLargerPOT(total, 4); int guessSize = Mathf.RoundToInt(Mathf.Sqrt(guessArea)); // 如果填充率太低,将估值尺寸减半 if (total <= guessArea * 0.625f) { guessSize /= 2; } // 用估值尺寸尝试打图集 guessSize = Mathf.Max(guessSize, Mathf.RoundToInt(EditorCommonUtils.ToLargerPOT(minSize, 2))); foreach (string platform in PLATFORMS) { TextureImporterPlatformSettings patformSettings = SpriteAtlasExtensions.GetPlatformSettings(spriteAtlas, platform); if (patformSettings.maxTextureSize != guessSize) { patformSettings.maxTextureSize = guessSize; SpriteAtlasExtensions.SetPlatformSettings(spriteAtlas, patformSettings); } } SpriteAtlasUtility.PackAtlases(new SpriteAtlas[] { spriteAtlas }, EditorUserBuildSettings.activeBuildTarget); // 计算图集的实际面积 Texture2D[] atlasTextures = (Texture2D[])getPreviewTexturesMI.Invoke(null, new object[] { spriteAtlas }); int area = 0; for (int i = 0; i < atlasTextures.Length; i++) { area += atlasTextures[i].width * atlasTextures[i].height; } // 如果估值尺寸效果一般,将其翻倍 if (area > guessSize * guessSize * 2.5f) { foreach (string platform in PLATFORMS) { TextureImporterPlatformSettings patformSettings = SpriteAtlasExtensions.GetPlatformSettings(spriteAtlas, platform); patformSettings.maxTextureSize = Mathf.Min(guessSize * 2, MAX_TEXTURE_SIZE); SpriteAtlasExtensions.SetPlatformSettings(spriteAtlas, patformSettings); } SpriteAtlasUtility.PackAtlases(new SpriteAtlas[] { spriteAtlas }, EditorUserBuildSettings.activeBuildTarget); } else if (area > guessSize * guessSize * 1.5f && area <= guessSize * guessSize * 2) { TextureImporterPlatformSettings patformSettings = SpriteAtlasExtensions.GetPlatformSettings(spriteAtlas, "Android"); patformSettings.maxTextureSize = Mathf.Min(guessSize * 2, MAX_TEXTURE_SIZE); SpriteAtlasExtensions.SetPlatformSettings(spriteAtlas, patformSettings); SpriteAtlasUtility.PackAtlases(new SpriteAtlas[] { spriteAtlas }, EditorUserBuildSettings.activeBuildTarget); } SpriteAtlas lowSpriteAtlas = AssetDatabase.LoadAssetAtPath <SpriteAtlas>(atlasFile.Replace(EditorResourcePaths.ATLAS_SUFFIX, LOW_ATLAS_SUFFIX)); foreach (string platform in PLATFORMS) { TextureImporterPlatformSettings patformSettings = SpriteAtlasExtensions.GetPlatformSettings(spriteAtlas, platform); TextureImporterPlatformSettings lowPatformSettings = SpriteAtlasExtensions.GetPlatformSettings(lowSpriteAtlas, platform); lowPatformSettings.maxTextureSize = patformSettings.maxTextureSize; SpriteAtlasExtensions.SetPlatformSettings(lowSpriteAtlas, lowPatformSettings); } } DebugUtil.Log("SetAtlasMaxSize Done!"); }
public static void CreateSpriteAtlas(string src_path, string dst_path, string atlas_name, bool includeInBuild = true) { if (string.IsNullOrEmpty(src_path) || string.IsNullOrEmpty(dst_path) || string.IsNullOrEmpty(atlas_name)) { Log.LogError($"无法创建图集,路径为空. src_path={src_path} ,dst_path={dst_path} ,atlas_name={atlas_name}"); return; } if (!src_path.EndsWith("/")) { src_path = src_path + "/"; } var full_path = Path.GetFullPath(src_path); if (!Directory.Exists(full_path)) { Log.Info($"不创建图集,{src_path}下无atlas文件夹"); return; } var assets = Directory.GetFiles(full_path, "*.png"); //这里无法过滤两种类型 *.png|*.jpg if (assets == null || assets.Length == 0) { Log.Info($"{src_path}下无图片,不生成图集"); return; } SpriteAtlas spriteAtlas = new SpriteAtlas(); if (!dst_path.EndsWith("/")) { dst_path = dst_path + "/"; } if (!Directory.Exists(dst_path)) { Directory.CreateDirectory(dst_path); } AssetDatabase.CreateAsset(spriteAtlas, dst_path + atlas_name + ".spriteatlas"); foreach (var path in assets) { var t = src_path + Path.GetFileName(path); var o = AssetDatabase.LoadAssetAtPath <Sprite>(t); if (o != null) { SpriteAtlasExtensions.Add(spriteAtlas, new Object[] { o }); } } //TODO 根据平台设置图集格式 //EditorUserBuildSettings.activeBuildTarget var atlasSetting = spriteAtlas.GetPlatformSettings(KResourceModule.GetBuildPlatformName()); atlasSetting.maxTextureSize = 2048; atlasSetting.textureCompression = TextureImporterCompression.Compressed; atlasSetting.format = TextureImporterFormat.Automatic; spriteAtlas.SetIncludeInBuild(includeInBuild); spriteAtlas.SetPlatformSettings(atlasSetting); SpriteAtlasUtility.PackAtlases(new SpriteAtlas[] { spriteAtlas }, EditorUserBuildSettings.activeBuildTarget, false); AssetDatabase.SaveAssets(); Log.Info($"创建图集{spriteAtlas.name}完成,包含{spriteAtlas.spriteCount}个图片"); }