public static void UnpackToSprite(UnityEngine.Object spriteCollectionData, out SpritePackage sprites, string fileLocation = null) { OutClass <SpritePackage> resultSprites = new OutClass <SpritePackage>(); var iterator = UnpackToSpriteAsyncInternal(spriteCollectionData, resultSprites, fileLocation); while (iterator.MoveNext()) { } sprites = resultSprites.Value; }
public static IEnumerator DecomposeTK2DAnimation(UnityEngine.Object tk2dSpriteAnimation, string animationName = null) { //var data = GetCollectionData(tk2dSpriteCollection); if (animationName == null) { animationName = "DecomposedAnimation"; } var animationData = GetAnimationData(tk2dSpriteAnimation); Dictionary <int, SpriteCollectionData> spriteCollections = new Dictionary <int, SpriteCollectionData>(); Dictionary <int, SpritePackage> sprites = new Dictionary <int, SpritePackage>(); foreach (var clip in animationData.Clips) { foreach (var frame in clip.Frames) { if (!spriteCollections.ContainsKey(frame.SpriteCollectionRaw.GetInstanceID())) { spriteCollections.Add(frame.SpriteCollectionRaw.GetInstanceID(), GetCollectionData(frame.SpriteCollectionRaw)); OutClass <SpritePackage> outputSprites = new OutClass <SpritePackage>(); //List<Sprite> sprites = new List<Sprite>(); yield return(UnpackToSpriteAsyncInternal(frame.SpriteCollectionRaw, outputSprites, "Assets\\" + animationName)); sprites.Add(frame.SpriteCollectionRaw.GetInstanceID(), outputSprites.Value); } } } WeaverAnimationData data = ScriptableObject.CreateInstance <WeaverAnimationData>(); foreach (var clipRaw in animationData.Clips) { if (clipRaw.Name == null || clipRaw.Name == "") { continue; } var clip = new WeaverAnimationData.Clip { FPS = clipRaw.FPS, LoopStart = clipRaw.LoopStart, Name = clipRaw.Name, }; switch (clipRaw.WrapMode) { case WrapMode.Loop: clip.WrapMode = WeaverAnimationData.WrapMode.Loop; break; case WrapMode.LoopSection: clip.WrapMode = WeaverAnimationData.WrapMode.LoopSection; break; case WrapMode.Once: clip.WrapMode = WeaverAnimationData.WrapMode.Once; break; case WrapMode.PingPong: clip.WrapMode = WeaverAnimationData.WrapMode.PingPong; break; case WrapMode.RandomFrame: clip.WrapMode = WeaverAnimationData.WrapMode.RandomFrame; break; case WrapMode.RandomLoop: clip.WrapMode = WeaverAnimationData.WrapMode.RandomLoop; break; case WrapMode.Single: clip.WrapMode = WeaverAnimationData.WrapMode.SingleFrame; break; default: break; } foreach (var frameRaw in clipRaw.Frames) { clip.AddFrame(sprites[frameRaw.SpriteCollectionRaw.GetInstanceID()].GetSprite(frameRaw.SpriteID)); } data.AddClip(clip); } AssetDatabase.CreateAsset(data, "Assets/" + animationName + "/" + animationName + ".asset"); }
static IEnumerator UnpackToSpriteAsyncInternal(UnityEngine.Object tk2dSpriteCollection, OutClass <SpritePackage> resultSprites = null, string fileLocation = null) { //TODO : READ ACTUAL IMAGE SIZE AND RESIZE TEXTURE TO THAT SIZE var data = GetCollectionData(tk2dSpriteCollection); using (var resizeContext = new ResizeTextureContext(data.MainTexture)) { List <Texture2D> spriteTextures = new List <Texture2D>(); List <tk2DSpriteData> sprites = new List <tk2DSpriteData>(); //yield return null; foreach (var spriteData in ReadSpritesFromData(data)) { sprites.Add(spriteData); spriteTextures.Add(spriteData.Texture); yield return(null); } //Debug.Log("Creating Texture with = " + new Vector2Int(data.MainTexture.width,data.MainTexture.height)); Texture2D atlas = new Texture2D(data.MainTexture.width, data.MainTexture.height); string atlasName = data.MainTexture.name + "_unpacked"; atlas.name = atlasName; var uvCoords = atlas.PackTextures(spriteTextures.ToArray(), 1, Mathf.Max(data.MainTexture.width, data.MainTexture.height), false); //WeaverLog.Log("Atlas Size = " + atlas.width + " , " + atlas.height); var pngData = atlas.EncodeToPNG(); if (fileLocation == null) { fileLocation = "Assets\\" + atlasName + ".png"; } else if (!fileLocation.EndsWith(".png")) { fileLocation += "\\" + atlasName + ".png"; } var fileInfo = new FileInfo(fileLocation); if (!fileInfo.Directory.Exists) { fileInfo.Directory.Create(); } using (var fileTest = File.Create(fileLocation)) { fileTest.Write(pngData, 0, pngData.GetLength(0)); } AssetDatabase.ImportAsset(fileLocation); yield return(null); //DefaultTexturePlatform var importer = (TextureImporter)AssetImporter.GetAtPath(fileLocation); var platformSettings = importer.GetPlatformTextureSettings("DefaultTexturePlatform"); platformSettings.maxTextureSize = Mathf.Max(data.MainTexture.width, data.MainTexture.height); importer.SetPlatformTextureSettings(platformSettings); float averagePPU = 0f; foreach (var sprite in sprites) { averagePPU += sprite.PixelsPerUnit; //yield return null; } averagePPU /= sprites.Count; importer.spriteImportMode = SpriteImportMode.Multiple; importer.spritePixelsPerUnit = averagePPU; List <SpriteMetaData> metas = new List <SpriteMetaData>(); Dictionary <Rect, int> rectToId = new Dictionary <Rect, int>(); //foreach (var sprite in sprites) for (int i = 0; i < sprites.Count; i++) { var sprite = sprites[i]; var uv = uvCoords[i]; //var textureSize = new Vector2(sprite.Texture.width, sprite.Texture.height); //WeaverLog.Log("Sprite Coords for " + sprite.Texture.name + " = " + uvCoords[i]); metas.Add(new SpriteMetaData() { name = sprite.Name, border = Vector4.zero, pivot = new Vector2(1 - sprite.Pivot.x, 1 - sprite.Pivot.y), alignment = (int)SpriteAlignment.Custom, rect = new Rect(uv.x * atlas.width, uv.y * atlas.height, uv.width * atlas.width, uv.height * atlas.height) }); rectToId.Add(metas[metas.Count - 1].rect, i); } importer.spritesheet = metas.ToArray(); Debug.Log("Unpacked " + metas.Count + " different sprites"); importer.SaveAndReimport(); yield return(null); EditorUtility.ClearProgressBar(); var finalTexture = AssetDatabase.LoadAssetAtPath <Texture2D>(fileLocation); if (resultSprites != null) { var package = new SpritePackage(finalTexture); var finalSprites = GetSpritesFromTexture(finalTexture); foreach (var finalSprite in finalSprites) { var definition = data.Definitions.FirstOrDefault(d => d.Name == finalSprite.name); if (definition.Positions != default(Vector2[])) { package.AddSprite(Array.IndexOf(data.Definitions, definition), finalSprite); } } /*foreach (var finalSprite in finalSprites) * { * if (rectToId.ContainsKey(finalSprite.rect)) * { * //spriteList[rectToId[finalSprite.rect]] = finalSprite; * package.AddSprite(rectToId[finalSprite.rect], finalSprite); * } * }*/ resultSprites.Value = package; } } }