- 首先在 Texture Packer 将图片导出成 Json格式,然后将导出的 图片和json文件放到项目中同一目录下。
- 将工具放到工程的 Editor 目录下。
- 选中导入的贴图,右键选择转换菜单”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游戏来说非常重要,能够有效的减少填充率,提高游戏性能。