Exemplo n.º 1
0
    //导入
    public override void OnImportAsset(AssetImportContext ctx)
    {
        name = GetFileName(ctx.assetPath);

        AseFile aseFile = ReadAseFile(ctx.assetPath);

        Texture2D[] frames = aseFile.GetFrames();

        //翻转贴图
        //if (textureSettings.flipTexture) {
        //	for (int i = 0; i < frames.Length; i++) {
        //		frames[i] = FlipTexture(frames[i]);
        //	}
        //}

        SpriteImportData[] spriteImportData = new SpriteImportData[0];
        Vector2Int         size             = new Vector2Int(aseFile.Header.Width, aseFile.Header.Height);

        atlas            = AseAtlasGenerator.GenerateAtlas(frames, out spriteImportData, size, textureSettings);
        atlas.filterMode = FilterMode.Point;
        ctx.AddObjectToAsset("Texture", atlas);

        //生成贴图文件
        GenerateSprites(ctx, aseFile, spriteImportData);

        ctx.SetMainObject(atlas);
    }
Exemplo n.º 2
0
        // replaces color to transparent
        public Texture2D GenerateAtlas(Texture2D[] sprites, out SpriteImportData[] spriteData, int cols, int rows,
                                       Color mask, bool baseTwo = true)
        {
            var spriteImportData = new List <SpriteImportData>();

            var width  = cols * spriteSize.x;
            var height = rows * spriteSize.y;

            if (baseTwo)
            {
                var baseTwoValue = CalculateNextBaseTwoValue(Math.Max(width, height));
                width  = baseTwoValue;
                height = baseTwoValue;
            }

            // blank transparent canvas
            var atlas = Texture2DUtil.CreateTransparentTexture(width, height);
            var index = 0;

            // step through each pixel
            for (var row = 0; row < rows; row++)
            {
                for (var col = 0; col < cols; col++)
                {
                    Rect spriteRect = new Rect(col * spriteSize.x, atlas.height - ((row + 1) * spriteSize.y),
                                               spriteSize.x, spriteSize.y);

                    // change pixel mask to transparent
                    Color[] pixelPallete = ReplaceMaskToTransparent(mask, sprites[index].GetPixels());
                    atlas.SetPixels((int)spriteRect.x, (int)spriteRect.y, (int)spriteRect.width,
                                    (int)spriteRect.height, pixelPallete);
                    atlas.Apply();

                    var importData = new SpriteImportData
                    {
                        rect   = spriteRect,
                        pivot  = textureSettings.spritePivot,
                        border = Vector4.zero,
                        name   = index.ToString()
                    };

                    spriteImportData.Add(importData);

                    index++;
                    if (index >= sprites.Length)
                    {
                        break;
                    }
                }

                if (index >= sprites.Length)
                {
                    break;
                }
            }

            spriteData = spriteImportData.ToArray();
            return(atlas);
        }
Exemplo n.º 3
0
        public override void OnImportAsset(AssetImportContext ctx)
        {
            name = GetFileName(ctx.assetPath);

            AseFile aseFile    = ReadAseFile(ctx.assetPath);
            int     frameCount = aseFile.Header.Frames;

            SpriteAtlasBuilder atlasBuilder = new SpriteAtlasBuilder(textureSettings, aseFile.Header.Width, aseFile.Header.Height);

            Texture2D[] frames = null;
            if (importType != AseFileImportType.LayerToSprite)
            {
                frames = aseFile.GetFrames();
            }
            else
            {
                frames = aseFile.GetLayersAsFrames();
            }

            SpriteImportData[] spriteImportData = new SpriteImportData[0];

            //if (textureSettings.transparentMask)
            //{
            //    atlas = atlasBuilder.GenerateAtlas(frames, out spriteImportData, textureSettings.transparentColor, false);
            //}
            //else
            //{
            //    atlas = atlasBuilder.GenerateAtlas(frames, out spriteImportData, false);

            //}

            atlas = atlasBuilder.GenerateAtlas(frames, out spriteImportData, textureSettings.transparentMask, false);


            atlas.filterMode          = textureSettings.filterMode;
            atlas.alphaIsTransparency = false;
            atlas.wrapMode            = TextureWrapMode.Clamp;
            atlas.name = "Texture";

            ctx.AddObjectToAsset("Texture", atlas);

            ctx.SetMainObject(atlas);

            switch (importType)
            {
            case AseFileImportType.LayerToSprite:
            case AseFileImportType.Sprite:
                ImportSprites(ctx, aseFile, spriteImportData);
                break;

            case AseFileImportType.Tileset:
                ImportTileset(ctx, atlas);
                break;
            }

            ctx.SetMainObject(atlas);
        }
Exemplo n.º 4
0
        private static SpriteImportData[] ConvertAseFileSpriteImportDataToUnity(AseFileSpriteImportData[] spriteImportData)
        {
            SpriteImportData[] importData = new SpriteImportData[spriteImportData.Length];

            for (int i = 0; i < spriteImportData.Length; i++)
            {
                importData[i] = spriteImportData[i].ToSpriteImportData();
            }

            return(importData);
        }
Exemplo n.º 5
0
        private static Sprite CreateNamedSprite(
            string name,
            Texture2D texture,
            SpriteImportData importData,
            AsepriteImporterSettings settings)
        {
            var sprite = Sprite.Create(
                texture,
                importData.rect,
                importData.pivot,
                settings.PixelsPerUnit,
                settings.ExtrudeEdges,
                settings.MeshType,
                importData.border,
                settings.GeneratePhysicsShape);

            sprite.name = name;
            return(sprite);
        }
Exemplo n.º 6
0
    static Texture2D GenerateAtlas(Texture2D[] sprites, out SpriteImportData[] spriteData, Vector2Int spriteSize, AseTextureSettings textureSettings, int cols, int rows)
    {
        var spriteImportData = new List <SpriteImportData>();

        var width  = cols * spriteSize.x;
        var height = rows * spriteSize.y;

        var atlas = CreateTransparentTexture(width, height);
        var index = 0;

        for (var row = 0; row < rows; row++)
        {
            for (var col = 0; col < cols; col++)
            {
                Rect spriteRect = new Rect(col * spriteSize.x, atlas.height - ((row + 1) * spriteSize.y), spriteSize.x, spriteSize.y);
                atlas.SetPixels((int)spriteRect.x, (int)spriteRect.y, (int)spriteRect.width, (int)spriteRect.height, sprites[index].GetPixels());
                atlas.Apply();

                var importData = new SpriteImportData {
                    rect   = spriteRect,
                    pivot  = textureSettings.spritePivot,
                    border = Vector4.zero,
                    name   = index.ToString()
                };

                spriteImportData.Add(importData);

                index++;
                if (index >= sprites.Length)
                {
                    break;
                }
            }
            if (index >= sprites.Length)
            {
                break;
            }
        }

        spriteData = spriteImportData.ToArray();
        return(atlas);
    }
        private void GenerateSeparateTexturesFromLayers(AssetImportContext ctx, AseFile aseFile)
        {
            SpriteAtlasBuilder atlasBuilder = new SpriteAtlasBuilder(textureSettings, aseFile.Header.Width, aseFile.Header.Height);

            SpriteImportData[] spriteImportData = new SpriteImportData[0];
            List <LayerChunk>  layers           = aseFile.GetChunks <LayerChunk>();

            for (int i = 0; i < layers.Count; i++)
            {
                List <Texture2D> layerFrames = aseFile.GetLayerTexture(i, layers[i]);
                Texture2D        layerAtlas;
                layerAtlas                     = atlasBuilder.GenerateAtlas(layerFrames.ToArray(), out spriteImportData, textureSettings.transparentMask, false);
                layerAtlas.filterMode          = textureSettings.filterMode;
                layerAtlas.alphaIsTransparency = false;
                layerAtlas.wrapMode            = TextureWrapMode.Clamp;
                layerAtlas.name                = layers[i].LayerName;
                //AssetDatabase.CreateAsset( layerAtlas, Path.GetDirectoryName( ctx.assetPath ) + "/" + Path.GetFileNameWithoutExtension( ctx.assetPath ) + "-" + layers[i].LayerName + ".asset" );
                ctx.AddObjectToAsset(layers[i].LayerName, layerAtlas);
                if (i == 0)
                {
                    // assign member "atlas" for ImportSprites() etc below
                    atlas = layerAtlas;
                    ctx.SetMainObject(layerAtlas);
                }
            }

            switch (importType)
            {
            case AseFileImportType.LayerToSprite:
            case AseFileImportType.Sprite:
                ImportSprites(ctx, aseFile, spriteImportData);
                break;

            case AseFileImportType.Tileset:
                ImportTileset(ctx);
                break;
            }
        }
Exemplo n.º 8
0
        public Texture2D GenerateAtlas(Texture2D[] sprites, out SpriteImportData[] spriteData, int cols, int rows,
                                       bool baseTwo = true)
        {
            var spriteImportData = new List <SpriteImportData>();

            var width  = cols * spriteSize.x;
            var height = rows * spriteSize.y;

            if (baseTwo)
            {
                var baseTwoValue = CalculateNextBaseTwoValue(Math.Max(width, height));
                width  = baseTwoValue;
                height = baseTwoValue;
            }

            var atlas = Texture2DUtil.CreateTransparentTexture(width, height);
            var index = 0;

            for (var row = 0; row < rows; row++)
            {
                for (var col = 0; col < cols; col++)
                {
                    Rect spriteRect = new Rect(col * spriteSize.x, atlas.height - ((row + 1) * spriteSize.y),
                                               spriteSize.x, spriteSize.y);

                    switch (textureSettings.mirror)
                    {
                    case MirrorOption.X:
                        sprites[index] = FlipAtlas(sprites[index]);
                        break;

                    case MirrorOption.Y:
                        sprites[index] = FlipAtlas(sprites[index], true);
                        break;
                    }

                    atlas.SetPixels((int)spriteRect.x, (int)spriteRect.y, (int)spriteRect.width,
                                    (int)spriteRect.height, sprites[index].GetPixels());

                    atlas.Apply();

                    var importData = new SpriteImportData
                    {
                        rect   = spriteRect,
                        pivot  = textureSettings.spritePivot,
                        border = Vector4.zero,
                        name   = index.ToString()
                    };

                    spriteImportData.Add(importData);

                    index++;
                    if (index >= sprites.Length)
                    {
                        break;
                    }
                }

                if (index >= sprites.Length)
                {
                    break;
                }
            }

            spriteData = spriteImportData.ToArray();
            return(atlas);
        }
Exemplo n.º 9
0
        public override void OnImportAsset(AssetImportContext ctx)
        {
            name = GetFileName(ctx.assetPath);

            AseFile aseFile = ReadAseFile(ctx.assetPath);

            //Debug.Log(string.Format("导入Ase动画文件:{0},帧间隔为{1}(相当于动画帧率{2})", name, aseFile.Header.Speed, Mathf.RoundToInt(1000 / aseFile.Header.Speed)));

            this.aseFile = aseFile;

            SpriteAtlasBuilder atlasBuilder = new SpriteAtlasBuilder(textureSettings, aseFile.Header.Width, aseFile.Header.Height);

            Texture2D[] frames;
            if (importType != AseFileImportType.LayerToSprite)
            {
                frames = aseFile.GetFrames();
            }
            else
            {
                frames = aseFile.GetLayersAsFrames();
            }

            SpriteImportData[] spriteImportData = new SpriteImportData[0];

            //if (textureSettings.transparentMask)
            //{
            //    atlas = atlasBuilder.GenerateAtlas(frames, out spriteImportData, textureSettings.transparentColor, false);
            //}
            //else
            //{
            //    atlas = atlasBuilder.GenerateAtlas(frames, out spriteImportData, false);

            //}

            //翻转贴图
            if (textureSettings.flipTexture)
            {
                for (int i = 0; i < frames.Length; i++)
                {
                    frames[i] = FlipTexture(frames[i]);
                }
            }

            atlas = atlasBuilder.GenerateAtlas(frames, out spriteImportData, textureSettings.transparentMask, false);

            atlas.filterMode          = textureSettings.filterMode;
            atlas.alphaIsTransparency = false;
            atlas.wrapMode            = TextureWrapMode.Clamp;
            atlas.name = "Texture";

            ctx.AddObjectToAsset("Texture", atlas);

            ctx.SetMainObject(atlas);

            switch (importType)
            {
            case AseFileImportType.LayerToSprite:
            case AseFileImportType.Sprite:
                ImportSprites(ctx, aseFile, spriteImportData);
                break;

            case AseFileImportType.Tileset:
                ImportTileset(ctx, atlas);
                break;
            }

            ctx.SetMainObject(atlas);
        }
Exemplo n.º 10
0
    //生成动画
    static void GenerateAnimation(string name, GifFile gif, string path, ref AnimationInfo info)
    {
        AnimationClip clip = new AnimationClip();

        clip.name      = name;
        clip.frameRate = 25;

        //创建动画文件
        string asset = string.Format("{0}/{1}.anim", path, name);

        AssetDatabase.CreateAsset(clip, asset);

        SpriteImportData[] spriteImportData = new SpriteImportData[0];
        Texture2D          atlas            = AtlasGenerator.GenerateAtlas(gif, out spriteImportData);

        atlas.filterMode = FilterMode.Point;
        atlas.name       = name;
        //AssetDatabase.AddObjectToAsset(atlas, clip);

        byte[] pngBytes  = atlas.EncodeToPNG();
        string atlasPath = string.Format("{0}/{1}.png", path, name);

        File.WriteAllBytes(atlasPath, pngBytes);
        AssetDatabase.Refresh();

        //生成的贴图
        Texture2D atlasObject = (Texture2D)AssetDatabase.LoadAssetAtPath(atlasPath, typeof(Texture2D));

        atlasObject.filterMode = FilterMode.Point;

        //生成贴图
        List <Sprite> sprites = GenerateSprites(atlasObject, spriteImportData, clip);

        //帧数
        int length = sprites.Count;

        EditorCurveBinding spriteBinding = new EditorCurveBinding();

        spriteBinding.type         = typeof(SpriteRenderer);
        spriteBinding.path         = "";
        spriteBinding.propertyName = "m_Sprite";

        //设置帧信息
        ObjectReferenceKeyframe[] spriteKeyFrames = new ObjectReferenceKeyframe[length + 1];

        float time = 0;

        for (int i = 0; i < length; i++)
        {
            ObjectReferenceKeyframe frame = new ObjectReferenceKeyframe();
            frame.time  = time;
            frame.value = sprites[i];
            time       += gif.textureList[i].m_delaySec;

            spriteKeyFrames[i] = frame;
        }

        //单独设置最后一帧
        float frameTime = 1f / clip.frameRate;
        ObjectReferenceKeyframe lastFrame = new ObjectReferenceKeyframe();

        lastFrame.time  = time - frameTime;
        lastFrame.value = sprites[length - 1];
        spriteKeyFrames[spriteKeyFrames.Length - 1] = lastFrame;

        AnimationUtility.SetObjectReferenceCurve(clip, spriteBinding, spriteKeyFrames);

        //循环设置
        AnimationClipSettings settings = AnimationUtility.GetAnimationClipSettings(clip);

        //循环设置
        //if (animationSetting.loop) {
        //    settings.loopTime = true;
        //    clip.wrapMode = WrapMode.Loop;
        //} else {
        //    settings.loopTime = false;
        //    clip.wrapMode = WrapMode.Once;
        //}

        AnimationUtility.SetAnimationClipSettings(clip, settings);

        info.animationClip = clip;
        info.texture       = atlasObject;
    }
Exemplo n.º 11
0
        public AsepriteAssets CreateAssets(AsepriteImporterSettings settings, string name)
        {
            var padding         = settings.InnerPadding;
            var paddedFrameSize = new Vector2Int(
                _frameSize.x + padding * 2,
                _frameSize.y + padding * 2);

            var spritesheet = CreateBlankSpritesheet(
                settings,
                paddedFrameSize,
                _frames.Count,
                out int cols);

            var sprites = new List <Sprite>();

            for (var i = 0; i < _frames.Count; ++i)
            {
                var frame = _frames[i];
                var col   = i % cols;
                var row   = Mathf.FloorToInt(i / (float)cols) + 1;

                var spriteRect = new Rect(
                    col * paddedFrameSize.x,
                    spritesheet.height - (row * paddedFrameSize.y),
                    paddedFrameSize.x,
                    paddedFrameSize.y);

                var framePixels = frame.GetFramePixels(_frameSize);
                spritesheet.SetPixels(
                    (int)spriteRect.x + padding,
                    (int)spriteRect.y + padding,
                    _frameSize.x,
                    _frameSize.y,
                    framePixels);

                var spriteData = new SpriteImportData
                {
                    rect  = spriteRect,
                    pivot = settings.PivotValue
                            + new Vector2(
                        padding / (float)paddedFrameSize.x,
                        padding / (float)paddedFrameSize.y),
                    name = i.ToString()
                };

                var sprite = CreateNamedSprite(
                    string.Format("{0}_{1}", name, spriteData.name),
                    spritesheet,
                    spriteData,
                    settings);

                sprites.Add(sprite);
            }
            spritesheet.Apply();

            var animations   = CreateAnimations(name, sprites, typeof(SpriteRenderer));
            var uiAnimName   = $"UI_{name}";
            var uiAnimations = CreateAnimations(uiAnimName, sprites, typeof(Image));

            return(new AsepriteAssets(
                       spritesheet,
                       sprites,
                       animations.Concat(uiAnimations)));
        }
Exemplo n.º 12
0
        private void GenerateSeparateTexturesFromLayers(AssetImportContext ctx, AseFile aseFile)
        {
            SpriteAtlasBuilder atlasBuilder = new SpriteAtlasBuilder(textureSettings, aseFile.Header.Width, aseFile.Header.Height);
            List <LayerChunk>  layers       = aseFile.GetChunks <LayerChunk>();

            SpriteImportData[] spriteImportData = new SpriteImportData[0];

            {
                List <Texture2D> layerFrames = aseFile.GetLayerTexture(0, layers[0]);
                Texture2D        layerAtlas  = atlasBuilder.GenerateAtlas(layerFrames.ToArray(), out spriteImportData, textureSettings.transparentMask, false);
                layerAtlas.filterMode          = textureSettings.filterMode;
                layerAtlas.alphaIsTransparency = false;
                layerAtlas.wrapMode            = TextureWrapMode.Clamp;
                layerAtlas.name = layers[0].LayerName;
                //string assetpath = Path.GetDirectoryName( ctx.assetPath ) + "/" + Path.GetFileNameWithoutExtension( ctx.assetPath ) + "-" + layers[0].LayerName + ".asset";
                //AssetDatabase.CreateAsset( layerAtlas, assetpath );
                ctx.AddObjectToAsset(layers[0].LayerName, layerAtlas);

                switch (importType)
                {
                case AseFileImportType.LayerToSprite:
                case AseFileImportType.Sprite:
                    ImportSprites(ctx, aseFile, spriteImportData, layerAtlas);
                    break;

                case AseFileImportType.Tileset:
                    ImportTileset(ctx, layerAtlas);
                    break;
                }
            }

            for (int i = 1; i < layers.Count; i++)
            {
                List <Texture2D> layerFrames = aseFile.GetLayerTexture(i, layers[i]);
                Texture2D        layerAtlas  = atlasBuilder.GenerateAtlas(layerFrames.ToArray(), out _, textureSettings.transparentMask, false);
                layerAtlas.filterMode          = textureSettings.filterMode;
                layerAtlas.alphaIsTransparency = false;
                layerAtlas.wrapMode            = TextureWrapMode.Clamp;
                layerAtlas.name = layers[i].LayerName;

                ctx.AddObjectToAsset(layers[i].LayerName, layerAtlas);

                /*
                 * string imagepath = Path.GetDirectoryName( ctx.assetPath ) + "/" + Path.GetFileNameWithoutExtension( ctx.assetPath ) + "-" + layers[i].LayerName + ".png";
                 *
                 * Texture2D texture = AssetDatabase.LoadAssetAtPath<Texture2D>( imagepath );
                 * if( texture == null )
                 * {
                 * File.WriteAllBytes( imagepath, layerAtlas.EncodeToPNG() );
                 * AssetDatabase.SaveAssets();
                 * }
                 * else
                 * {
                 *
                 * //texture.SetPixelData( layerAtlas.GetRawTextureData(), 0 );
                 * //EditorUtility.SetDirty( texture );
                 * }
                 * AssetDatabase.Refresh();
                 * Texture2D asdf = AssetDatabase.LoadAssetAtPath<Texture2D>( imagepath );
                 *
                 * //AssetDatabase.CreateAsset( layerAtlas, assetpath );
                 *
                 *
                 * TextureImporter textureImporter = GetAtPath( imagepath ) as TextureImporter;
                 * if( textureImporter != null )
                 * {
                 * SecondarySpriteTexture[] sst = new SecondarySpriteTexture[1];
                 * sst[0].name = "_NormalMap";
                 * sst[0].texture = layerAtlas;
                 * textureImporter.secondarySpriteTextures = sst;
                 *
                 * EditorUtility.SetDirty( textureImporter );
                 * textureImporter.SaveAndReimport();
                 *
                 * }
                 */
            }
        }