zl程序教程

您现在的位置是:首页 >  其他

当前栏目

NGUI图集切割代码

代码 切割 NGUI 图集
2023-09-14 08:57:08 时间

原地址:http://blog.csdn.net/u011440375/article/details/9707491

因为最近工作用NGUI比较多,修改图集时还没原图,有时候需要把图集重新切割开来,用代码会比较方便,一下贴出主要代码

首先读取NGUI图集的信息

[csharp] view plaincopy
UIAtlas mAtlas  ;  
         GameObject[] SelectedAsset=Selection.gameObjects;  
         if (SelectedAsset.Length == 1)  
         {  
             mAtlas = SelectedAsset[0].GetComponent<UIAtlas>();  
  
  
             if (mAtlas != null)  
             {  
                 string atlasFile = string.Format("{0}.txt", mAtlas.name);  
                 string atlasPng = string.Format("{0}.png", mAtlas.name);  
                 char[] ch = { '.' };  
                 string path = AssetDatabase.GetAssetPath(SelectedAsset[0]);  
                 FileInfo aFileinfo = new FileInfo(path);  
                 string th = aFileinfo.DirectoryName;  
                 string[] strs = path.Split(ch);  
  
                 if (File.Exists(atlasFile))  
                 {  
                     File.Delete(atlasFile);  
                 }  
                 StreamWriter sw = new StreamWriter(strs[0] + ".txt");  
                 StringBuilder sb = new StringBuilder();  
                 foreach (UIAtlas.Sprite sprite in mAtlas.spriteList)  
                 {  
                     sb.AppendLine(string.Format("name:{0}, coordinate:{1}", sprite.name, sprite.outer));  
                 }  
  
                 sw.Write(sb.ToString());  
                 sw.Close();  
  
                 string[] arg = new string[2];  
                 arg[0] = atlasPng;  
                 arg[1] = th;  
                 //print(arg[0]);  
                 //print(arg[1]);  
                 string path_2 = AssetDatabase.GetAssetPath(Resources.Load("CutAltas/output"));  
                 FileInfo aFileinfo_2 = new FileInfo(path_2);  
                 string th_2 = aFileinfo_2.DirectoryName;  
                 print(th_2);  
                 string s = th_2 + "\\Start.exe";  
这是主要的代码,接下来用vs编写一个程序切割图集,主要代码如下
[csharp] view plaincopy
namespace WindowsFormsApplication1  
{  
    public partial class Form1 : Form  
    {  
        string[] p;  
        string path = string.Empty;  
        public Form1(string[] s)  
        {  
            InitializeComponent();  
            p = s;  
            ImageName.Text = p[0];  
            path = p[1];  
        }  
  
        private void button1_Click(object sender, EventArgs e)  
        {  
            CutImage(path);  
            Application.Exit();  
             
        }  
          
        void CutImage(string p)   
        {  
            string path=@"c:\Documents and Settings\Administrator\桌面\";  
            string savePath=string.Empty;  
            string imagePath = p + "\\"+ImageName.Text;  
            string textPath = string.Empty;  
            Image img = Image.FromFile(imagePath);  
              
            char[] c = { '.' };  
            string st= ImageName.Text;  
            string[] sts = st.Split(c);  
            savePath = path + sts[0];  
            if (!Directory.Exists(savePath))  
            {  
                Directory.CreateDirectory(savePath);  
            }  
            textPath = p + "\\"+sts[0]+".txt";  
            StreamReader sr = new StreamReader(textPath);  
  
            while (!sr.EndOfStream)  
            {  
                string newLine = sr.ReadLine();  
             //   Regex reg = new Regex(@"name:(?P<name>.+), coordinate:\(x:(?P<x>\d+)\.00, y:(?P<y>\d+)\.00, width:(?P<width>\d+)\.00, height:(?P<height>\d+)\.00\)");  
             //   Regex regName = new Regex(@"\bname:\.*");  
                string patternName = @"\bname:\w*";  
                string patternX = @"\bcoordinate:\(x:\w*\.\d\d";  
                string patternY = @"\by:\d*\.\d\d";  
                string patternWidth = @"\bwidth:\d*\.\d\d";  
                string patternHeight = @"\bheight:\d*\.\d\d";  
                string name = savePath+"\\";  
                float x=0,y=0,width=0,height=0;  
                char[] maoHao = { ':' };  
                  
                MatchCollection imageName = Regex.Matches(newLine, patternName, RegexOptions.ExplicitCapture);  
  
                foreach (Match nextMatch in imageName)  
                {  
                    int index = nextMatch.Index;  
                    string result = nextMatch.ToString();  
                     
                    string[] re = result.Split(maoHao);  
                    name += re[re.Length - 1];  
                    name += ".png";  
                  //  MessageBox.Show(re[1]);  
                }  
                MatchCollection positionX = Regex.Matches(newLine, patternX, RegexOptions.ExplicitCapture);  
                foreach (Match nextMatch in positionX)  
                {  
                    int index = nextMatch.Index;  
                    string result = nextMatch.ToString();  
  
                    string[] re = result.Split(maoHao);  
                    x = float.Parse(re[re.Length - 1]);  
                //    MessageBox.Show(x.ToString());  
                }  
                MatchCollection positionY = Regex.Matches(newLine, patternY, RegexOptions.ExplicitCapture);  
                foreach (Match nextMatch in positionY)  
                {  
                    int index = nextMatch.Index;  
                    string result = nextMatch.ToString();  
  
                    string[] re = result.Split(maoHao);  
                    y = float.Parse(re[re.Length-1]);  
                //    MessageBox.Show(y.ToString());  
                }  
                MatchCollection widths = Regex.Matches(newLine, patternWidth, RegexOptions.ExplicitCapture);  
                foreach (Match nextMatch in widths)  
                {  
                    int index = nextMatch.Index;  
                    string result = nextMatch.ToString();  
  
                    string[] re = result.Split(maoHao);  
                    width = float.Parse(re[re.Length - 1]);  
                //    MessageBox.Show(width.ToString());  
                }  
                MatchCollection heights = Regex.Matches(newLine, patternHeight, RegexOptions.ExplicitCapture);  
                foreach (Match nextMatch in heights)  
                {  
                    int index = nextMatch.Index;  
                    string result = nextMatch.ToString();  
  
                    string[] re = result.Split(maoHao);  
                    height = float.Parse(re[re.Length - 1]);  
                 //   MessageBox.Show(height.ToString());  
                 //   MessageBox.Show("Name: " + name + "x :" + x.ToString() + "y :" + y.ToString() + "width :" + width.ToString() + "height :" + height.ToString());  
                }  
            //    MessageBox.Show("Name: "+name+"x :"+x.ToString()+"y :"+y.ToString()+"width :"+width.ToString()+"height :"+height.ToString());  
                Bitmap bmp = new Bitmap(img);  
                Rectangle rec = new Rectangle((int)x, (int)y, (int)width, (int)height);  
                bmp = bmp.Clone(rec, bmp.PixelFormat);  
                bmp.Save(name, System.Drawing.Imaging.ImageFormat.Png);  
            }  
           
            MessageBox.Show("切割完成,返回桌面查看!");  
        //    Bitmap bmp = new Bitmap(img, 100, 100);  
          //  bmp.Save(path + "newImage.jpg");  
        }  
    }  
}  
最后unity要调用vs生成的程序,并且传进参数
static bool StartProcess(string filename, string[] args)
    {
        //print("wwww");
        try
        {
            string s="";
            foreach(string arg in args) 
            {
                s += string.Format("\"{0}\" ", arg);
            }
            s = s.Trim();
            print(s);
            Process myprocess = new Process();
            ProcessStartInfo startInfo = new ProcessStartInfo(filename,s);
            myprocess.StartInfo = startInfo;
            myprocess.StartInfo.UseShellExecute = false;
            myprocess.Start();
            return true;
        }
        catch (Exception ex)
        {
            UnityEngine.Debug.Log("出错原因:" + ex.Message);
        }
        return false; 
    
    }