Unity脚本自动打包图集

Unity脚本自动打包图集

思路

1.打开所有的场景 

2.在每个场景里寻找SpriteRenderer,获取每个SpriteRenderer.sprite的地址,引用计数+1,如果计数>1,放入public图集

3.然后生成各个场景中的图集


代码

using System.Collections.Generic;

using System.IO;

using System.Linq;

using System.Net.Mime;

using System.Threading;

using ET;

using UnityEditor;

using UnityEditor.SceneManagement;

using UnityEditor.U2D;

using UnityEngine;

using UnityEngine.SceneManagement;

using UnityEngine.U2D;

using UnityEngine.UI;

namespace DJ

{

public class GenerateSpirteAtlas:Editor

    {

private static string scenePath ="Assets/Bundles/Map/";

private static string sceneResPath ="Assets/Res/Environment/Map/";

private const int maxSize =2048;

private static List publicSceneSprites;

private static Dictionary> mapDict;

[MenuItem("Tools/Map/从文件夹生成图集",false,1)]

public static void GenerateAllSceneSpirteAtlasByFoder()

{

var direcorys =Directory.GetDirectories(sceneResPath);

foreach (var pathin direcorys)

{

GenerateAllSceneSpirteAtlasByFolder(path);

}

AssetDatabase.Refresh();

Debug.Log("完成~");

}

///

/// 生成folder的所有精灵图

///

///

        [MenuItem("Tools/Map/从场景生成图集",false,2)]

public static void GenerateAllSceneSpirteAtlasByScene()

{

mapDict =new Dictionary>();

publicSceneSprites =new List();

var scenePathList =new List();

FileHelper.GetAllFiles(scenePathList,scenePath,"*.unity");

var defalutScenePath =SceneManager.GetActiveScene().path;

foreach (var scenePathin scenePathList)

{

var scene=EditorSceneManager.OpenScene(scenePath);

var scenename = scene.name;

var mySceneDict =new Dictionary();

var sprites = FindObjectsOfType(true);

foreach (var spritein sprites)

{

if (sprite.sprite ==null)

{

continue;

}

var path =AssetDatabase.GetAssetPath(sprite.sprite.texture);

//查找其他有没有引用

                    var otherSceneDict = GetAssetDictionary(path);

if (otherSceneDict !=null)

{

//计数++

                        otherSceneDict[path]++;

continue;

}

//查看本场景有没有添加过

                    if (!mySceneDict.ContainsKey(path))

{

mySceneDict.Add(path,1);

}

// Debug.Log($"-------------资源路径:{path}");

                }

mapDict.Add(scenename,mySceneDict);

}

//所有场景资源都引用到了去重剔除共用部分

            foreach (var mapAssetDictin mapDict)

{

var folderPath = @$"{scenePath}{mapAssetDict.Key}/";

var path = folderPath +$"{mapAssetDict.Key}spriteatlas.spriteatlas";

if (!Directory.Exists(folderPath))

{

Directory.CreateDirectory(folderPath);

}

var texture2ds =new List();

foreach (var assetDictin mapAssetDict.Value)

{

var assetPath = assetDict.Key;

var referenceNum = assetDict.Value;

if (referenceNum >1)

{

publicSceneSprites.Add(assetPath);

continue;

}

var texture2d =AssetDatabase.LoadAssetAtPath(assetPath);

texture2ds.Add(texture2d);

}

if (texture2ds.Count >0)

{

var spriteAtlas= CreateSpritAtlas(path);

spriteAtlas.Add(texture2ds.ToArray());

}

//是否超过最大尺寸

            }

//生成共用的精灵图集

            if (publicSceneSprites.Count >0)

{

var publicTexture2d =new List();

var publicPath = scenePath +"publicMap/";

if (!Directory.Exists(publicPath))

{

Directory.CreateDirectory(publicPath);

}

var pubSpirtePath = publicPath+"publicMap.spriteatlas";

var publicSprites = CreateSpritAtlas(pubSpirtePath);

foreach (var pathin publicSceneSprites)

{

var texture2d =AssetDatabase.LoadAssetAtPath(path);

publicTexture2d.Add(texture2d);

}

publicSprites.Add(publicTexture2d.ToArray());

}

EditorSceneManager.OpenScene(defalutScenePath);

AssetDatabase.Refresh();

Debug.Log("完成所有场景的精灵图更新");

}

private static Dictionary GetAssetDictionary(string path)

{

foreach (var mapAssetDictin mapDict.Values)

{

if (mapAssetDict.ContainsKey(path))

{

return mapAssetDict;

}

}

return null;

}

///

/// 生成folder的所有精灵图

///

///

        public static void GenerateAllSceneSpirteAtlasByFolder(string folderPath)

{

var spriteFileList =new List();

var names = folderPath.SplitToArray('/');

var name = names.Last();

FileHelper.GetAllFiles(spriteFileList, folderPath,"*.png");

var path = folderPath +$"/{name}.spriteatlas";

var spriteAtlas = CreateSpritAtlas(path);

var bigSprite =new List();

var nomalSpirte =new List();

foreach (var spritePathin spriteFileList)

{

var sprite =AssetDatabase.LoadAssetAtPath(spritePath);

var bytes= sprite.GetRawTextureData();

// var file =new FileStream()

                var width = sprite.width;

var height =sprite.height;

if (width>=750||height>=750)

{

bigSprite.Add(sprite);

continue;

}

nomalSpirte.Add(sprite);

}

spriteAtlas.Add(nomalSpirte.ToArray());

}

public static SpriteAtlas CreateSpritAtlas(string path)

{

SpriteAtlas spriteAtlas =AssetDatabase.LoadAssetAtPath(path);

if (spriteAtlas ==null)

{

spriteAtlas =new SpriteAtlas();

AssetDatabase.CreateAsset(spriteAtlas, path);

}

else

            {

spriteAtlas.Remove(spriteAtlas.GetPackables());

}

var atlasSetting = spriteAtlas.GetPlatformSettings(GetPlatformName(EditorUserBuildSettings.activeBuildTarget));

atlasSetting.maxTextureSize = maxSize;

atlasSetting.textureCompression =TextureImporterCompression.CompressedHQ;

atlasSetting.format =TextureImporterFormat.RGBA32;

spriteAtlas.SetPlatformSettings(atlasSetting);

return spriteAtlas;

}

///

/// 获取打包平台

///

///

///

        public static string GetPlatformName(BuildTarget target)

{

string platformName ="";

switch (target)

{

case BuildTarget.Android:

platformName ="Android";

break;

case BuildTarget.iOS:

platformName ="iPhone";

break;

case BuildTarget.PS4:

platformName ="PS4";

break;

case BuildTarget.XboxOne:

platformName ="XboxOne";

break;

case BuildTarget.NoTarget:

platformName ="DefaultTexturePlatform";

break;

default:

platformName ="Standalone";

break;

}

return platformName;

}

}

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,258评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,335评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,225评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,126评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,140评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,098评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,018评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,857评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,298评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,518评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,400评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,993评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,638评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,661评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容