Пример #1
0
        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);
        }
Пример #2
0
        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);
        }