网站首页 > 博客文章 正文
本文主要实现功能是将一张Unity里的图集分拆成零散的小图并输出在同目录下。
用法:
- 在资源管理器中选中要处理的图集,并在检视窗口里把read/write开关打开,并应用
- 右键选择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");
}
}
}
猜你喜欢
- 2024-09-09 大厂面试难,进不去?你要找的Unity的答案都在这儿了
- 2024-09-09 灵活运用拍摄技巧,免于来自女朋友的皮肉之苦(Unity-摄像机)
- 2024-09-09 Unity2019基础教程:Unity怎样添加角色?怎样使镜头跟随角色?
- 2024-09-09 【免费教程】解锁创意图片新玩法:黏土与瓷娃娃风格滤镜
- 2024-09-09 Unity自学笔记(1)2d场景的创建及人物移动
- 2024-09-09 Unity引擎2018版发布 渲染品质可媲美电影级别
- 2024-09-09 Unity功能知识点以及功能介绍(unity 介绍)
- 2024-09-09 耐克 Pegasus Turbo Next Nature "Together"官方图片
- 2024-09-09 人工智能写的unity照片滚动播放(unity图片动画)
- 2024-09-09 UNITY这些纹理动画,你值得拥有!(unity2019地形纹理)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- powershellfor (55)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)