1. 程式人生 > >Unity編輯器擴充套件:如何把圖集(Atlas)拆分成單個圖片

Unity編輯器擴充套件:如何把圖集(Atlas)拆分成單個圖片

遊戲開發中可能會用到商店下載的圖集,但是如果只是用到一部分,卻把整個圖集打包到專案則明顯是不划算的。可以讓美術同事單獨把需要的圖片切出來,但是圖源比較多的話也是一個不小的工作。既然能夠拿到切好的圖集資料,是不是可以通過程式碼自動生成切好的小圖呢,答案當然是肯定的。這裡提供一個小工具,操作很簡單,在Project下選擇要切出小圖的Sprite,然後選單Tools/SpriteAtlas就會在Assets/SpriteOut下生成想要的圖了。

P.S.注意你要操作的圖片一定要是可讀寫的
這裡寫圖片描述
廢話不多說,直接上程式碼:


using System.Collections;
using
System.Collections.Generic; using UnityEngine; using UnityEditor; using System.IO; namespace com.bt.editor { [ExecuteInEditMode] public class SplitAtlas : MonoBehaviour { [MenuItem("Tools/SplitAtlas")] public static void Split() { Sprite[] sprites = Selection.GetFiltered<Sprite>(SelectionMode.Deep); Texture2D oldTexture = null
; int width = 0; int height = 0; Color[] pixels = null; string textureName = ""; TextureFormat oldFormat = 0; string parentPath = Application.dataPath + "/SpriteOut/"; if (!Directory.Exists(parentPath)) { Directory.CreateDirectory(parentPath); } for
(int i = 0; i < sprites.Length; i++) { Texture2D oldTex = sprites[i].texture; if (oldTexture == null || oldTexture != oldTex) { oldTexture = oldTex; width = oldTexture.width; height = oldTexture.height; pixels = oldTexture.GetPixels(); textureName = oldTexture.name; oldFormat = oldTexture.format; } Rect rect = sprites[i].rect; string name = textureName + "_" + sprites[i].name; Debug.Log(name + ":" + rect); int spritew = Mathf.FloorToInt(rect.width); int spriteh = Mathf.FloorToInt(rect.height); int left = Mathf.FloorToInt(rect.x); int up = Mathf.FloorToInt(rect.y); Texture2D newTex = new Texture2D(spritew, spriteh, oldFormat, false, false); Color[] newColors = new Color[spritew * spriteh]; for (int x = 0; x < spritew; x++) { for (int y = 0; y < spriteh; y++) { newColors[y * spritew + x] = pixels[(up + y) * width + left + x]; } } newTex.SetPixels(newColors); byte[] data = newTex.EncodeToPNG(); string filePath = Application.dataPath + "/SpriteOut/" + name + ".png"; if (File.Exists(filePath)) { File.Delete(filePath); } FileStream file = File.Create(filePath); file.Write(data, 0, data.Length); file.Close(); } } } }

這裡是我的測試案例截圖:
這裡寫圖片描述