流程:

1.确保psd的单位是像素

2.PS里面选择 文件->脚本->浏览,然后选择脚本changePSD.jsx

3.将生成的xml文件放到Sublime Text,选择 文件->设置文件编码->UTF-8,保存

4.打开Unity,Hierarchy界面创建新的Panel,选中Panel,选中Assets->UI工具->生成预设prefab->选中上面的xml文件,生成

生成规则

生成规则是根据显示的图层生成的,所以不需要生成的都设置为不可见

图集目录命名规范

Assets\Artist\Atlas\统一放在这个目录下,并且图集文件夹名字和图集名字要一致

例子Assets\Artist\Atlas\background\background.prefab

字集目录规范

字集的预设直接生成在这个目录:Assets\Arist\Font

例子:Assets\Arist\Font\Font_Powerup.prefab

Unity命名规则

按钮图标        btn_xxx

图标               icon_xxx

面板               panel_xxx

背景               bg_xxx

文字               txt_xxx

勾选框           checkBtn_xxx

某个子item     item_xxx

命名规则

字体:UILabel+24+simhei+txt_xxx(UILabel为控件名必填,24为字体大小,simhei为字集名,txt_xxx为unity命名)

或只命unity名 字体:txt_xxx

艺术字:UINGUILabel+24+font_fight_blue2+txt_xxx(UINGUILabel为控件名,24为字体大小,font_fight_blue2为资源名,txt_xxx为unity命名)

Sprite:UISprite+kongjian+icon_lock+icon_xxx(UISprite为控件名,kongjian为图集名,icon_lock为资源名,icon_xxx为unity命名)

Texutre:UITexture+Head+1001+bg_xxx(UITexture为控件名,Head为文件夹名字,1001为资源名,bg_xxx为unity命名)

changePSD.jsx

var doc = app.activeDocument
var out = "" //创建储存遍历结果的变量
var depth = 0;
var root = new XML("<root/>");getLayer(doc.layers, 0)//变量图层
var xml = root.toXMLString();
xml = xml.replace(/'/g,'"');
var file = new File();
var fileNew = file.saveDlg("Save new file", "*.xml");
if (fileNew)
{fileNew.open("w");xml = xml.replace(/
/g, "\n"); //这一步是为了替换换行符号fileNew.write(xml);fileNew.close();
}function getLayers(layers, count)
{for(var i=0; i<layers.length; i++){if(!layers[i].visible) // 只处理显示可见的{continue;}if(layers[i].typename == "LayerSet") // 判断是否为图层组{var group = new XML("<group/>");group.@name = layers[i].name;group.@parent = layers[i].parent.name;group.@opacity = layers[i].opacity.toFixed(0);root.appendChild(group);getLayers(layers[i].layers, count+1);//递归}else{var layer = new XML("<layer/>");layer.@name = layers[i].name;layer.@index = depth;layer.@kind = layers[i].kind;layer.@parent = layers[i].parent.name;layer.@bounds = layers[i].bounds;layer.@opacity = layers[i].opacity.toFixed(0);if(layers[i].kind == LayerKind.TEXT){layer.@r = layers[i].textItem.color.rgb.red.toFixed(0);layer.@g = layers[i].textItem.color.rgb.green.toFixed(0);layer.@b = layers[i].textItem.color.rgb.blue.toFixed(0);layer.@txt = layers[i].textItem.contents;layer.@font = layers[i].textItem.font;}if(layers[i].kind == LayerKind.SMARTOBJECT){layer.@a = layers[i].rotate;}root.appendChild(layer);depth++;}}
}

C#根据xml文件导出unity界面prefab

using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using System.Collections;
using System.IO;
using System.Text;
using System;
using System.Xml;public class PsdToPrefab : Editor {// 根据字集图集设置生成默认depthprivate static Dictionary<string, int> depth_name_dict = new Dictionary<string, int>{//font{"simhei", 8},{"FontPower", 9},{"artfont_1", 10},{"Font_Vip", 11},// atlas{"background", 0},{"kongjian", 1},{"mainUI", 1},{"ui_icon", 2},{"functionicon", 2},{"Artfont", 7},// texture{"bgs", 0},{"common_bg", 0},{"cubehead", 3},{"Head", 3},{"tips_bg", 0}};private static GameObject GetParent(string parent){GameObject gobjParent = null;if (parent.Contains(".psd")){gobjParent = Selection.activeGameObject;}else{gobjParent = GameObject.Find(parent);}return gobjParent;}public static UIAtlas GetAtlas(string name){string path = "Assets/Artist/UI/Atlas/kongjian/kongjian.prefab";path = "Assets/Artist/UI/Atlas"+name+"/"+name+".prefab";GameObject gobjAtlas = AssetDatabase.LoadMainAssetAtPath(path) as GameObject;UIAtlas atlas = gobjAtlas.GetComponent<UIAtlas>();return atlas;}private static Bounds GetBounds(string bounds){string[] vals = bounds.Split(',');string valLeft = vals[0].Replace(" px", "");string valUp = vals[1].Replace(" px", "");string.valRight = vals[2].Replace(" px", "");string.valBottom = vals[3].Replace(" px", "");int left = (int)Convert.ToSingle(valLeft);int right = (int)Convert.ToSingle(valRight);int up = (int)Convert.ToSingle(valUp);int bottom = (int)Convert.ToSingle(valBottom);int width = right - left;int height = bottom - up;int x = Mathf.RoundToInt(left + width / 2f - 720 / 2f);int y = Mathf.RoundToInt(1280 / 2f - up - height / 2f);return new Bounds(new Vector3(x, y), new Vector3(width, height));}[MenuItem("Assets/UI工具/生成预设prefab &w")]static void Create(){string path = EditorUtility.OpenFilePanel("XML For UI", "", "xml");if(!string.IsNullOrEmpty(path)){FileStream aFile = new FileStream(path, FileMode.Open);if (aFile != null){StreamRender sr = new StreamRender(aFile, System.Text.Encoding.UTF8);string strXML = sr.ReadToEnd();XmlDocument doc = new XmlDocument();doc.LoadXml(strXML);XmlNode nodeRoot = doc.SelectSingleNode("root");int length = nodeRoot.ChildNodes.Count;foreach(XmlNode node in nodeRoot){XmlAttributeCollection attrColl = node.Attributes;XmlAttribute attrName = (XmlAttribute)attrColl.GetNamedItem("name");XmlAttribute attrIndex = (XmlAttribute)attrColl.GetNamedItem("index");XmlAttribute attrKind = (XmlAttribute)attrColl.GetNamedItem("kind");XmlAttribute attrParent = (XmlAttribute)attrColl.GetNamedItem("parnet");XmlAttribute attrBounds = (XmlAttribute)attrColl.GetNamedItem("bounds");XmlAttribute attrOpacity = (XmlAttribute)attrColl.GetNamedItem("opacity");XmlAttribute attrR = (XmlAttribute)attrColl.GetNamedItem("r");XmlAttribute attrG = (XmlAttribute)attrColl.GetNamedItem("g");XmlAttribute attrB = (XmlAttribute)attrColl.GetNamedItem("b");XmlAttribute attrTxt = (XmlAttribute)attrColl.GetNamedItem("txt");XmlAttribute attrFont = (XmlAttribute)attrColl.GetNamedItem("font");string name = attrName.Value;string parent = attrParent.Value;int opac = int.Parse(attrOpacity.Value);if (node.Name == "group"){GameObject gobjParent = GetParent(parent);GameObject gobjGroup = new GameObject(name);gobjGroup.transform.parent = gobjParent.transform;gobjGroup.transform.localPosition = Vector3.zero;gobjGroup.transform.localScale = Vector3.one;}else if(node.Name == "layer"){int index = int.Parse(attrIndex.Value);string kind = attrKind.Value;string strBounds = attrBounds.Value;Bounds bounds = GetBounds(strBounds);if (kind.Contains(".TEXT")){string[] Strs = name.Split('+');// 文本byte R = byte.Parse(attrR.Value);byte G = byte.Parse(attrG.Value);byte B = byte.Parse(attrB.Value);string txt = attrTxt.Value;string font = attrFont.Value;GameObject gobjParent = GetParent(parent);UIlabel uiLab = NGUISettings.AddLabel(gobjParent);uiLab.gameObject.AddComponent<UILabelAtlas>().addAtlas(AssetDatabase.LoadAssetAtPath<UIAtlas>("Assets/Artist/UI/Atlas/kongjian/kongjian.prefab"), "kongjian");widget = uiLab;if (name.StartsWith("UINGUILabel")){uiLab.ambigiousFont = null;uiLab.bitmapFont = AssetDatabase.LoadAssetAtPath("Assets/Artist/UI/Font/"+Strs[2]+".prefab", typeof(UIFont)) as UIFont;res_name = Strs[2];}else{uiLab.bitmapFont = null;uiLab.ambigiousFont = AssetDatabase.LoadAssetAtPath("Assets/Artist/UI/Font/simhei.ttf", typeof(UnityEngine.Object)) as UnityEngine.Object;res_name = "simhei";}uiLab.text = txt;uiLab.color = new Color32(R, G, B,(byte)(opac / 100f *255));uiLab.transform.localPosition = new Vector3(bounds.center.x, bounds.center.y, 0);uiLab.overflowMethod = UILabel.Overflow.ResizeFreely;if (Strs.Length > 1)uiLab.fontSize = (int)Convert.ToSingle(Strs[1]);elseuiLab.fontSize = (int)bounds.size.y;uiLab.applyGradient = false;if (Strs.Length > 3)uiLab.name = Strs[3];else if(Strs.Length == 1)uiLab.name = Strs[0];}else if(name.StartsWith("UISprite")){//图片GameObject gobjParent = GetParent(parent);string[] Strs = name.Split('+');if(Strs.Length >2){UIAtlas atlas = GetAtlas(Strs[1]);UISprite txu = NGUITools.AddSprite(gobjParent, atlas, Strs[2].Replace(" ",""));widget = txu;res_name = Strs[1];if(txu.hasBorder)txu.type = UIBasicSprite.Type.Sliced;elsetxu.type = UIBasicSprite.Type.Simple;txu.transform.localPosition = new Vector3(bounds.center.x, bounds.center.y, 0);txu.SetDimensions((int)bounds.size.x, (int)bounds.size.y);//alpha//txu.alpha = opac / 100f;if(Strs.Length > 3)txu.name = Strs[3];}}else if(name.StartsWith("UITexture")){//UITextureGameObject gobjParent = GetParent(parent);string[] Strs = name.Split('+');if (Strs.Length > 2){Shader shader = Shader.Find("Unlit/Transparent Colored");UITexture mHighlight = NGUITools.AddWidget<UITexture>(gobjParent);widget = mHighlight;mHighlight.name = "UITexture";mHighlight.shader = shader;res_name = Strs[1];string texturePath = "UI/Texture"+Strs[1]+"/"+Strs[2].Replace(" ", "");Texture mTexture = Resources.Load<Texure>(texturePath);mHighlight.mainTexture = mTexture;mHighlight.transform.localPosition = new Vector3(bounds.center.x, bounds.center.y, 0);mHighlight.SetDimensions((int)bounds.size.x, (int)bounds.size.y);if(Strs.Length > 3)mHighlight.name = Strs[3];}}// 层级if (null != widget){int depth = 0;widget.depth = depth_name_dict.TryGetValue(res_name, out depth) ? depth : 1000;}}}}aFile.Close();}}
}

PSD文件生成Unity预设相关推荐

  1. 把psd自动生成html,根据psd文件生成html

    我是新手,怎样在ps中把psd文件变成html文件呢?我知道要用切片,但是具体步骤怎么做,还有是不是不同的ps版本有差异 不同的ps版本是没有什么差异的,主要用到的就是工具里面的切片,用切片切好图后, ...

  2. 美工psd转html工具,介绍两款可以将PSD文件生成XHTML+CSS 网页的Photoshop插件

    Divine是 一款以 Photoshop 插件形式存在的设计助手,它能够帮助你快速将PSD设计源文件转换成以XHTML和CSS布局的WordPress主题. Divine是 一款很有爱很有想法的小软 ...

  3. Unity PSD导入到Unity

    标题有歧义 准确来说是吧PSD拆分PNG之后到Unity中重组 PSD2Unity PSD生成UGUI界面和场景 https://github.com/ZeroUltra/PSD2Unity 点击st ...

  4. 英伟达“神笔马良”GauGAN发布Windows应用程序,可导出PSD文件

    丰色 发自 凹非寺 量子位 报道 | 公众号 QbitAI 大家还记得致敬印象派大师高更的GauGAN吗? 只需简单画几笔,就能生成逼真风景画的那个: 这个能让普通人秒变"神笔马良" ...

  5. AndroidStudio导出aar文件给Unity使用

    AndroidStudio导出aar文件给Unity使用 本文参考 :http://www.devacg.com/?post=548 Demo地址:https://github.com/JulyNin ...

  6. 大前端求人不如求己系列工具:如何PSD文件自动标注切图和真机预览

    前言 在很多时候,UI会给一部分切图,当你使用一个新的技术,需要的不再是png而是webp或者SVG时候,沟通变得异常复杂,沟通成本急剧增加. 很多时候在想,是否有一些工具,可以帮助我们解决这个尴尬的 ...

  7. Android适配--最详细的限定符屏幕适配方案解析 附带values-Dimens文件生成工具

    屏幕适配 前言 适配缘由 相关概念 适配方案 db适配 设计最大分辨率图片 屏幕分辨率限定符(宽高限定符) dimens文件生成原理 使用样例1 使用样例2 dimens文件生成脚本 总结 最小宽度限 ...

  8. 菜鸟小白初次下载Pr如何配置,以及普通文件、序列文件、psd文件的导入方法

    目录 一.Pr基础设置 新建项目设置 新建序列设置 二.Pr导入素材 第一种,普通素材 例如:图片.音频 第二种,序列文件 第三种,psd文件 三.手写笔记 1.pr是一款非线性编辑软件(可以简单理解 ...

  9. js解析PSD文件,Java处理psd文件智能图层

    现在市面上很多的webapp都提供模板功能,所谓模板就是一系列元素的集合,模板的制作一般都需要设计师先在Photoshop等软件中制作好设计好,然后再一定的方式来还原设计稿,要么需要编码要么需要在某些 ...

最新文章

  1. php5.4dev版本是,ubuntu 编译安装php5.4以上版本
  2. 配置ISA Server 2006 ×××使用户轻松连接内网
  3. 建模大师怎么安装到revit中_全面解析Revit软件在装配式建筑项目中的建模思路...
  4. Solr入门和实践以及我对Solr的8点理解
  5. docker安装教程-centos
  6. 2018蓝桥杯省赛---java---A--2-(星期一)
  7. 冒泡排序提前终止条件_“离职要提前30天通知”这9种误区,你踩过几个?
  8. 把算术表达式 表示为一个c语言表达式,正确的写法是____,C与C++程序设计-中国大学mooc-题库零氪...
  9. 循环下标_【转】【Python效率】五种Pandas循环方法效率对比
  10. 邱锡鹏:为什么相比于CV,NLP领域的发展要缓慢?
  11. 12c emcc Algorithm negotiation fail
  12. spss分析qpcr数据_SPSS统计分析案例:Kappa一致性系数
  13. html中代表颜色的字母16个,html中16进制的代码对应颜色表
  14. 台式机装苹果系统_苹果电脑macbook装windows系统U盘启动的详细方法
  15. 【爬虫】巧用 js2py (附带bug解决)
  16. ubuntu从零到一跑通ORB_SLAM2及其ORBSLAM2_with_pointcloud稠密建图
  17. 微信怎么建群?三种方法,总有一种适合你!
  18. 顺丰速运——深圳二面(19分钟)
  19. 对 BFC 规范(块级格式化上下文:block formatting context)的理解?
  20. linux的lib目录,Linux 目录结构:/lib 分析

热门文章

  1. 录屏软件OBS录屏时噪声大的解决办法
  2. 多队列网卡及RPS/RFS/XPS设置
  3. 人脸识别——使用谷歌Firebase-ML Kit实现
  4. v.douyin.com生成制作抖音缩短口令网址php接口方法
  5. php生成cmyk图片,用ImageMagick创建cmyk颜色的图片,在photoshop中显示的cmyk值不一样!...
  6. 小封装SOT23车规加密认证芯片ALPU-CV
  7. TTMS剧院票务管理系统(xupt)
  8. XUPT_ACM2021寒假训练第二周练习记录
  9. RestTemplate的用法
  10. ICMP目的网络,主机,协议,端口不可达报文的Type值,Code值分别是