`

FastGUI For NGUI 3.0.X ——从PSD到NGUI UI 工具

 
阅读更多

FastGUI For NGUI 3.0.X ——PSD到NGUI UI 工具

By D.S.Qiu

尊重他人的劳动,支持原创,转载请注明出处:http://dsqiu.iteye.com     

       由于NGUI 已经到3.0的版本,FastGUI 1.3.2只能支持NGUI2.6.3,由于NGUI 2.7版本以后很多脚本的命名和属性都改了,所以就不能用了,然后我就只有自己动手改造。

       主要改动和改进有:

               1)图集名的动态替换,以前为了公用其他图集的图片,每次在Unity中导入之后都有收到替换其他图集和图片,挺麻烦的,所以就干脆在PSD的图层组中加了命名规则来自动替换,比如 PSD 图层组 backgroun(common_bg1), 这样background的  这张图片就会自动替换成common的bg1图片,并且不导出background组内的图片。

              2)具有更多的可扩展行,简化了原来的逻辑,原来的逻辑很复杂,而且没必要,其实NGUI 的基本组件就是UIWidget的子类UILabel和UISprite,当然还有UITexture,其他都可以看做UIWidget的组合。也就是说定义的Button,Input等都是这些的集合,只要将定义的组件的成员变量进行手动赋值初始化一下就可以了。这样如果你要自己定义一个组件,只要在Unity中导入的时候,写好对应的初始化操作就可以了,然后在PSD的图层中指定一个命名规则就可以了。

              3)根据NGUI3.0的DrawCall规则,对UIWdiget进行了按图集排序,“机械”的减少DC。

              4)手动输出View类的需要的一些代码,比如找到某些控件等。

 

『PSD2NGUI

       FastGUI致命的缺点:导出的时间太久了,用过的人一定深有体会。然后发现还有另外一款插件——PSD2NGUI,看了下应该是完全脱离Adobe ExtenedScripte Toolkit的运行环境,由于手头的版本跟NGUI的版本没有对应,所以就没有具体试过,应该会很不错吧。』

                                                                                                                                                                                                                   增补于 2014,01,07 22:50

下面附上代码:

        使用Adobe ExtenedScript Toolkit  执行的脚本:  

#target photoshop
app.bringToFront();
var originalRulerUnits = preferences.rulerUnits;
preferences.rulerUnits = Units.PIXELS;
preferences.typeUnits = TypeUnits.PIXELS;
var cleanDocumentName = "";
var targetImageFolders;
var actualPath  = "";
var textInfos    = "";
var baseDoc     = app.activeDocument;
var docWidth    = baseDoc.width.value;
var docHeight   = baseDoc.height.value;
var stackorder  = 0;
var parentObj = "";
var layerData;

var layerReadCount = 0;
var totalLayerCount = baseDoc.layers.length;

var win, windowResource;
var createProgressWindow, progressWindow;
var exportType = "WIDGETS";
// create a string to hold the data
var str ="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
// add header line1
str += "<psd width=\"" + docWidth + "\" height=\"" + docHeight + "\">\n";

function cLayer(doc, layer) 
{
    this.layerWidth = layer.bounds[2].value - layer.bounds[0].value;
    this.layerHeight = layer.bounds[3].value - layer.bounds[1].value;

    this.middleCenterX = this.layerWidth / 2 + layer.bounds[0].value;
    this.middleCenterY = this.layerHeight / 2 + layer.bounds[1].value;

    this.center = this.middleCenterX + ", " + this.middleCenterY;


    return this;
}
function getActiveLayerID()
{
   var d = getActiveLayerDescriptor();
   return d.getInteger(cTID('LyrI'));
}

function cTID(s) {return app.charIDToTypeID(s);}
function sTID(s) {return app.stringIDToTypeID(s);}
function getActiveLayerDescriptor() {
   var ref = new ActionReference();
   ref.putEnumerated(cTID('Lyr '), cTID('Ordn'), cTID('Trgt'));
   return executeActionGet(ref);
}


function newDocFromLayer( curDoc, newDocName, layer )
{
    var newDoc = app.documents.add( curDoc.width, curDoc.height, curDoc.resolution, newDocName , NewDocumentMode.RGB, DocumentFill.TRANSPARENT); 
    newDoc.activeLayer.isBackgroundLayer = false;
    app.activeDocument = curDoc; 
    layer.duplicate( newDoc ); 
    app.activeDocument = newDoc;
    return app.activeDocument;
}
function RemoveLayerSetsFromObject(pTargetObj, pRemoveInvisible)
{
    var arrToRemove = [];
    for(var i = 0; i < pTargetObj.layers[0].layers.length; i++)
    {
        if(pTargetObj.layers[0].layers[i].typename == "LayerSet")
        {
            arrToRemove.push(pTargetObj.layers[0].layers[i]);
        }
        else
        {
            if(pRemoveInvisible)
            {
                if(pTargetObj.layers[0].layers[i].visible == false)
                {
                    arrToRemove.push(pTargetObj.layers[0].layers[i]);
                }
            }
        }
    }
    for(var i = 0; i < arrToRemove.length; i++)
    {
        arrToRemove[i].remove();
    }
}
function CloseAndSaveAsPNG(pDoc)
{
    var pngSaveOptions = new PNGSaveOptions();
    pDoc.trim(TrimType.TRANSPARENT);
    if(atlasName == "")
        pDoc.saveAs(new File(targetImageFolders+pDoc.name+'.png'), pngSaveOptions, true, Extension.LOWERCASE);
    pDoc.close(SaveOptions.DONOTSAVECHANGES);
}

function ExportSpriteData(pTargetObj, pPath)
{
    var tParentName = GetParentName (pPath);
    var tObjName = pTargetObj.name;    
    var tLayerID = getActiveLayerID();
    if(exportType == "WIDGETS")    
    {
        atlasName = "";
        var tmpString=pTargetObj.name;
        var a = tmpString.indexOf(")");
        var b= tmpString.indexOf("(");
        if(a!==-1&&b!==-1)
        {
            tSourceName = tmpString.substring(b+1,a);
            var temp = tSourceName.split ("_");
            atlasName = temp[0];
            //str += "<layer type='SPRITE'> \n"+tSourceName+"  atalsName:"+temp[0]+"  "+atlasName;
            tSourceName = tSourceName.substring(atlasName.length+1);
            tObjName=tObjName.substring(0,b);
        }
        else if(tParentName=="")
        {
            tSourceName = tObjName;
        }
        else if(widgetType=="Sliced"||widgetType=="Tiled"||widgetType=="Filled")
        {
            tSourceName = tParentName+"_"+tObjName.substring(4);
        }    
         else 
         {
            tSourceName = tParentName+"_"+tObjName;
        } 
    }
    var newDoc = newDocFromLayer(baseDoc, tSourceName, pTargetObj);
    layerData = cLayer(newDoc, newDoc.layers[0]);
    
    if(exportType == "WIDGETS")
        RemoveLayerSetsFromObject(newDoc, true)
    
    layerReadCount++;
    str += "<layer type='SPRITE'> \n";
    if(widgetType=="Sliced"||widgetType=="Tiled"||widgetType=="Filled")
        str += "        <name>"+tObjName.substring(4)+"</name>\n";
    else 
        str += "        <name>"+tObjName+"</name>\n";
    str += "        <type>"+widgetType+"</name>\n";
    str += "        <path>"+ pPath +"</path>\n";
    str += "        <posX>"+ layerData.middleCenterX +"</posX>\n";
    str += "        <posY>"+ layerData.middleCenterY +"</posY>\n";
    str += "        <width>"+ layerData.layerWidth +"</width>\n";
    str += "        <height>"+ layerData.layerHeight +"</height>\n";
    str += "        <atlas>"+atlasName+"</atlas>\n";
    str += "        <source>"+ tSourceName+"</source>\n";
    str += "        <layerID>"+ tLayerID +"</layerID>\n"
    str += "</layer> \n";
   // if(atlasName=="")
        CloseAndSaveAsPNG(newDoc);
}

function ExportAnchor(pDoc, pTargetObj, pPath)
{
    var tLayerID = getActiveLayerID();
    layerData = cLayer(pDoc, pTargetObj);
    
    layerReadCount
    
     str += "<layer type='"+widgetType+"'> \n";
    str += "        <name>"+pTargetObj.name+"</name>\n";
    str += "        <path>"+ pPath +"</path>\n";
    str += "        <posX>"+ layerData.middleCenterX +"</posX>\n";
    str += "        <posY>"+ layerData.middleCenterY +"</posY>\n";
    str += "        <layerID>"+ tLayerID +"</layerID>\n";
    str += "</layer> \n";
}


function ExportTextLabel(pTargetObj, pPath)
{
    var tLayerID = getActiveLayerID();
    $.writeln ("Layer ID: "+ tLayerID);    
    
    var newDoc  = newDocFromLayer(baseDoc, pTargetObj.name, pTargetObj);
    layerData   = cLayer(newDoc, newDoc.layers[0]);
    //var tPrefix = newDoc.layers[0].name.substring(0,4) ;
    var tLayer  = newDoc.layers[0].layers[0];

    if( tLayer.kind == LayerKind.TEXT )
    {
        layerReadCount+=1;
        var tText   = tLayer.textItem;
        var tSize   = new Number( tText.size );
        tSize       = Math.round (tSize);
        var tName   = newDoc.layers[0].name;
        tName       = tName.substring(4);
        //str += "<layer type='TEXT_LABEL'> \n"+ tText.font;
        //var tType = tPrefix == "txt_" ? "TEXT_LABEL" : "INPUT_TEXT";

        str += "<layer type='TEXT_LABEL'> \n";
        str += "        <name>"+pTargetObj.name.substring(4)+"</name>\n";
        str += "        <path>"+ pPath +"</path>\n";
        str += "        <posX>"+ layerData.middleCenterX +"</posX>\n";
        str += "        <posY>"+ layerData.middleCenterY +"</posY>\n";
        str += "        <width>"+ layerData.layerWidth +"</width>\n";
        str += "        <height>"+ layerData.layerHeight +"</height>\n";
        str += "        <fontName>"+ tText.font +"</fontName>\n";
        str += "        <fontSize>"+ tSize +"</fontSize>\n";
        str += "        <fontColor>"+ tText.color.rgb.red +";"+ tText.color.rgb.green +";"+ tText.color.rgb.blue +"</fontColor>\n";
        str += "        <contents>"+ tText.contents+"</contents>\n";
        str += "        <layerID>"+ tLayerID +"</layerID>\n";
        str += "</layer>\n";
    }
    newDoc.close(SaveOptions.DONOTSAVECHANGES);

}




function GetParentName(pPath)
{
    if(pPath.substring(0, pPath.length-1) == "/")
        pPath = pPath.substring(0, pPath.length-1);
        
    var strPathLeng = pPath.length;
    var lastIndex = pPath.lastIndexOf ("/");
    if(lastIndex > -1)
    {
        pPath = pPath.substring ((lastIndex+1), strPathLeng);
    }

    return pPath;
}

function ExportSprite(pDoc, pTargetObj)
{
    var newDoc = newDocFromLayer(pDoc, pTargetObj.name, pTargetObj);
    layerData = cLayer(newDoc, newDoc.layers[0]);
    
    CloseAndSaveAsPNG(newDoc);
}

function ReadGroup(pTargetGroup, pPath)
{
   
    if(exportType == "WIDGETS")
    {
        totalLayerCount += pTargetGroup.layerSets.length;
        for(var i = (pTargetGroup.layerSets.length-1); i >= 0 ; i--)
        {
             var tmpObj = pTargetGroup.layerSets[i];
            baseDoc.activeLayer = tmpObj;
            
            progressWindow.bar.value = (layerReadCount/totalLayerCount)*100;
            //progressWindow.update();  
           
            if(tmpObj.artLayers.length > 0)   //基本组件 txt  sprite
            {
                if(tmpObj.name.substring(0, 4) == "txt_" )
                {
                    ExportTextLabel(tmpObj, pPath);
                }
                else if(tmpObj.name.substring(0, 4) == "slc_" )
                {
                    widgetType="Sliced";
                    ExportSpriteData(tmpObj, pPath);
                }
                else if(tmpObj.name.substring(0, 4) == "til_" )
                {
                    widgetType="Tiled";
                    ExportSpriteData(tmpObj, pPath);
                }
                else if(tmpObj.name.substring(0, 4) == "fil_" )
                {
                    widgetType="Filled";
                    ExportSpriteData(tmpObj, pPath);
                }
                else
                {
                    widgetType="Simple";
                    ExportSpriteData(tmpObj, pPath);
                }
            }
            else
            {
                if(tmpObj.name.substring(0, 4) == "btn_")
                {
                    widgetType="BUTTON";
                }
                else if(tmpObj.name.substring(0, 4) == "ckb_" )
                {
                    widgetType="CHECKBOX";
                }
                else if(tmpObj.name.substring(0, 4) == "sld_" )
                {
                    widgetType="SLIDER";
                }
                else if(tmpObj.name.substring(0, 4) == "psb_" )
                {
                    widgetType="PROGRESSBAR";
                }
                else if(tmpObj.name.substring(0, 4) == "inp_" )
                {
                     widgetType="INPUT";
                }
                else
                {
                    widgetType="ANCHOR";
                    
                }
                ExportAnchor(pTargetGroup, tmpObj, pPath);
            }
            if(tmpObj.layerSets.length > 0)
            {
                var target="";
                if(pPath == "")
                {
                    target = tmpObj.name;
                 }
                else
                {
                    target= pPath+"/"+tmpObj.name;
                }
                ReadGroup(tmpObj, target);
            }
        }
        
    }
    else if(exportType == "SPRITES")
    {
        totalLayerCount += pTargetGroup.layerSets.length;
         for(var i = (pTargetGroup.layerSets.length-1); i >= 0 ; i--)
        {
            
            progressWindow.bar.value = (layerReadCount/totalLayerCount)*100;
            //progressWindow.update(); 
            
            var tmpObj = pTargetGroup.layerSets[i];
            baseDoc.activeLayer = tmpObj;
            
            var target = "";
            if(pPath == "")
            {
                target = tmpObj.name;
             }
            else
            {
                target= pPath+"/"+tmpObj.name;
            }
            //ExportAnchor(pTargetGroup, pTargetGroup.layerSets[i], pPath);
            ReadGroup(tmpObj, target);
        }
        totalLayerCount += pTargetGroup.artLayers.length;
        for(var i = (pTargetGroup.artLayers.length-1); i >= 0; i--)   
        {
            var tmpObj = pTargetGroup.artLayers[i];
            baseDoc.activeLayer = tmpObj;
            atlasName = "";
            var tempPath = pPath.substring (0, pPath.lastIndexOf("/")) ;   //调整命名为: 父目录(组)名+ 当前目录(组)名
            var tGrandParentName = GetParentName (tempPath);
            var tParentName = GetParentName (pPath);
            var tObjName = tmpObj.name;    
            
            if(tGrandParentName=="")
            {
                    tSourceName = tParentName;
            }
            else 
            {
                tSourceName = tGrandParentName+"_"+tParentName;
            } 
            var newDoc = newDocFromLayer(baseDoc, tSourceName, tmpObj);
            CloseAndSaveAsPNG(newDoc);
            layerReadCount++;
            //ExportSprite(baseDoc, pPath);
        }

    }
}

windowResource = "dialog {  \
    orientation: 'column', \
    alignChildren: ['fill', 'top'],  \
    preferredSize:[140, 60], \
    text: 'FastGUI Photoshop Exporter',  \
    margins:15, \
    \
    bottomGroup: Group{ \
        cancelButton: Button { text: 'Cancel', properties:{name:'cancel'}, size: [120,24], alignment:['right', 'center'] }, \
        exportAllAsSprite: Button { text: 'Export Sprites', properties:{name:'exportsprites'}, size: [120,24], alignment:['right', 'center'] }, \
        exportWidgets: Button { text: 'Export Widgets', properties:{name:'exportwidgets'}, size: [120,24], alignment:['right', 'center'] }, \
    }\
}"
win = new Window(windowResource);

win.bottomGroup.cancelButton.onClick = function() 
{
  return win.close();
};
win.bottomGroup.exportAllAsSprite.onClick = function() 
{
    exportType = "SPRITES";
    StartFolder();
};
win.bottomGroup.exportWidgets.onClick = function() {
    exportType = "WIDGETS";
    StartFolder();
};

function StartFolder()
{
    win.close();
    var theFolder    = Folder.selectDialog ("Select the target folder:");

    if (theFolder) 
    {
        progressWindow = createProgressWindow("Please wait...", undefined, 0, 100); 
        progressWindow.show();
        cleanDocumentName = app.activeDocument.name.match(/([^\.]+)/)[1];
        
        var TargetFolder = new Folder(theFolder+'/'+cleanDocumentName+'/');
        TargetFolder.create();     
        
        var folder = new Folder(TargetFolder+"/Images");
        folder.create();
        targetImageFolders = TargetFolder+"/Images/" ;
        
        ReadGroup(baseDoc, "");
        // Use this to export XML file to same directory where PSD file is located
        var mySourceFilePath = TargetFolder + "/";
        // create a reference to a file for output
        var csvFile = new File(mySourceFilePath.toString().match(/([^\.]+)/)[1] + "FastGUIData.xml");
        // open the file, write the data, then close the file
        csvFile.encoding = "utf-8";
        csvFile.open('w');
        csvFile.writeln(str + "</psd>");
        csvFile.close();
        preferences.rulerUnits = originalRulerUnits;
        // Confirm that operation has completed
        alert("Operation Complete!" + "\n" + "Layer coordinates were successfully exported to:" + "\n" + "\n" + mySourceFilePath.toString().match(/([^\.]+)/)[1] + app.activeDocument.name.match(/([^\.]+)/)[1] + ".xml");
    }
}
createProgressWindow = function(title, message, min, max) {
  var win;
  win = new Window('palette', title);
  win.bar = win.add('progressbar', undefined, min, max);
  win.bar.preferredSize = [300, 20];
  win.stProgress = win.add("statictext");
  win.stProgress.preferredSize.width = 200;
  return win;
};


win.show();

        在Unity中使用的脚本(比原来上了很多,XML解析的三个脚本就不贴了)

 

FastGUIOutPut.cs:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;


public class FastGUIOutput : MonoBehaviour 
{
	public Dictionary<int, int> references = new Dictionary<int, int>();
}

 FastGUI.cs:

using UnityEditor;
using UnityEngine;
using System.Collections.Generic;
using System.IO;
using System.Text;

[ExecuteInEditMode]
public class FastGUI : EditorWindow
{
    //ͼ����depth����
	private const int COMMON_DEPTH = 0;
	private const int FONT_DEPTH = 2000;
	private const int MIDDLE_DEPTH = 1000;
    public static Dictionary<string, Transform> pathTransDic = new Dictionary<string, Transform>();
	[MenuItem("Monster Juice/Fast GUI")]
    static void ShowWindow () 
	{
		EditorWindow.GetWindow<FastGUI>();
    }
	private string applicationDataPath 	= Application.dataPath.Substring(0, Application.dataPath.IndexOf("Assets"));
	public static string assetFolderToBeParseed;
	private string applicationFolderToBeParseed;
	private string lastFolderChecked;
	
	static public int targetWidht;
	static public int targetHeight;
	
	public static Object objectToBeLoaded;
	public static string sourceFolder ="";

	private bool haveXML;
	private bool haveRoot;
	private bool haveTargetPanel;
	private bool isOnSize;
	
	private Color defaultColor;
	
	private UIPanel targetRootPanel;
	private UIPanel lastCheckedtargetRootPanel;
	public static UIRoot actualRoot;
	private float itemActual = 1;
	private float totalItens = 1;
	
	private UIAtlas targetAtlas;

    private Dictionary<XMLNode, Transform> transformDic = new Dictionary<XMLNode, Transform>();
	
	
	private XMLNodeList xmlObjects;
	
	
	private string debugerText;	
	
	private string currentObjectName = "";
	
	public static FastGUIOutput actualFastGUIOutput = null;
	StreamReader reader;
	
	void OnSelectionChange () 
	{ 
		Repaint();
	}
	void OnEnable()
	{
		defaultColor = GUI.backgroundColor;
	}
    void OnGUI () 
	{
		GUILayout.Label("FastGUI", EditorStyles.boldLabel);
		FastGUIEditorTools.DrawSeparator();
		GUILayout.BeginHorizontal();
		GUILayout.Label("FastGUI Folder:");
		objectToBeLoaded 				= EditorGUILayout.ObjectField(objectToBeLoaded, typeof(Object), false);
		if(objectToBeLoaded != null)
		{
			if(AssetDatabase.GetAssetPath(objectToBeLoaded).IndexOf(".xml") > -1)
			{
				objectToBeLoaded = null;
			}
		}
		assetFolderToBeParseed 			= AssetDatabase.GetAssetPath(objectToBeLoaded);
		applicationFolderToBeParseed 	= applicationDataPath+assetFolderToBeParseed;
		GUILayout.EndHorizontal();
		
		GUILayout.BeginVertical();
		if(lastFolderChecked != applicationFolderToBeParseed)
		{
			lastFolderChecked 	= applicationFolderToBeParseed;
			haveXML 			= HasXML();
		}
		GUILayout.EndVertical();
		
		GUILayout.BeginHorizontal();
		GUILayout.Label("Parent Panel:");
		targetRootPanel 				= EditorGUILayout.ObjectField(targetRootPanel, typeof(UIPanel), true) as UIPanel;
		GUILayout.EndHorizontal();
		if(targetRootPanel!=null)
		{
			haveTargetPanel = true;
		}
		else
		{
			haveTargetPanel = false;
		}
		if(haveTargetPanel)
		{
			if(lastCheckedtargetRootPanel != targetRootPanel)
			{
				lastCheckedtargetRootPanel = targetRootPanel;
				actualRoot = GetUIRoot(targetRootPanel.gameObject);
				
				
				if(actualRoot == null)
				{
					haveRoot = false;
				}
				else
				{
					haveRoot = true;
				}
			}
		}
		GUILayout.BeginHorizontal();
		GUILayout.Label("Target Atlas:");
		targetAtlas 				= EditorGUILayout.ObjectField(targetAtlas, typeof(UIAtlas), false) as UIAtlas;
		GUILayout.EndHorizontal();
		
		
		GUILayout.Space(10);
		if(actualRoot != null && objectToBeLoaded!=null)
		{
			if(actualRoot.manualHeight != targetHeight || actualRoot.minimumHeight < targetHeight)
			{
				isOnSize = false;
			}
			else
			{
				isOnSize = true;
			}
			if(!isOnSize)
			{
				GUI.backgroundColor = new Color(171f/255, 26f/255, 37f/255,1);
				if(GUILayout.Button("Update the UIRoot"))
				{
					UpdateUIRootSize();
				}
				GUI.backgroundColor = defaultColor;
			}
		}
		if(haveXML && haveRoot && isOnSize && haveTargetPanel)
		{
			GUI.backgroundColor = new Color(17f/255, 146f/255, 156f/255,1);
			if(GUILayout.Button("FastGUI it!"))
			{
				ParseeTargetFolder();
			}
			GUI.backgroundColor = defaultColor;
			
		}
		else
		{
			UpdateDebugger();
		}
	}
	private void ResetFields()
	{
		objectToBeLoaded 	= null;
		targetRootPanel		= null;
		targetAtlas			= null;
		
	}
	private void ResetProperties()
	{
		reader						= null;
		FastGUI.actualFastGUIOutput = null;
		NGUISettings.atlas 			= null;
		NGUISettings.fontData 		= null;
		NGUISettings.fontTexture 	= null;
		targetAtlas					= null;
		FastGUI.sourceFolder		= "";
	}
	private void ParseeTargetFolder()
	{
		actualRoot = GetUIRoot(targetRootPanel.gameObject);
        pathTransDic = new Dictionary<string, Transform>();
        pathTransDic.Add("", targetRootPanel.transform);
		if(targetAtlas != null)
			NGUISettings.atlas = targetAtlas;
		
		if(xmlObjects == null)
			ReadXML();
		
		if(actualFastGUIOutput == null)
			CreateOutputPrefab();
		
		itemActual = 0;
		string		tType		= null;
		Transform	tLastAnchor	= null;
		string		tLastAnchorPath = null;	
			
		foreach(XMLNode tNode in xmlObjects)
		{
			EditorUtility.DisplayProgressBar(
				"FastGUI Progress",
				("Object: "+currentObjectName+"("+itemActual+"/"+totalItens+")"),
				itemActual/totalItens);
			
			tType		= tNode["@type"].ToString();
			itemActual 	+= 1.0f;
			
			if(tNode["@type"].ToString() == "ANCHOR")
			{
				tLastAnchor 	= FastGUIPostProcessing.CreateAnchor( tNode, targetRootPanel, tLastAnchor, tLastAnchorPath);;
			}
			else if(tNode["@type"].ToString() == "BUTTON")
			{
                tLastAnchor = FastGUIPostProcessing.CreateWidgetContainer<Button>(tNode, targetRootPanel, tLastAnchor, tLastAnchorPath);
			}
			else if(tNode["@type"].ToString() == "SPRITE")
			{
                tLastAnchor = FastGUIPostProcessing.CreateSprite(tNode, targetRootPanel, tLastAnchor, tLastAnchorPath);
			}
			else if( tType == "TEXT_LABEL")
			{
                tLastAnchor = FastGUIPostProcessing.CreateTextLabel(tNode, targetRootPanel, tLastAnchor, tLastAnchorPath);

			}
			else if( tType == "INPUT")
			{
                tLastAnchor = FastGUIPostProcessing.CreateWidgetContainer<UIInput>(tNode, targetRootPanel, tLastAnchor, tLastAnchorPath);

			}
			else if( tType == "CHECKBOX" )
			{
                tLastAnchor = FastGUIPostProcessing.CreateWidgetContainer<UIToggle>(tNode, targetRootPanel, tLastAnchor, tLastAnchorPath);

			}
			else if( tType == "SLIDER" )
			{
                tLastAnchor = FastGUIPostProcessing.CreateWidgetContainer<UISlider>(tNode, targetRootPanel, tLastAnchor, tLastAnchorPath);
			}
			else if( tType == "PROGRESSBAR" )
			{
                tLastAnchor = FastGUIPostProcessing.CreateWidgetContainer<UIScrollBar>(tNode, targetRootPanel, tLastAnchor, tLastAnchorPath);
			}
            tLastAnchorPath = tNode.GetNode("path>0")["_text"].ToString() + "/" + tNode.GetNode("name>0")["_text"].ToString();
            transformDic.Add(tNode, tLastAnchor);
			currentObjectName = tNode.GetNode("name>0")["_text"].ToString();
			
			
			
		}
        ProcessLast();
		EditorUtility.ClearProgressBar();
		SetToPixelPerfect();
		ResetProperties();
		ResetFields();
	}
	
    private void UpdateUIRootSize()
	{
		if (actualRoot.transform != null)
		{
			float calcActiveHeight = targetHeight;
			
			actualRoot.minimumHeight 	= targetHeight;
			actualRoot.manualHeight 	= targetHeight;
			actualRoot.manualHeight		= targetHeight;
			
			actualRoot.scalingStyle 	= UIRoot.Scaling.FixedSize;
			

			if (calcActiveHeight > 0f )
			{
				float size = 2f / calcActiveHeight;
				
				Vector3 ls = actualRoot.transform.localScale;
	
				if (!(Mathf.Abs(ls.x - size) <= float.Epsilon) ||
					!(Mathf.Abs(ls.y - size) <= float.Epsilon) ||
					!(Mathf.Abs(ls.z - size) <= float.Epsilon))
				{
					actualRoot.transform.localScale = new Vector3(size, size, size);
				}
			}
		}		
	}
	public void SetToPixelPerfect()
	{
		actualRoot.scalingStyle 	= UIRoot.Scaling.FixedSizeOnMobiles;
	}
	private UIRoot GetUIRoot(GameObject tTarget)
	{
		if(tTarget.transform.parent!=null)
		{
			if(tTarget.transform.parent.gameObject.GetComponent<UIRoot>())
			{
				return tTarget.transform.parent.gameObject.GetComponent<UIRoot>();
			}
			else
			{
				return GetUIRoot(tTarget.transform.parent.gameObject);
			}
		}
		return null;
	}
	private void UpdateDebugger()
	{
		FastGUIEditorTools.DrawSeparator();

		GUILayout.Label("Output", EditorStyles.boldLabel);
		
		
		if(!haveXML)
			if(objectToBeLoaded!=null)
				GUILayout.Label("FastGUIData.xml can't be found inside the folder: "+objectToBeLoaded.name+"\n", EditorStyles.wordWrappedMiniLabel);
		
		//if(!haveImagesFolder)
			//if(objectToBeLoaded!=null)
				//GUILayout.Label("Image Foulder can't be found inside the folder: "+objectToBeLoaded.name+"\n", EditorStyles.wordWrappedMiniLabel);
		
		if(!haveRoot)		
			if(targetRootPanel!=null)
				GUILayout.Label("Can't find the UIRoot of panel: "+targetRootPanel, EditorStyles.wordWrappedMiniLabel);
		
		if(!haveTargetPanel)		
			GUILayout.Label("You must select one target Panel", EditorStyles.wordWrappedMiniLabel);
		
		
		if(objectToBeLoaded == null)
			GUILayout.Label("You must select one valid FastGUI export folder", EditorStyles.wordWrappedMiniLabel);	
		
		
		if(targetAtlas == null)
            GUILayout.Label("You must select one Atlas", EditorStyles.wordWrappedMiniLabel);	
		
		FastGUIEditorTools.DrawSeparator();
	}
	
	private void ReadXML()
	{	
		string fileData = "";
		reader = new StreamReader(assetFolderToBeParseed+"/FastGUIData.xml",Encoding.UTF8);
		fileData = reader.ReadToEnd();
        //Debug.Log(fileData);
		reader.Close();
		
		XMLParser parser 	= new XMLParser();
        
        XMLNode node 		= parser.Parse( fileData );

        xmlObjects   		= node.GetNodeList("psd>0>layer");
		
		targetWidht = int.Parse(node.GetNode("psd>0")["@width"].ToString());
		targetHeight = int.Parse(node.GetNode("psd>0")["@height"].ToString());
		
		totalItens = (float)xmlObjects.Count;   
	}
	private bool HasXML()
	{
		string[] files = Directory.GetFiles(applicationFolderToBeParseed, "FastGUIData.xml", SearchOption.TopDirectoryOnly);
		
		if(files.Length > 0)
		{
			ReadXML();
			return true;
		}
		return false;
	}
	private void CreateOutputPrefab()
	{
		if(!Directory.Exists(applicationFolderToBeParseed+"/Output/"))
			Directory.CreateDirectory(applicationFolderToBeParseed+"/Output/");
		AssetDatabase.Refresh();
		
		Object prefabOutput = PrefabUtility.CreateEmptyPrefab(FastGUI.assetFolderToBeParseed+"/Output/FastGUIOutput.prefab");
		
		
		// Create a new game object for the atlas
		GameObject go = new GameObject("FastGUIOutput");
		go.AddComponent<FastGUIOutput>();

		// Update the prefab
		PrefabUtility.ReplacePrefab(go, prefabOutput);
		
		DestroyImmediate(go);
		AssetDatabase.SaveAssets();
		AssetDatabase.Refresh();
        Debug.Log(FastGUI.assetFolderToBeParseed + " ");
		actualFastGUIOutput = AssetDatabase.LoadAssetAtPath(FastGUI.assetFolderToBeParseed+"/Output/FastGUIOutput.prefab", typeof(FastGUIOutput)) as FastGUIOutput;
        Debug.Log("...................op:" + actualFastGUIOutput.name);
        actualFastGUIOutput.references = new Dictionary<int, int>();
	}
	
    private void ProcessLast()
    {
        
        string member = "", findMem = "";
        List<UIWidget> commonList = new List<UIWidget>();
        List<UIWidget> middleList = new List<UIWidget>();
        List<UIWidget> fontList = new List<UIWidget>();
        foreach ( KeyValuePair<XMLNode,Transform> keyValue in transformDic)
        {
            XMLNode tNode = keyValue.Key;
            string tType = tNode["@type"].ToString();
            string 	tName		= tNode.GetNode ("name>0")["_text"].ToString();
            string 	tParentName	= tNode.GetNode ("path>0")["_text"].ToString();
            string tPath = "";
            if (string.IsNullOrEmpty(tParentName))
                tPath = tName;
            else
                tPath = tParentName + "/" + tName;

            itemActual += 1.0f;
            Transform trans = keyValue.Value;
            //ָ����Ա����
			if(tType == "SPRITE" )
			{
				if(tNode.GetNode("atlas>0")["_text"].ToString() == "Common")
				{
                    Debug.Log(trans.gameObject.name);
                    commonList.Add(trans.gameObject.GetComponent<UISprite>());
				}
				else 
					middleList.Add(trans.gameObject.GetComponent<UISprite>());}
			else if(tType == "TEXT_LABEL")
			{
				fontList.Add(trans.gameObject.GetComponent<UILabel>());}
            else if (tType == "BUTTON")
            {
                Button button = trans.GetComponent<Button>();
                NGUITools.AddWidgetCollider(trans.gameObject);
                member += "    private Button " + tName + ";\n";
                findMem += "        " + tName + " = FindInChild<Button>(\"" + tPath + "\");\n";
                
            }
            else if (tType == "INPUT")
            {
                UIInput input = trans.GetComponent<UIInput>();
                if(trans.FindChild("label") != null )
                {
                    UILabel label = trans.FindChild("label").GetComponent<UILabel>();

                    input.label = label;
                }
                NGUITools.AddWidgetCollider(trans.gameObject);
                member += "    private UIInput " + tName + ";\n";
                findMem += "        " + tName + " = FindInChild<UIInput>(\"" + tPath + "\");\n";
            }
            else if (tType == "CHECKBOX")
            {
                UIToggle toggle = trans.GetComponent<UIToggle>();
                if(trans.FindChild("checkmark")!=null)
                    toggle.activeSprite = trans.FindChild("checkmark").GetComponent<UISprite>();
                toggle.value = true;
                NGUITools.AddWidgetCollider(trans.gameObject);
                member += "    private UIToggle " + tName + ";\n";
                findMem += "        " + tName + " = FindInChild<UIToggle>(\"" + tPath + "\");\n";
            }
            else if (tType == "SLIDER")
            {
                UISlider slider = trans.GetComponent<UISlider>();
                if (trans.FindChild("foreground") != null && trans.FindChild("background") != null)
                {
                    UISprite foreground = trans.FindChild("foreground").GetComponent<UISprite>();
                    UISprite background = trans.FindChild("background").GetComponent<UISprite>();

                    Transform thumb = trans.FindChild("thumb");

                    background.pivot = UIWidget.Pivot.Left;
                    trans.position = background.transform.position;
                    Vector3 post = trans.position;

                    foreground.pivot = UIWidget.Pivot.Left;
                    foreground.transform.position = post;
                    //background.transform.localPosition = Vector3.zero;
                    background.pivot = UIWidget.Pivot.Left;
                    background.transform.position = post;
                    if (thumb != null)
                        slider.thumb = thumb;
					slider.foregroundWidget = foreground;
                }
                //slider.thumb = thumb;
                NGUITools.AddWidgetCollider(trans.gameObject);
                member += "    private UISlider " + tName + ";\n";
                findMem += "        " + tName + " = FindInChild<UISlider>(\"" + tPath + "\");\n";
            }
            else if (tType == "PROGRESSBAR")
            {
                UIScrollBar scrollBar = trans.GetComponent<UIScrollBar>();
                if (trans.FindChild("foreground") != null && trans.FindChild("background") != null)
                {
                    UISprite foreground = trans.FindChild("foreground").GetComponent<UISprite>();
                    UISprite background = trans.FindChild("background").GetComponent<UISprite>();

                    background.pivot = UIWidget.Pivot.Left;
                    trans.position = background.transform.position;
                    Vector3 post = trans.position;

                    foreground.pivot = UIWidget.Pivot.Left;
                    foreground.transform.position = post;
                    background.pivot = UIWidget.Pivot.Left;
                    background.transform.position = post;
					scrollBar.foregroundWidget = foreground;
                    scrollBar.backgroundWidget = background;
                }
                //scrollBar.transform.localPosition = lPost;
                NGUITools.AddWidgetCollider(trans.gameObject);
                member += "    private UIScollBar " + tName + ";\n";
                findMem += "        " + tName + " = FindInChild<UIScollBar>(\"" + tPath + "\");\n";
            }
			
        }
        if (!Directory.Exists(applicationFolderToBeParseed + "/Output/"))
            Directory.CreateDirectory(applicationFolderToBeParseed + "/Output/");
        //String fileName=objectToBeLoaded.find
        FileStream fs = new FileStream(applicationFolderToBeParseed + "/Output/" + objectToBeLoaded.name + ".txt", FileMode.Create);
        StreamWriter sw = new StreamWriter(fs);
        sw.Write("using UnityEngine;\n\n");
        sw.Write("class " + objectToBeLoaded.name + ": BaseView\n{\n");
        sw.Write(member);
        sw.Write("    protected override void Init()\n    {\n");
        sw.Write(findMem);
        sw.Write("    }\n}");
        sw.Flush();
        sw.Close();
        fs.Close();

		//Debug.Log(commonList.Count+"   ...............");
        for (int i = 0, max = commonList.Count; i < max; i++)
        {
            UIWidget w = commonList[i];
        }
		//����depth����
		commonList.Sort(UIWidget.CompareFunc);
		middleList.Sort(UIWidget.CompareFunc);
		fontList.Sort(UIWidget.CompareFunc);
		for(int i=0,max=commonList.Count;i<max;i++)
		{

            UIWidget w = commonList[i];
			w.depth = COMMON_DEPTH + i;

		}
		for(int i=0,max=middleList.Count;i<max;i++)
		{
            UIWidget w = middleList[i];
			w.depth = MIDDLE_DEPTH + i;
		}
		for(int i=0,max=fontList.Count;i<max;i++)
		{
            UIWidget w = fontList[i];
			w.depth = FONT_DEPTH + i;
		}   
    }
	
}

 FastGUIPostProcessing.cs:

using UnityEngine;
using UnityEditor;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Xml;
using System.Text;

public class FastGUIPostProcessing : Editor
{

    public FastGUI monsterImporter;

    public void SetImporterLink(FastGUI pLink)
    {
        monsterImporter = pLink;
    }

    static public Vector3 AdjustPosition(float pX, float pY)
    {
        Vector3 tTargetPos = new Vector3(pX - (FastGUI.targetWidht / 2), FastGUI.targetHeight / 2 - pY, 0);
        tTargetPos.x = tTargetPos.x / (FastGUI.targetHeight / 2);
        tTargetPos.y = tTargetPos.y / (FastGUI.targetHeight / 2);


        tTargetPos.x += FastGUI.actualRoot.transform.position.x;
        tTargetPos.y += FastGUI.actualRoot.transform.position.y;


        return tTargetPos;
    }

    public static Transform CreateAnchor(XMLNode pNode, UIPanel pTargetRootPannel, Transform pLastAnchor, string pLastAnchorPath)
    {
        string tName = pNode.GetNode("name>0")["_text"].ToString();
        string tParentName = pNode.GetNode("path>0")["_text"].ToString();
        float tPosX = float.Parse(pNode.GetNode("posX>0")["_text"].ToString());
        float tPosY = float.Parse(pNode.GetNode("posY>0")["_text"].ToString());
        int tLayerID = int.Parse(pNode.GetNode("layerID>0")["_text"].ToString());
        Transform lastRoot = pTargetRootPannel.transform;

        if (tParentName == pLastAnchorPath)
        {
            lastRoot = pLastAnchor;
        }
        else
        {
            if (pTargetRootPannel.transform.FindChild(tParentName))
                lastRoot = pTargetRootPannel.transform.FindChild(tParentName);
        }

        GameObject tNewGo;
        if (FastGUI.actualFastGUIOutput.references.ContainsKey(tLayerID))
        {
            tNewGo = EditorUtility.InstanceIDToObject(FastGUI.actualFastGUIOutput.references[tLayerID]) as GameObject;
            if (tNewGo == null)
            {
                FastGUI.actualFastGUIOutput.references.Remove(tLayerID);
                return CreateAnchor(pNode, pTargetRootPannel, pLastAnchor, pLastAnchorPath);
            }
        }
        else
        {
            tNewGo = new GameObject(tName);
            FastGUI.actualFastGUIOutput.references.Add(tLayerID, tNewGo.GetInstanceID());
        }

        tNewGo.transform.parent = lastRoot;
        tNewGo.transform.position = AdjustPosition(tPosX, tPosY);
        tNewGo.transform.localScale = Vector3.one;

        return tNewGo.transform;
    }

    public static Transform CreateSprite(XMLNode pNode, UIPanel pTargetRootPannel, Transform pLastAnchor, string pLastAnchorPath)
    {
        string tName = pNode.GetNode("name>0")["_text"].ToString();
        string tParentName = pNode.GetNode("path>0")["_text"].ToString();
        float tPosX = float.Parse(pNode.GetNode("posX>0")["_text"].ToString());
        float tPosY = float.Parse(pNode.GetNode("posY>0")["_text"].ToString());
        string tSource = pNode.GetNode("source>0")["_text"].ToString();
        string tType = pNode.GetNode("type>0")["_text"].ToString();
        string tAtlas = pNode.GetNode("atlas>0")["_text"].ToString();
        int width = int.Parse(pNode.GetNode("width>0")["_text"].ToString());
        int height = int.Parse(pNode.GetNode("height>0")["_text"].ToString());
        
        //AssetDatabase.LoadAssetAtPath(
        int tLayerID = int.Parse(pNode.GetNode("layerID>0")["_text"].ToString());
       
        Transform lastRoot = pTargetRootPannel.transform;
        if (tParentName == pLastAnchorPath)
        {
            lastRoot = pLastAnchor;
        }
        else
        {
            if (pTargetRootPannel.transform.FindChild(tParentName))
                lastRoot = pTargetRootPannel.transform.FindChild(tParentName);
        }

        UISprite tSpriteWidget = null;
        GameObject tNewGo = null;
        if (FastGUI.actualFastGUIOutput.references.ContainsKey(tLayerID))
        {
            tNewGo = EditorUtility.InstanceIDToObject(FastGUI.actualFastGUIOutput.references[tLayerID]) as GameObject;
            if (tNewGo == null)
            {
                FastGUI.actualFastGUIOutput.references.Remove(tLayerID);
                //CreateSprite(pNode, pTargetRootPannel, pLastAnchor, pLastAnchorPath);
                tSpriteWidget = NGUITools.AddWidget<UISprite>(lastRoot.gameObject);
                FastGUI.actualFastGUIOutput.references.Add(tLayerID, tSpriteWidget.gameObject.GetInstanceID());
            }
            else
            {
                tSpriteWidget = tNewGo.GetComponent<UISprite>();
            }
        }
        else
        {
            tSpriteWidget = NGUITools.AddWidget<UISprite>(lastRoot.gameObject);
            FastGUI.actualFastGUIOutput.references.Add(tLayerID, tSpriteWidget.gameObject.GetInstanceID());
        }

        tSpriteWidget.name = tName ;
        tSpriteWidget.type = (UISprite.Type)System.Enum.Parse(typeof(UISprite.Type),tType);
        if (!tAtlas.Equals(""))
        {
            UIAtlas targetAtlas = null;
            string[] tPaths = Directory.GetFiles(Application.dataPath + "/", tAtlas + ".prefab", SearchOption.AllDirectories);


            foreach (var tPath in tPaths)
            {
                string projectRelativePath = tPath.Substring(tPath.ToString().IndexOf("Assets/"));
                targetAtlas = AssetDatabase.LoadAssetAtPath(projectRelativePath, typeof(UIAtlas)) as UIAtlas;
                if (targetAtlas != null)
                    break;

            }
            tSpriteWidget.atlas = targetAtlas;
        }
        else
            tSpriteWidget.atlas = NGUISettings.atlas;
        tSpriteWidget.spriteName = tSource;
        
        tSpriteWidget.pivot = NGUISettings.pivot;
        tSpriteWidget.depth = NGUITools.CalculateNextDepth(pTargetRootPannel.gameObject);
        tSpriteWidget.transform.localScale = Vector3.one;
        tSpriteWidget.transform.position = AdjustPosition(tPosX, tPosY);
        tSpriteWidget.width = width;
        tSpriteWidget.height = height;
        
        tSpriteWidget.MakePixelPerfect();
        
        return lastRoot;
    }
    public static Transform CreateTextLabel(XMLNode pNode, UIPanel pTargetRootPannel, Transform pLastAnchor, string pLastAnchorPath)
    {
        // Node parameters:
        string tFontName = pNode.GetNode("fontName>0")["_text"].ToString();
        string tFontColor = pNode.GetNode("fontColor>0")["_text"].ToString();
        int width = int.Parse(pNode.GetNode("width>0")["_text"].ToString());
        int height = int.Parse(pNode.GetNode("height>0")["_text"].ToString());

        string tContent = pNode.GetNode("contents>0")["_text"].ToString();
        Debug.Log(tContent + "......");
        int tFontSize = int.Parse(pNode.GetNode("fontSize>0")["_text"].ToString());

        Font targetFont = null;
        string[] tPaths = Directory.GetFiles(Application.dataPath + "/", tFontName + ".ttf", SearchOption.AllDirectories);

        foreach (var tPath in tPaths)
        {
            string projectRelativePath = tPath.Substring(tPath.ToString().IndexOf("Assets/"));
            targetFont = AssetDatabase.LoadAssetAtPath(projectRelativePath, typeof(Font)) as Font;
            if (targetFont != null)
                break;
        }

        UILabel tLabel;
        Transform tContainer = CreateAnchor(pNode, pTargetRootPannel, pLastAnchor, pLastAnchorPath);

        // Create Label:
        tLabel = tContainer.gameObject.AddComponent<UILabel>();

        // Set Position:
        tLabel.transform.localPosition = tContainer.localPosition;

        string[] tColor = tFontColor.Split(';');
        tLabel.color = new Color(float.Parse(tColor[0]) / 255f, float.Parse(tColor[1]) / 255f, float.Parse(tColor[2]) / 255f);
        tLabel.trueTypeFont = targetFont;
        tLabel.fontSize = tFontSize;
        tLabel.width = width;
        tLabel.height = height;
        tLabel.text = tContent;
        //Debug.Log(".........."+tContent);
        tLabel.overflowMethod = UILabel.Overflow.ResizeFreely;
        tLabel.depth = NGUITools.CalculateNextDepth(pTargetRootPannel.gameObject); ;
        tLabel.pivot = UIWidget.Pivot.Center;

        tLabel.MakePixelPerfect();
        //tLabel.MakePositionPerfect();

        return tContainer;
    }
    static public UIFont GetFont(string pFontName)
    {
        string[] tPaths = Directory.GetFiles(Application.dataPath + "/", pFontName + ".prefab", SearchOption.AllDirectories);

        foreach (var tPath in tPaths)
        {
            string projectRelativePath = tPath.Substring(tPath.ToString().IndexOf("Assets/"));
            UIFont tGO = AssetDatabase.LoadAssetAtPath(projectRelativePath, typeof(UIFont)) as UIFont;

            return tGO;
        }
        return null;
    }
	
	public static Transform CreateCheckBox(XMLNode pNode, UIPanel pTargetRootPannel,Transform pLastAnchor, string pLastAnchorPath )
	{	
		string 	tName		= pNode.GetNode ("name>0")["_text"].ToString();
		string 	tParentName	= pNode.GetNode ("path>0")["_text"].ToString();
		float 	tPosX		= float.Parse(pNode.GetNode ("posX>0")["_text"].ToString());
		float 	tPosY		= float.Parse(pNode.GetNode ("posY>0")["_text"].ToString());
		int 	tLayerID	= int.Parse(pNode.GetNode ("layerID>0")["_text"].ToString());
		
		Transform lastRoot = pTargetRootPannel.transform;
		
		if(tParentName == pLastAnchorPath)
		{
			lastRoot = pLastAnchor;
		}
		else
		{
			if(pTargetRootPannel.transform.FindChild(tParentName))
				lastRoot = pTargetRootPannel.transform.FindChild(tParentName);
		}
		
		UIToggle tCheckBox = null;
		GameObject tNewGo = null;
		if(FastGUI.actualFastGUIOutput.references.ContainsKey(tLayerID))
		{
			tNewGo 		= EditorUtility.InstanceIDToObject(FastGUI.actualFastGUIOutput.references[tLayerID]) as GameObject;
			if(tNewGo == null)
			{
				FastGUI.actualFastGUIOutput.references.Remove(tLayerID);	
				return CreateCheckBox(pNode, pTargetRootPannel, pLastAnchor, pLastAnchorPath);
			}
			else
			{
				tCheckBox 	= tNewGo.GetComponent<UIToggle>();
				
				foreach(Transform tTrans in tNewGo.transform)
				{
					DestroyImmediate(tTrans.gameObject);
				}
			}
		}
		else
		{
			tNewGo 						= new GameObject(tName);
			tNewGo.transform.parent 	= lastRoot;
			tNewGo.transform.position 	= AdjustPosition(tPosX, tPosY);
			tNewGo.transform.localScale = Vector3.one;
			
			tCheckBox					= tNewGo.AddComponent<UIToggle>();
			
			FastGUI.actualFastGUIOutput.references.Add(tLayerID, tNewGo.GetInstanceID());
		}		
		NGUITools.AddWidgetCollider(tCheckBox.gameObject);
		
		return tCheckBox.transform;
	}
	public static Transform CreateSlider(XMLNode pNode, UIPanel pTargetRootPannel, Transform pLastAnchor, string pLastAnchorPath )
	{	
		string 	tName		= pNode.GetNode ("name>0")["_text"].ToString();
		string 	tParentName	= pNode.GetNode ("path>0")["_text"].ToString();
		float 	tPosX		= float.Parse(pNode.GetNode ("posX>0")["_text"].ToString());
		float 	tPosY		= float.Parse(pNode.GetNode ("posY>0")["_text"].ToString());
		int 	tLayerID	= int.Parse(pNode.GetNode ("layerID>0")["_text"].ToString());

		Transform lastRoot = pTargetRootPannel.transform;
		
		
		if(tParentName == pLastAnchorPath)
		{
			lastRoot = pLastAnchor;
		}
		else
		{
			if(pTargetRootPannel.transform.FindChild(tParentName))
				lastRoot = pTargetRootPannel.transform.FindChild(tParentName);
		}
		
		UISlider tSlider = null;
		GameObject tNewGo = null;
		if(FastGUI.actualFastGUIOutput.references.ContainsKey(tLayerID))
		{
			tNewGo 			= EditorUtility.InstanceIDToObject(FastGUI.actualFastGUIOutput.references[tLayerID]) as GameObject;
			if(tNewGo == null)
			{
				FastGUI.actualFastGUIOutput.references.Remove(tLayerID);	
				return CreateCheckBox(pNode, pTargetRootPannel, pLastAnchor, pLastAnchorPath);
			}
			else
			{
				tSlider 		= tNewGo.GetComponent<UISlider>();
				
				foreach(Transform tTrans in tNewGo.transform)
				{
					DestroyImmediate(tTrans.gameObject);
				}
			}
		}
		else
		{
			tNewGo 						= new GameObject(tName);
			tNewGo.transform.parent 	= lastRoot;
			tNewGo.transform.position 	= AdjustPosition(tPosX, tPosY);
			tNewGo.transform.localScale = Vector3.one;
			
			tSlider						= tNewGo.AddComponent<UISlider>();
			
			FastGUI.actualFastGUIOutput.references.Add(tLayerID, tNewGo.GetInstanceID());
		}

		NGUITools.AddWidgetCollider(tSlider.gameObject);
		
		return tSlider.transform;
	}
	public static Transform CreateProgressBar(XMLNode pNode, UIPanel pTargetRootPannel, Transform pLastAnchor, string pLastAnchorPath )
	{	
		string 	tName		= pNode.GetNode ("name>0")["_text"].ToString();
		string 	tParentName	= pNode.GetNode ("path>0")["_text"].ToString();
		float 	tPosX		= float.Parse(pNode.GetNode ("posX>0")["_text"].ToString());
		float 	tPosY		= float.Parse(pNode.GetNode ("posY>0")["_text"].ToString());
		int 	tLayerID	= int.Parse(pNode.GetNode ("layerID>0")["_text"].ToString());
		
		Transform lastRoot = pTargetRootPannel.transform;
		
		
		if(pTargetRootPannel.transform.FindChild(tParentName))
			lastRoot = pTargetRootPannel.transform.FindChild(tParentName);
				
		
		UIScrollBar tSlider = null;
		GameObject tNewGo = null;
		if(FastGUI.actualFastGUIOutput.references.ContainsKey(tLayerID))
		{
			tNewGo = EditorUtility.InstanceIDToObject(FastGUI.actualFastGUIOutput.references[tLayerID]) as GameObject;
			if(tNewGo == null)
			{
				FastGUI.actualFastGUIOutput.references.Remove(tLayerID);	
				return CreateCheckBox(pNode, pTargetRootPannel, pLastAnchor, pLastAnchorPath);
			}
			else
			{
                tSlider = tNewGo.GetComponent<UIScrollBar>();
				
				foreach(Transform tTrans in tNewGo.transform)
				{
					DestroyImmediate(tTrans.gameObject);
				}
			}
		}
		else
		{
			tNewGo 						= new GameObject(tName);
			tNewGo.transform.parent 	= lastRoot;
			tNewGo.transform.position 	= AdjustPosition(tPosX, tPosY);
			tNewGo.transform.localScale = Vector3.one;

            tSlider = tNewGo.AddComponent<UIScrollBar>();
            NGUITools.AddWidgetCollider(tSlider.gameObject);
			FastGUI.actualFastGUIOutput.references.Add(tLayerID, tNewGo.GetInstanceID());
		}
		
		return tSlider.transform;
	}
	public static Transform CreateButton(XMLNode pNode, UIPanel pTargetRootPannel, Transform pLastAnchor, string pLastAnchorPath )
	{	
		string 	tName		= pNode.GetNode ("name>0")["_text"].ToString();
		string 	tParentName	= pNode.GetNode ("path>0")["_text"].ToString();
		float 	tPosX		= float.Parse(pNode.GetNode ("posX>0")["_text"].ToString());
		float 	tPosY		= float.Parse(pNode.GetNode ("posY>0")["_text"].ToString());
		int 	tLayerID	= int.Parse(pNode.GetNode ("layerID>0")["_text"].ToString());
		
		
		Transform lastRoot = pTargetRootPannel.transform;
		
		
		if(tParentName == pLastAnchorPath)
		{
			lastRoot = pLastAnchor;
		}
		else
		{
			if(pTargetRootPannel.transform.FindChild(tParentName))
				lastRoot = pTargetRootPannel.transform.FindChild(tParentName);
		}
		
		Button tImageButton = null;
		GameObject tNewGo = null;
		if(FastGUI.actualFastGUIOutput.references.ContainsKey(tLayerID))
		{
			tNewGo 	= EditorUtility.InstanceIDToObject(FastGUI.actualFastGUIOutput.references[tLayerID]) as GameObject;
			if(tNewGo == null)
			{
				FastGUI.actualFastGUIOutput.references.Remove(tLayerID);	
				return CreateButton(pNode, pTargetRootPannel, pLastAnchor, pLastAnchorPath);
			}
			else
			{
				tImageButton 	= tNewGo.GetComponent<Button>();
				foreach(Transform tTrans in tNewGo.transform)
				{
					DestroyImmediate(tTrans.gameObject);
				}
			}
		}
		else
		{
			tNewGo 						= new GameObject(tName);
			tNewGo.transform.parent 	= lastRoot;
			tNewGo.transform.position 	= AdjustPosition(tPosX, tPosY);
			tNewGo.transform.localScale = Vector3.one;
			
			tImageButton				= tNewGo.AddComponent<Button>();
			
			FastGUI.actualFastGUIOutput.references.Add(tLayerID, tNewGo.GetInstanceID());
		}
		
		NGUITools.AddWidgetCollider(tImageButton.gameObject);
		
		return tImageButton.transform;
	}
	static public Transform CreateTextInput( XMLNode pNode, UIPanel pTargetRootPannel, Transform pLastAnchor, string pLastAnchorPath )
	{
        string tName = pNode.GetNode("name>0")["_text"].ToString();
        string tParentName = pNode.GetNode("path>0")["_text"].ToString();
        float tPosX = float.Parse(pNode.GetNode("posX>0")["_text"].ToString());
        float tPosY = float.Parse(pNode.GetNode("posY>0")["_text"].ToString());
        int tLayerID = int.Parse(pNode.GetNode("layerID>0")["_text"].ToString());


        Transform lastRoot = pTargetRootPannel.transform;


        if (tParentName == pLastAnchorPath)
        {
            lastRoot = pLastAnchor;
        }
        else
        {
            if (pTargetRootPannel.transform.FindChild(tParentName))
                lastRoot = pTargetRootPannel.transform.FindChild(tParentName);
        }

        UIInput tImageButton = null;
        GameObject tNewGo = null;
        if (FastGUI.actualFastGUIOutput.references.ContainsKey(tLayerID))
        {
            tNewGo = EditorUtility.InstanceIDToObject(FastGUI.actualFastGUIOutput.references[tLayerID]) as GameObject;
            if (tNewGo == null)
            {
                FastGUI.actualFastGUIOutput.references.Remove(tLayerID);
                return CreateButton(pNode, pTargetRootPannel, pLastAnchor, pLastAnchorPath);
            }
            else
            {
                tImageButton = tNewGo.GetComponent<UIInput>();
                foreach (Transform tTrans in tNewGo.transform)
                {
                    DestroyImmediate(tTrans.gameObject);
                }
            }
        }
        else
        {
            tNewGo = new GameObject(tName);
            tNewGo.transform.parent = lastRoot;
            tNewGo.transform.position = AdjustPosition(tPosX, tPosY);
            tNewGo.transform.localScale = Vector3.one;

            tImageButton = tNewGo.AddComponent<UIInput>();

            FastGUI.actualFastGUIOutput.references.Add(tLayerID, tNewGo.GetInstanceID());
        }

        NGUITools.AddWidgetCollider(tImageButton.gameObject);

        return tImageButton.transform;
	}
	
	
}

小结:

       最近工作有点忙,就没怎么更新博客,虽然满篇都是代码,D.S.Qiu觉得对这篇博客感兴趣的一定是了解用过FastGUI 的,代码上精简了很多,但是PSD导出的过程还是很慢,对JavaScript(没有类型的语言)还是挺无语的和没空去琢磨Adobe Script api,所以只能在原来的基础上造车,如果你有更好的从PSD到上次Unity的UI的方案或插件(其实FastGUI的最主要的作用就是定位),希望能够得到您的分享。

 

 

       如果您对D.S.Qiu有任何建议或意见可以在文章后面评论,或者发邮件(gd.s.qiu@gmail.com)交流,您的鼓励和支持是我前进的动力,希望能有更多更好的分享。

        转载请在文首注明出处:http://dsqiu.iteye.com/blog/1995248

更多精彩请关注D.S.Qiu的博客和微博(ID:静水逐风)

 

2
0
分享到:
评论

相关推荐

    FastGUI for NGUI1.3.3

    《FastGUI for NGUI 1.3.3:Unity中的高效UI工具》 在Unity引擎中,NGUI是一个广泛使用的2D用户界面(UI)系统,它为开发者提供了丰富的工具来创建复杂的交互式图形界面。然而,对于大量设计资源的处理,尤其是...

    NGUI3.0最新版

    NGUI 是一个专门为 Unity 开发者设计的图形用户界面(GUI)系统,它极大地扩展了 Unity 原生的 GUI 功能,提供了更高级、更灵活的界面设计工具。NGUI 3.0 是该系统的最新版本,针对早期版本进行了诸多优化和改进,被...

    NGUI 2022.06.08

    NGUI最新版

    NGUI3.0最新版本

    之前都是用2.6版本,最近听说新版本好用,于是就下了NGUI3.0最新版本

    NGUI 3.12.b

    总的来说,NGUI 3.12.b是用于创建高效、交互性强的Unity UI的工具集,其丰富的功能和优化设计使得开发者能够构建各种复杂的界面效果。对于需要升级或初次接触NGUI的开发者来说,这个版本提供了一个强大的起点。

    NGUI v.3.0.2

    总的来说,NGUI v.3.0.2是Unity3D开发者构建高质量UI不可或缺的工具,它的稳定性和丰富的功能使其在众多UI框架中脱颖而出。通过深入学习和熟练应用,开发者能够创建出既美观又高效的用户界面,提升游戏的整体用户...

    FastGUI 30 for NGUI

    用于分析psd NGUI的Unity 3 d工具 这是我创造出超过两年的工具。 但是,自从我公开了源代码的复制版之后,我决定公开它,然后公开开放型项目。 虽然有点老套,但是在照片店里销售的파스토好像比较好。 所以所有的一切都...

    NGUI 2020.1.5.unitypackage

    Unity NGUI2020.1.5

    FastGUI for NGUI1.3.3 (新测)

    FastGUI是NGUI的一个扩展 所以必须要有NGUI才能使用 FastGUI主要功能是把PSD文件转为NGUI的Sprite 详细请百度 仅供测试和学习用 商用请购买正版 谢谢

    NGUI 2020.1.5

    最新版NGUI 2020.1.5,支持Unity版本5.6.7或更高,官方地址: https://assetstore.unity.com/packages/tools/gui/ngui-next-gen-ui-2413

    NGUI 2.3.3.unitypackage 最新版本

    NGUI 2.3.3.unitypackage 最新版本

    U3D NGUI 2020.1.5.zip

    在这款强大的工具中,NGUI是一个早期的用户界面(UI)系统,为开发者提供了创建复杂、高性能的游戏界面的功能。这个"U3D NGUI 2020.1.5.zip"压缩包包含了NGUI在Unity 2020.1.5版本的资源和组件,据描述,即使在稍后...

    NGUI v.3.0.5(最新完整版)

    在 Unity3D 的早期版本中,NGUI 是一个非常流行且功能强大的插件,它提供了丰富的 UI 组件和工具,帮助开发者创建出高效、美观且交互性强的用户界面。NGUI v.3.0.5 是该系统的最新完整版,它包含了对先前版本的优化...

    NGUI3.11.02

    《NGUI3.11.02:Unity3D UI插件详解》 Unity3D作为一款强大的游戏开发引擎,其内置的UI系统虽然能满足基本需求,但在处理复杂交互和高性能UI时,往往显得力不从心。为了解决这个问题,开发者们引入了第三方插件,...

    unity插件NGUI Next-Gen UI v2019.3.0.rar

    NGUI is a very powerful UI system and event notification framework. Features - Editor integration, WYSIWYG - Localization, data binding, delegates, events - Supports all platforms - Make UIs that ...

    NGUI v2018.3.0e.zip

    NGUI,全称为Next-Generation User Interface,是一款针对Unity引擎设计的用户界面(UI)系统,旨在提供强大、灵活且高效的界面开发工具。NGUI v2018.3.0e是该系统的最新版本,专为Unity 2018.3.0e构建,旨在优化...

    unity的插件NGUI3.9.9

    Unity的插件NGUI是Unity引擎中一个广泛使用的用户界面(UI)系统,尤其在早期版本中非常流行。NGUI3.9.9是该插件的一个特定版本,提供了丰富的功能来帮助开发者创建复杂的2D和3D游戏界面。在这个版本中,开发者可以...

    PlayMaker NGUI Scripts.rar

    其次,NGUI是Unity中一款优秀的2D用户界面(UI)系统,它提供了丰富的UI组件和灵活的布局选项,使得开发者可以轻松创建出美观且响应式的界面。NGUI支持自定义皮肤,支持事件处理,可以轻松实现按钮点击、滑动条操作...

    unity3d_NGUI v.3.11.2

    NGUI是Unity3D中的一个早期UI系统,全称为Next-Gen UI,它提供了丰富的用户界面设计工具,帮助开发者创建美观且功能丰富的界面。NGUI v.3.11.2是该系统的特定版本,包含了一些优化和改进,以适应不断发展的游戏开发...

Global site tag (gtag.js) - Google Analytics