当前位置: 代码迷 >> 综合 >> TexturePacker 图集转成 Unity Sprite
  详细解决方案

TexturePacker 图集转成 Unity Sprite

热度:27   发布时间:2024-01-10 07:30:36.0
  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;//生成SpriteList<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游戏来说非常重要,能够有效的减少填充率,提高游戏性能。

  相关解决方案