专业的编程技术博客社区

网站首页 > 博客文章 正文

unity开发工具-图集拆分(unity拆分模型)

baijin 2024-09-09 01:01:59 博客文章 12 ℃ 0 评论

本文主要实现功能是将一张Unity里的图集分拆成零散的小图并输出在同目录下。

用法:

  1. 在资源管理器中选中要处理的图集,并在检视窗口里把read/write开关打开,并应用
  2. 右键选择Tools/Sprite Slice

在Unity里默认的最大图片大小是2048x2048,超出这个大小会被缩小到这个尺寸之下。或者在图片导入参数里把最大尺寸改成较大的值。否则在采样时需要把坐标按照缩放比例进行转换后再采样。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEngine.UI;
using System.IO;
using System.Reflection;

public class SpriteSlice 
{

    /// <summary>
    /// 通过反射来获取资源的原始大小
    /// </summary>
    /// <param name="ti"></param>
    /// <param name="width"></param>
    /// <param name="height"></param>
    public static void GetTextureOriginalSize(TextureImporter ti, out int width, out int height)
    {
        if (ti == null)

        {
            width = 0;
            height = 0;
            return;
        }

        object[] args = new object[2] { 0, 0 };
        MethodInfo mi = typeof(TextureImporter).GetMethod("GetWidthAndHeight", BindingFlags.NonPublic | BindingFlags.Instance);
        mi.Invoke(ti, args);
        width = (int)args[0];
        height = (int)args[1];
    }



    [MenuItem("Assets/Tools/Sprite Slice")]
    public static void onSpriteSlice()
    {
        Texture2D target = Selection.activeObject as Texture2D;
        if (target != null) {
            string path = AssetDatabase.GetAssetPath(target);
            string targetAsset = Path.GetDirectoryName(path);
            string dir = Application.dataPath + "/../" + targetAsset;
            dir = Path.GetFullPath(dir) + "/" + target.name;
            //清空已经存在的目录
            if (Directory.Exists(dir))
            {
                var files = Directory.GetFiles(dir);
                foreach (var f in files) {
                    File.Delete(f);
                }
                Directory.Delete(dir);
            }
            Directory.CreateDirectory(dir);

            
            TextureImporter imp = AssetImporter.GetAtPath(path) as TextureImporter;
            GetTextureOriginalSize(imp, out int oriWidth, out int oriHeight);
            int width = target.width;
            int height = target.height;

            //计算资源导入的缩放比例
            float scalex = width * 1.0f / oriWidth;
            float scaley = height * 1.0f / oriHeight;

            foreach (SpriteMetaData sp in imp.spritesheet) 
            {
                int x = (int)(sp.rect.x * scalex); 
                int y = (int)(sp.rect.y * scaley);
                int w = (int)(sp.rect.width * scalex);
                int h = (int)(sp.rect.height * scaley);

                Texture2D t = new Texture2D(w, h, TextureFormat.RGBA32, false);
                for (int yi = 0; yi < h; yi++) 
                {
                    for (int xi =0; xi < w; xi++)
                    {
                        t.SetPixel(xi, yi, target.GetPixel((int)(xi + x), (int)(yi + y)));
                    }
                }

                var data = t.EncodeToPNG();
                string img = dir + "/" + sp.name + ".png";
                File.WriteAllBytes(img, data);
                AssetDatabase.Refresh();

                //修改图片的类型为sprite
                string spAsset = #34;{targetAsset}/{target.name}/{sp.name}.png";
                TextureImporter fmt = AssetImporter.GetAtPath(spAsset) as TextureImporter;
                fmt.textureType = TextureImporterType.Sprite;
                fmt.SaveAndReimport();
            }
            
            Debug.Log("slice:complete");

        }
    }
}

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表