小弟我之前跟夥伴一起做過遊戲,因為我負責程式部分,主要原因我程式控制Sprite組件為主,導致要去進行所謂的分割,但是發現到另外夥伴對於美術所繪製的人物位置太過於隨意,導致成是這邊最後還要去進行最後調整,浪費了許多時間。
因此就想要試做,如何可以分割Sprite 裡面的小圖片,所寫的程式,小弟程式功力不是很好希望各位大大,有更好的方式,也歡迎提供。
--------------
Script(c#):
因此就想要試做,如何可以分割Sprite 裡面的小圖片,所寫的程式,小弟程式功力不是很好希望各位大大,有更好的方式,也歡迎提供。
--------------
Script(c#):
using UnityEngine;
using System.Collections;
using UnityEditor;
using System.Collections.Generic;
public class SpriteProcessor : EditorWindow
{
private Vector2 vector2Label; // 標籤位置(BeginScrollView 用的)
private GUIStyle style = new GUIStyle(); // GUI 風格
private string spriteSegmentationType = ""; // Sprite 分割像素
private string spriteName = ""; // Sprite 分格後名稱
private int spriteTitleNumber = 0; // 分格後的名稱編號
private int spriteSegmentationNumber; // 分割數值字串轉型
///
/// 呼叫視窗
///
[MenuItem("測試/Sprite寫法")]
public static void spriteWindowSetting()
{
SpriteProcessor windows = EditorWindow.GetWindow(typeof(SpriteProcessor), true, "Sprite 自動分割") as SpriteProcessor;
windows.Show();
}
///
/// 選擇貼圖(Sprite)
///
///
static Object[] getSelectTexture()
{
return Selection.GetFiltered(typeof(Texture2D), SelectionMode.DeepAssets);
}
void OnGUI()
{
style.fontSize = 18;
style.normal.textColor = Color.white;
GUI.Label(new Rect(0, 0, 100, 30), "圖片分割", style);
// Sprite 分割像素
GUILayout.BeginArea(new Rect(0, 30, 300, 100));
GUILayout.BeginHorizontal();
GUILayout.Label("Sprite 分割像素");
GUILayout.EndHorizontal();
GUILayout.EndArea();
// Sprite 分割像素輸入
GUILayout.BeginArea(new Rect(150, 30, 150, 100));
GUILayout.BeginHorizontal();
spriteSegmentationType = GUILayout.TextField(spriteSegmentationType);
GUILayout.EndHorizontal();
GUILayout.EndArea();
// Sprite標籤
GUILayout.BeginArea(new Rect(0, 110, 300, 100));
GUILayout.BeginHorizontal();
GUILayout.Label("Sprite 標簽名稱");
GUILayout.EndArea();
GUILayout.EndHorizontal();
// Sprite標籤輸入
GUILayout.BeginArea(new Rect(148, 110, 150, 100));
GUILayout.BeginHorizontal();
spriteName = GUILayout.TextField(spriteName);
GUILayout.EndHorizontal();
GUILayout.EndArea();
GUILayout.BeginArea(new Rect(200, 150, 100, 100));
GUILayout.BeginHorizontal();
if (GUILayout.Button("確定"))
SetPivots();
GUILayout.EndHorizontal();
GUILayout.EndArea();
}
///
/// 分割動作
///
void SetPivots()
{
spriteTitleNumber = 0;
// 判斷轉型成功執行分割
if (int.TryParse(spriteSegmentationType, out spriteSegmentationNumber))
{
Object[] textures = getSelectTexture();
Selection.objects = new Object[0];
SpriteMetaData d = new SpriteMetaData();
foreach (Texture2D texture in textures)
{
string path = AssetDatabase.GetAssetPath(texture);
TextureImporter ti = AssetImporter.GetAtPath(path) as TextureImporter;
ti.isReadable = true;
List<SpriteMetaData> newData = new List<SpriteMetaData>();
newData.Remove(d);
for (int x = 0; x < texture.width; x += spriteSegmentationNumber)
{
for (int y = 0; y < texture.height; y += spriteSegmentationNumber)
{
d.alignment = 9;
d.pivot = new Vector2(0.5f, 0.5f);
d.name = spriteName + "_" + (spriteTitleNumber += 1);
d.rect = new Rect(x, y, spriteSegmentationNumber, spriteSegmentationNumber);
newData.Add(d);
}
}
ti.spritesheet = newData.ToArray();
AssetDatabase.ImportAsset(path, ImportAssetOptions.ForceUpdate);
}
}
}
}
------------
結果圖: