private void CreateSprites(ImportedAnimationSheet animationSheet, AnimationImportJob job) { if (animationSheet == null) { return; } string imageAssetFile = job.ImageAssetFilename; TextureImporter importer = AssetImporter.GetAtPath(imageAssetFile) as TextureImporter; // Apply texture import settings if there are no previous ones if (!animationSheet.HasPreviousTextureImportSettings) { importer.textureType = TextureImporterType.Sprite; importer.spritePixelsPerUnit = SharedData.SpritePixelsPerUnit; importer.mipmapEnabled = false; importer.filterMode = FilterMode.Point; #if UNITY_5_5_OR_NEWER importer.textureCompression = TextureImporterCompression.Uncompressed; #else importer.textureFormat = TextureImporterFormat.AutomaticTruecolor; #endif } // Create sub sprites for this file according to the AsepriteAnimationInfo if (animationSheet.UsePivot) { importer.spritesheet = animationSheet.GetSpriteSheet(SpriteAlignment.Custom, animationSheet.Pivot); } else { importer.spritesheet = animationSheet.GetSpriteSheet(SharedData.SpriteAlignment, new Vector2(SharedData.SpriteAlignmentCustomX, SharedData.SpriteAlignmentCustomY)); } // Reapply old import settings (pivot settings for sprites) if (animationSheet.HasPreviousTextureImportSettings) { animationSheet.PreviousImportSettings.ApplyPreviousTextureImportSettings(importer); } // These values will be set in any case, not influenced by previous import settings importer.spriteImportMode = SpriteImportMode.Multiple; importer.maxTextureSize = animationSheet.MaxTextureSize; EditorUtility.SetDirty(importer); try { importer.SaveAndReimport(); } catch (Exception e) { Debug.LogWarning("There was a problem with applying settings to the generated sprite file: " + e.ToString()); } AssetDatabase.ImportAsset(imageAssetFile, ImportAssetOptions.ForceUpdate); Sprite[] createdSprites = GetAllSpritesFromAssetFile(imageAssetFile); animationSheet.ApplyCreatedSprites(createdSprites); }
private void CreateSprites(ImportedAnimationSheet animationSheet) { string imageFile = GetImageAssetFilename(animationSheet.basePath, animationSheet.name); TextureImporter importer = AssetImporter.GetAtPath(imageFile) as TextureImporter; // apply texture import settings if there are no previous ones if (!animationSheet.hasPreviousTextureImportSettings) { importer.textureType = TextureImporterType.Sprite; importer.spritePixelsPerUnit = sharedData.spritePixelsPerUnit; importer.mipmapEnabled = false; importer.filterMode = FilterMode.Point; importer.textureFormat = TextureImporterFormat.AutomaticTruecolor; } // create sub sprites for this file according to the AsepriteAnimationInfo importer.spritesheet = animationSheet.GetSpriteSheet( sharedData.spriteAlignment, sharedData.spriteAlignmentCustomX, sharedData.spriteAlignmentCustomY); // reapply old import settings (pivot settings for sprites) if (animationSheet.hasPreviousTextureImportSettings) { animationSheet.previousImportSettings.ApplyPreviousTextureImportSettings(importer); } // these values will be set in any case, not influenced by previous import settings importer.spriteImportMode = SpriteImportMode.Multiple; importer.maxTextureSize = animationSheet.maxTextureSize; EditorUtility.SetDirty(importer); try { importer.SaveAndReimport(); } catch (Exception e) { Debug.LogWarning("There was a problem with applying settings to the generated sprite file: " + e.ToString()); } AssetDatabase.ImportAsset(imageFile, ImportAssetOptions.ForceUpdate); Sprite[] createdSprites = GetAllSpritesFromAssetFile(imageFile); animationSheet.ApplyCreatedSprites(createdSprites); }
private void CreateSprites(ImportedAnimationSheet animationSheet, AnimationImportJob job) { if (animationSheet == null) { return; } var spriteInfos = new List <NamedSpriteInfo>(); animationSheet.CreateSpriteInfos( in sharedData.customPivotSettings, spriteInfos ); var siMap = new Dictionary <uint, NamedSpriteInfo>(); var nameMap = new Dictionary <string, string>(); var outputTexs = new Dictionary <Texture2D, SpriteMetaData[]>(); if (sharedData.doTrim) { var srcTex = animationSheet.srcTex; if (srcTex == null) { return; //? } var trimIndexList = new List <uint>(); for (int i = 0; i < spriteInfos.Count; ++i) { job.SetProgress(0.4f + i / (10.0f * spriteInfos.Count), "trimming sprite " + i.ToString()); var trimmed = spriteInfos[i].info.Trim(sharedData.trimColor, sharedData.trimMargin.x, sharedData.trimMargin.y); var trimmedCrc = trimmed.GetCrc32(); if (!siMap.ContainsKey(trimmedCrc)) { siMap[trimmedCrc] = new NamedSpriteInfo { name = spriteInfos[i].name, info = trimmed, }; trimIndexList.Add(trimmedCrc); } nameMap[spriteInfos[i].name] = siMap[trimmedCrc].name; } trimIndexList.Sort((lhsi, rhsi) => { var lhs = siMap[lhsi].info.frame; var rhs = siMap[rhsi].info.frame; if (lhs.width == rhs.width) { return(lhs.height - rhs.height); } return(rhs.width - lhs.width); // return (rhs.width + rhs.height) - (lhs.width + lhs.height); }); var boxs = new Luxko.Geometry.SkylinePacker.Box[trimIndexList.Count]; for (int i = 0; i < trimIndexList.Count; ++i) { var spriteInfo = siMap[trimIndexList[i]].info; boxs[i].w = spriteInfo.frame.width + sharedData.trimSpacing.x; boxs[i].h = spriteInfo.frame.height + sharedData.trimSpacing.y; } job.SetProgress(0.5f, "caculate packing info"); var packOutput = new Luxko.Geometry.SkylinePacker.Output[trimIndexList.Count]; var packBin = new Luxko.Geometry.SkylinePacker.Box { w = sharedData.trimTexSize.x, h = sharedData.trimTexSize.y }; var sky = new Luxko.Geometry.SkylinePacker.Sky(packBin, sharedData.PackSpreadFactor > 0 ? sharedData.PackSpreadFactor : (int)(packBin.h * 0.75f), boxs); for (int i = 0; i < boxs.Length; ++i) { sky.PackNext(out packOutput[i]); } var sheetBuf = new List <KeyValuePair <Texture2D, List <SpriteMetaData> > >(); for (int i = 0; i < packOutput.Length; ++i) { while (sheetBuf.Count <= packOutput[i].binIndex) { var newTex = new Texture2D(sharedData.trimTexSize.x, sharedData.trimTexSize.y, TextureFormat.RGBA32, false); // TODO: proper linear flag ClearTexture(newTex, Color.clear); sheetBuf.Add(new KeyValuePair <Texture2D, List <SpriteMetaData> >( newTex, new List <SpriteMetaData>() )); } var tSheet = sheetBuf[packOutput[i].binIndex]; var ti = new SpritePacker.SpriteInfo { tex = tSheet.Key, frame = new RectInt(packOutput[i].pos.x, packOutput[i].pos.y, 0, 0) }; var tis = siMap[trimIndexList[packOutput[i].boxIndex]]; job.SetProgress(0.55f + i / (20.0f * trimIndexList.Count), string.Format("packing {0} at {1} to {2}", tis.name, tis.info.frame, ti.frame.position)); tis.info.TryCopyTo(ref ti); tSheet.Value.Add(new SpriteMetaData { name = tis.name, rect = new Rect(ti.frame.x, ti.frame.y, ti.frame.width, ti.frame.height), alignment = (int)SpriteAlignment.Custom, pivot = ti.pivotN, }); } foreach (var kv in sheetBuf) { outputTexs.Add(kv.Key, kv.Value.ToArray()); } Texture2D.DestroyImmediate(srcTex, true); } else { var targetTex = animationSheet.srcTex; if (spriteInfos.Count > 0) { var smds = new SpriteMetaData[spriteInfos.Count]; for (int si = 0; si < spriteInfos.Count; ++si) { smds[si] = new SpriteMetaData { name = spriteInfos[si].name, rect = new Rect(spriteInfos[si].info.frame.x, spriteInfos[si].info.frame.y, spriteInfos[si].info.frame.width, spriteInfos[si].info.frame.height), alignment = (int)SpriteAlignment.Custom, pivot = spriteInfos[si].info.pivotN, }; } outputTexs.Add(targetTex, smds); spriteInfos.Clear(); } } int kvi = 0; var spriteDict = new Dictionary <string, Sprite>(); foreach (var kv in outputTexs) { job.SetProgress(0.6f + 0.1f * (kvi / (float)outputTexs.Count), "saving textures " + kvi); string imgPath; if (kvi <= 0) { imgPath = string.Format("{0}/{1}.png", job.directoryPathForSprites, job.name); } else { imgPath = string.Format("{0}/{1}_{2}.png", job.directoryPathForSprites, job.name, kvi); } kvi++; SaveAsPng(kv.Key, imgPath); AssetDatabase.Refresh(); AssetDatabase.ImportAsset(imgPath, ImportAssetOptions.ForceUpdate); var importer = AssetImporter.GetAtPath(imgPath) as TextureImporter; importer.textureType = TextureImporterType.Sprite; importer.spritePixelsPerUnit = sharedData.spritePixelsPerUnit; importer.mipmapEnabled = false; importer.filterMode = FilterMode.Point; importer.textureCompression = TextureImporterCompression.Uncompressed; // TODO: smart update: how to keep old references alive? importer.spritesheet = kv.Value; importer.spriteImportMode = SpriteImportMode.Multiple; importer.maxTextureSize = 2048; importer.textureCompression = TextureImporterCompression.CompressedHQ; EditorUtility.SetDirty(importer); importer.SaveAndReimport(); AssetDatabase.ImportAsset(imgPath, ImportAssetOptions.ForceUpdate); var assets = AssetDatabase.LoadAllAssetsAtPath(imgPath); foreach (var item in assets) { if (item is Sprite) { var sprite = (Sprite)item; spriteDict[sprite.name] = sprite; } } } if (nameMap.Count != 0) { var replaceMap = new Dictionary <string, Sprite>(); foreach (var kv in nameMap) { replaceMap[kv.Key] = spriteDict[kv.Value]; } spriteDict = replaceMap; } foreach (var kv in outputTexs) { Texture2D.DestroyImmediate(kv.Key); } outputTexs.Clear(); animationSheet.ApplyCreatedSprites(spriteDict); }