TexturePacker 图集转成 Unity Sprite

  1. 首先在 Texture Packer 将图片导出成 Json格式,然后将导出的 图片和json文件放到项目中同一目录下。
  2. 将工具放到工程的 Editor 目录下。
  3. 选中导入的贴图,右键选择转换菜单”TexturePacker–>UnitySprite”。
using UnityEngine;
using System.Collections;
using UnityEditor;
using System.Collections.Generic;

[System.Serializable]
public class V4
{
    public int x;
    public int y;
    public int w;
    public int h;

    public V4() { }
}

[System.Serializable]
public class V2
{
    public int w;
    public int h;

    public V2() { }
}

[System.Serializable]
public class Frame
{
    public string filename;
    public V4 frame;
    public bool rotated;
    public bool trimmed;
    public V4 spriteSourceSize;
    public V2 sourceSize;

    public Frame() { }
}

[System.Serializable]
public class Meta
{
    public string image;
    public V2 size;
}

[System.Serializable]
public class Frames
{
    public List<Frame> frames = new List<Frame>();
    public Meta meta;
    public Frames() { }
}

public class TexturePackerImporterEditor
{
    Frames frames = null;
    Texture2D texFile = null;

    [MenuItem("Assets/TexturePacker-->UnitySprite")]
    static void ShowWindow()
    {
        if (Selection.activeObject == null)
            return;

        Texture2D t = Selection.activeObject as Texture2D;
        if (t == null)
        {
            EditorUtility.DisplayDialog("错误", "只能转换Png文件!", "ok");
            return;
        }

        TexturePackerImporterEditor tpie = new TexturePackerImporterEditor();
        tpie.texFile = t;

        string path = AssetDatabase.GetAssetPath(tpie.texFile);
        var jsonFile = AssetDatabase.LoadAssetAtPath(System.IO.Path.ChangeExtension(path, "json"), typeof(TextAsset)) as TextAsset;
        if (jsonFile == null)
        {
            EditorUtility.DisplayDialog("提示", "Json 文件必须放在 Png 文件同目录下", "ok");
            return;
        }

        tpie.frames = JsonUtility.FromJson<Frames>(jsonFile.text);
        tpie.ImportTexture();
    }

    void ImportTexture()
    {
        string _texPath = AssetDatabase.GetAssetPath(texFile);
        TextureImporter ti = TextureImporter.GetAtPath(_texPath) as TextureImporter;

        //生成Sprite
        List<SpriteMetaData> sps = new List<SpriteMetaData>();

        foreach (Frame f in frames.frames)
        {
            SpriteMetaData md = new SpriteMetaData();

            int width = f.rotated ? f.frame.h : f.frame.w;
            int height = f.rotated ? f.frame.w : f.frame.h;

            int x = f.frame.x;

            //TexturePacker以左上为原点,Unity以左下为原点
            int y = frames.meta.size.h - height - f.frame.y;

            md.rect = new Rect(x, y, width, height);
            md.pivot = md.rect.center;
            md.name = System.IO.Path.ChangeExtension(f.filename, null);

            sps.Add(md);
        }

        ti.textureType = TextureImporterType.Sprite;
        ti.spriteImportMode = SpriteImportMode.Multiple;
        ti.spritesheet = sps.ToArray();

        AssetDatabase.ImportAsset(_texPath, ImportAssetOptions.ForceUncompressedImport);
    }

}

另外,Asset Store 上有免费的Texture Packer Importer 插件,支持tpsheet格式的导入,同时会根据图片的形状,自动生成相应的网格,这对于2D游戏来说非常重要,能够有效的减少填充率,提高游戏性能。

猜你喜欢

转载自blog.csdn.net/salvare/article/details/82712466