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 ="\n";
// add header line1
str += "\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 += " \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 += " \n";
if(widgetType=="Sliced"||widgetType=="Tiled"||widgetType=="Filled")
str += " "+tObjName.substring(4)+" \n";
else
str += " "+tObjName+" \n";
str += " "+widgetType+"\n";
str += " "+ pPath +" \n";
str += " "+ layerData.middleCenterX +" \n";
str += " "+ layerData.middleCenterY +" \n";
str += " "+ layerData.layerWidth +" \n";
str += " "+ layerData.layerHeight +" \n";
str += " "+atlasName+" \n";
str += " "+ tSourceName+" \n";
str += " "+ tLayerID +" \n"
str += " \n";
// if(atlasName=="")
CloseAndSaveAsPNG(newDoc);
}
function ExportAnchor(pDoc, pTargetObj, pPath)
{
var tLayerID = getActiveLayerID();
layerData = cLayer(pDoc, pTargetObj);
layerReadCount
str += " \n";
str += " "+pTargetObj.name+" \n";
str += " "+ pPath +" \n";
str += " "+ layerData.middleCenterX +" \n";
str += " "+ layerData.middleCenterY +" \n";
str += " "+ tLayerID +" \n";
str += " \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 += " \n"+ tText.font;
//var tType = tPrefix == "txt_" ? "TEXT_LABEL" : "INPUT_TEXT";
str += " \n";
str += " "+pTargetObj.name.substring(4)+" \n";
str += " "+ pPath +" \n";
str += " "+ layerData.middleCenterX +" \n";
str += " "+ layerData.middleCenterY +" \n";
str += " "+ layerData.layerWidth +" \n";
str += " "+ layerData.layerHeight +" \n";
str += " "+ tText.font +" \n";
str += " "+ tSize +" \n";
str += " "+ tText.color.rgb.red +";"+ tText.color.rgb.green +";"+ tText.color.rgb.blue +" \n";
str += " "+ tText.contents+" \n";
str += " "+ tLayerID +" \n";
str += " \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 + " ");
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 references = new Dictionary();
}
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 pathTransDic = new Dictionary();
[MenuItem("Monster Juice/Fast GUI")]
static void ShowWindow ()
{
EditorWindow.GetWindow();
}
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 transformDic = new Dictionary();
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();
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(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(tNode, targetRootPanel, tLastAnchor, tLastAnchorPath);
}
else if( tType == "CHECKBOX" )
{
tLastAnchor = FastGUIPostProcessing.CreateWidgetContainer(tNode, targetRootPanel, tLastAnchor, tLastAnchorPath);
}
else if( tType == "SLIDER" )
{
tLastAnchor = FastGUIPostProcessing.CreateWidgetContainer(tNode, targetRootPanel, tLastAnchor, tLastAnchorPath);
}
else if( tType == "PROGRESSBAR" )
{
tLastAnchor = FastGUIPostProcessing.CreateWidgetContainer(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())
{
return tTarget.transform.parent.gameObject.GetComponent();
}
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();
// 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();
}
private void ProcessLast()
{
string member = "", findMem = "";
List commonList = new List();
List middleList = new List();
List fontList = new List();
foreach ( KeyValuePair 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());
}
else
middleList.Add(trans.gameObject.GetComponent());}
else if(tType == "TEXT_LABEL")
{
fontList.Add(trans.gameObject.GetComponent());}
else if (tType == "BUTTON")
{
Button button = trans.GetComponent();
NGUITools.AddWidgetCollider(trans.gameObject);
member += " private Button " + tName + ";\n";
findMem += " " + tName + " = FindInChild(\"" + tPath + "\");\n";
}
else if (tType == "INPUT")
{
UIInput input = trans.GetComponent();
if(trans.FindChild("label") != null )
{
UILabel label = trans.FindChild("label").GetComponent();
input.label = label;
}
NGUITools.AddWidgetCollider(trans.gameObject);
member += " private UIInput " + tName + ";\n";
findMem += " " + tName + " = FindInChild(\"" + tPath + "\");\n";
}
else if (tType == "CHECKBOX")
{
UIToggle toggle = trans.GetComponent();
if(trans.FindChild("checkmark")!=null)
toggle.activeSprite = trans.FindChild("checkmark").GetComponent();
toggle.value = true;
NGUITools.AddWidgetCollider(trans.gameObject);
member += " private UIToggle " + tName + ";\n";
findMem += " " + tName + " = FindInChild(\"" + tPath + "\");\n";
}
else if (tType == "SLIDER")
{
UISlider slider = trans.GetComponent();
if (trans.FindChild("foreground") != null && trans.FindChild("background") != null)
{
UISprite foreground = trans.FindChild("foreground").GetComponent();
UISprite background = trans.FindChild("background").GetComponent();
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(\"" + tPath + "\");\n";
}
else if (tType == "PROGRESSBAR")
{
UIScrollBar scrollBar = trans.GetComponent();
if (trans.FindChild("foreground") != null && trans.FindChild("background") != null)
{
UISprite foreground = trans.FindChild("foreground").GetComponent();
UISprite background = trans.FindChild("background").GetComponent();
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(\"" + 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
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(lastRoot.gameObject);
FastGUI.actualFastGUIOutput.references.Add(tLayerID, tSpriteWidget.gameObject.GetInstanceID());
}
else
{
tSpriteWidget = tNewGo.GetComponent();
}
}
else
{
tSpriteWidget = NGUITools.AddWidget(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();
// 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();
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();
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();
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();
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();
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();
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();
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();
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();
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();
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有任何建议或意见可以在文章后面评论,或者发邮件([email protected] )交流,您的鼓励和支持是我前进的动力,希望能有更多更好的分享。
转载请在文首 注明出处:http://dsqiu.iteye.com/blog/1995248
更多精彩请关注D.S.Qiu的博客和微博(ID:静水逐风)