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:静水逐风)
相关推荐
《FastGUI for NGUI 1.3.3:Unity中的高效UI工具》 在Unity引擎中,NGUI是一个广泛使用的2D用户界面(UI)系统,它为开发者提供了丰富的工具来创建复杂的交互式图形界面。然而,对于大量设计资源的处理,尤其是...
NGUI 是一个专门为 Unity 开发者设计的图形用户界面(GUI)系统,它极大地扩展了 Unity 原生的 GUI 功能,提供了更高级、更灵活的界面设计工具。NGUI 3.0 是该系统的最新版本,针对早期版本进行了诸多优化和改进,被...
NGUI最新版
之前都是用2.6版本,最近听说新版本好用,于是就下了NGUI3.0最新版本
总的来说,NGUI 3.12.b是用于创建高效、交互性强的Unity UI的工具集,其丰富的功能和优化设计使得开发者能够构建各种复杂的界面效果。对于需要升级或初次接触NGUI的开发者来说,这个版本提供了一个强大的起点。
总的来说,NGUI v.3.0.2是Unity3D开发者构建高质量UI不可或缺的工具,它的稳定性和丰富的功能使其在众多UI框架中脱颖而出。通过深入学习和熟练应用,开发者能够创建出既美观又高效的用户界面,提升游戏的整体用户...
用于分析psd NGUI的Unity 3 d工具 这是我创造出超过两年的工具。 但是,自从我公开了源代码的复制版之后,我决定公开它,然后公开开放型项目。 虽然有点老套,但是在照片店里销售的파스토好像比较好。 所以所有的一切都...
Unity NGUI2020.1.5
FastGUI是NGUI的一个扩展 所以必须要有NGUI才能使用 FastGUI主要功能是把PSD文件转为NGUI的Sprite 详细请百度 仅供测试和学习用 商用请购买正版 谢谢
最新版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是一个早期的用户界面(UI)系统,为开发者提供了创建复杂、高性能的游戏界面的功能。这个"U3D NGUI 2020.1.5.zip"压缩包包含了NGUI在Unity 2020.1.5版本的资源和组件,据描述,即使在稍后...
在 Unity3D 的早期版本中,NGUI 是一个非常流行且功能强大的插件,它提供了丰富的 UI 组件和工具,帮助开发者创建出高效、美观且交互性强的用户界面。NGUI v.3.0.5 是该系统的最新完整版,它包含了对先前版本的优化...
《NGUI3.11.02:Unity3D UI插件详解》 Unity3D作为一款强大的游戏开发引擎,其内置的UI系统虽然能满足基本需求,但在处理复杂交互和高性能UI时,往往显得力不从心。为了解决这个问题,开发者们引入了第三方插件,...
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,全称为Next-Generation User Interface,是一款针对Unity引擎设计的用户界面(UI)系统,旨在提供强大、灵活且高效的界面开发工具。NGUI v2018.3.0e是该系统的最新版本,专为Unity 2018.3.0e构建,旨在优化...
Unity的插件NGUI是Unity引擎中一个广泛使用的用户界面(UI)系统,尤其在早期版本中非常流行。NGUI3.9.9是该插件的一个特定版本,提供了丰富的功能来帮助开发者创建复杂的2D和3D游戏界面。在这个版本中,开发者可以...
其次,NGUI是Unity中一款优秀的2D用户界面(UI)系统,它提供了丰富的UI组件和灵活的布局选项,使得开发者可以轻松创建出美观且响应式的界面。NGUI支持自定义皮肤,支持事件处理,可以轻松实现按钮点击、滑动条操作...
NGUI是Unity3D中的一个早期UI系统,全称为Next-Gen UI,它提供了丰富的用户界面设计工具,帮助开发者创建美观且功能丰富的界面。NGUI v.3.11.2是该系统的特定版本,包含了一些优化和改进,以适应不断发展的游戏开发...