【Unity编辑器扩展】(一)PSD转UGUI Prefab, Aspose.PSD和Harmony库的使用

这篇具有很好参考价值的文章主要介绍了【Unity编辑器扩展】(一)PSD转UGUI Prefab, Aspose.PSD和Harmony库的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【Unity编辑器扩展】(二)PSD转UGUI Prefab, 图层解析和碎图导出_psd导入unity_TopGames的博客-CSDN博客

【Unity编辑器扩展】(三)PSD转UGUI Prefab, 一键拼UI/同步字体/自动9宫切图(完结篇)_TopGames的博客-CSDN博客

解放UI程序/美术? psd文件一键转ui prefab 支持所有ui类型 支持textmeshpro

psd一键转ugui prefab工具 设计原理和详细使用方法

“拼UI是该策划负责还是程序负责?”一直是国内游戏行业极具争议的话题。

矛盾点也很清楚:

程序:拼UI繁琐,没有技术含量,应该交给策划拼,程序工作繁重应该把时间用在刀刃上。

策划:程序对拼UI的层次结构、命名要求复杂,拼UI需要技术思维,应该由程序负责。

总之各有道理,但是话说回来,既然UI设计师在设计UI界面时必然会拼好UI元素,各种图层、颜色、字体字号信息都有,为什么还要重复UI设计师的工作再次人工拼一次UI呢?

事实上市面上早已有蓝湖在解决这一痛点,PS安装蓝湖插件后,通过标记切图就能一键UI上传到蓝湖网站,项目组成员就能看到UI的布局、字体字号、UI元素间距/位置、批量下载切图等。蓝湖有免费版、付费版,如果担心资源安全,企业也可以购买内网部署服务,所以很多公司都在用蓝湖协作。但是,蓝湖是针对Android、iOS、Web设计,实质上对于Unity游戏UI来说,蓝湖只是解决了可以不让UI仔通过目测调位置、调字号等,蓝湖解析出psd图层的具体数值信息,还是需要人工拼UI。

UI设计师常用工具adobe illustrator和Photoshop,而adobe illustrator也可以导出为psd文件,所以写一个工具直接根据Photoshop文件(psd)自动生成拼好的UI界面prefab岂不美哉?

一,Aspose.PSD .Net库的使用

Aspose.PSD .Net库下载:https://download.csdn.net/download/final5788/87685311

Aspose官网:File Format APIs for Word Excel PDF Email PowerPoint Barcode Images OCR Note and 3D 

 一款收费的psd文件解析库,需要购买License。Aspose.PSD不依赖ps软件,使用C#脚本直接解析psd文件,支持多种图层解析、导出图层切图,还支持合并图层等,功能非常强大。

通过Aspose.PSD解析图层信息,甚至不需要UI设计师把图层栅格化成图片图层,可以直接将形状图层、填充色图层等直接导出成图片,对于文本层(TextLayer)可以直接读取到文本字体、字号、颜色等信息,直接对等生成Unity UGUI的Text文本组件或TextMeshProUGUI组件并自动设置好文本样式。

1. 用PS简单做个界面,导出psd放入Unity工程:

psd ugui,Unity,Unity游戏框架,Aspose.PSD,PSD转UGUI,Unity,Harmony

 2. 使用Aspose.PSD接口解析并导出碎图

下面是使用Aspose.PSD解析psd图层的简单示例:

using (var psd = Aspose.PSD.Image.Load(psdFile) as PsdImage)
            {
                foreach (var layer in psd.Layers)
                {
                    var layerTp = layer.GetType();
                    Debug.Log($"{layer.Name}->{layerTp.Name}");
                    switch (layerTp.Name)
                    {
                        case LayerType.Layer:
                        case LayerType.FillLayer:
                        case LayerType.TextLayer:

                            var fileName = Path.Combine(Path.GetDirectoryName(psdFile), Path.GetFileNameWithoutExtension(psdFile), $"{layer.DisplayName}.png");
                            var fileDir = Path.GetDirectoryName(fileName);
                            if (!Directory.Exists(fileDir)) Directory.CreateDirectory(fileDir);

                            layer.ToBitmap().Save(fileName, System.Drawing.Imaging.ImageFormat.Png);
                            break;
                        //case LayerType.FillLayer://填充色图层

                        //    break;
                        //case LayerType.TextLayer:
                        //    if (layer is TextLayer txtLayer)
                        //    {
                        //        Debug.Log($"文本层:{txtLayer.Text}, color:{txtLayer.TextColor}");
                        //    }
                        //    break;
                        //case LayerType.SectionDividerLayer:
                        //    break;
                        //case LayerType.LayerGroup://组
                        //    if (layer is LayerGroup gpLayer)
                        //    {

                        //    }
                        //    break;
                    }

                }
            }


class LayerType
        {
            internal const string Layer = "Layer";
            internal const string FillLayer = "FillLayer";
            internal const string TextLayer = "TextLayer";
            internal const string SectionDividerLayer = "SectionDividerLayer";
            internal const string LayerGroup = "LayerGroup";
        }

 把psd图层保存成图片文件:

imgLayer.ToBitmap().Save(fileName, System.Drawing.Imaging.ImageFormat.Png);

 甚至可以用之前写过的图片压缩工具,在导出碎图时自动对碎图进行压缩。

程序成功导出碎图,但是图片上带有水印,文本图层导出成图片后也有瑕疵:

psd ugui,Unity,Unity游戏框架,Aspose.PSD,PSD转UGUI,Unity,Harmony

 Aspose好歹让正经试用一下啊,这样也不知道到底是因为没购买License故意制造的“瑕疵”,还是插件本身酒有瑕疵?

如果有Licenses需要先初始化证书:

new Aspose.PSD.License().SetLicense(new MemoryStream(Convert.FromBase64String("Your Licenses")));

所谓“先尝后买”,那就先鉴定插件是否有瑕疵,如果没有瑕疵咱再购买License。

用dnSpy打开dll发现,是我单纯了,不愧是技术型软件公司,混淆和反追踪几乎做到了极致,难怪这么自信,竟然敢以离线License的方式变现。

那就换种思路继续鉴定。。。

二、Harmony库的使用

不要误会,它跟华为的鸿蒙没有关系,Harmony是一个开源,可以运行时对C#函数打补丁的插件,支持.net和mono。

Harmony库开源地址:GitHub - pardeike/Harmony: A library for patching, replacing and decorating .NET and Mono methods during runtime

 思路:在网上找到一个公开的License,验证时Aspose.PSD报错提示,大概意思是许可证最大支持到xxx时间点之前发布的Aspose.PSD.dll,你的dll发布时间为xxx, 意思就是许可证过期无效。这条提示就暴露了:

1. 许可证字符串中保存着一个有效日期;

2. dll中保存着一个发布日期;

3. SetLicense时把许可证日期和dll发布日期进行了比较以判定是否验证成功。

根据以上线索定位到许可证日期是从Xml中得来的,报错提示贴心的给出了这个准确的许可证过期日期。

Ok,线索齐了。通过Harmony库给系统类System.Xml.XmlElement.InnerText的Getter方法注入个补丁,判断文本内容如果与许可证过期日期相同则把日期强制改为未来日期,这样就永远不会过期了。

Harmony使用方法:

首先定义补丁类:

在补丁类上加上:HarmonyPatch(Type declaringType, string methodName, MethodType methodType)

[HarmonyPatch(typeof(System.Xml.XmlElement), nameof(System.Xml.XmlElement.InnerText), MethodType.Getter)]
    class MagicPatch
    {
        static void Prefix()
        {

        }
        static void Postfix(ref string __result)
        {
            if (__result == "20210827")
            {
                __result = "20250827";
            }
        }
    }

其中静态方法Prefix:原函数调用前触发;Postfix:原函数调用时触发;注意:函数名不能变,固定Prefix和Postfix;

想要访问原函数的返回值必须在Postfix中,如上代码,ref string __result就是InnerText Get方法返回值的引用,可以直接修改引用的值。

定义完补丁类后就需要调用Harmony接口注入补丁后生效:

[InitializeOnLoadMethod]
        static void InitAsposeLicense()
        {
            if (licenseInitiated) return;
            var harmonyHook = new Harmony("Test");
            harmonyHook.PatchAll();

            new Aspose.PSD.License().SetLicense(new MemoryStream(Convert.FromBase64String("You License")));

            licenseInitiated = true;
            harmonyHook.UnpatchAll();
        }

PatchAll会自动注入HarmonyPatch标记过的补丁类,为了不影响其它使用Xml的InnerText,补丁用完不需要的时候,调用UnpatchAll取消所有补丁。

好的,就是这么简单。所有工作准备就绪,开始测试:

psd ugui,Unity,Unity游戏框架,Aspose.PSD,PSD转UGUI,Unity,Harmony

 再次导出psd图层,图片一切都正常了,证明Aspose.PSD库能够完美工作,存在的”瑕疵“是没有许可证的原因,可以放心大胆地购买许可证了。文章来源地址https://www.toymoban.com/news/detail-743021.html

工具开源地址:https://github.com/sunsvip/PSD2UGUI_X

到了这里,关于【Unity编辑器扩展】(一)PSD转UGUI Prefab, Aspose.PSD和Harmony库的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity编辑器扩展 | 编辑器扩展基础入门

    前言 当谈到游戏开发工具,Unity编辑器是一个备受赞誉的平台。它为开发者提供了一个强大且灵活的环境,使他们能够创建令人惊叹的游戏和交互式体验。 然而,Unity编辑器本身也是可以扩展和定制的,这为开发者提供了进一步提升工作流程和增强功能的机会。 在Unity 编辑器

    2024年02月10日
    浏览(49)
  • Unity UGUI一键绑定UI控件工具(编辑器拓展)

    全为一键生成 实现自动生成代码绑定UI控件 并生成字典保存UI控件 减少自己拖拽 和手动书写过程 适用动态加载面板 建议搭配UI框架使用 根据当前选中的gameobject 查找其下方是否有对应类型的控件 有就保存到字典中 然后通过向上递归拼凑地址,然后生成到粘贴板 直接粘贴到目

    2024年04月23日
    浏览(49)
  • Unity 可视化节点编辑器(GraphView、编辑器扩展)

      前几天把导师的项目打包发布交了一稿,这半个星期除了再把项目缝缝补补外(说实话项目做到后边实在有些无聊,都是些琐碎的东西而且自己也学不到什么,纯粹是 浪费 消磨时间)无聊逛Unity商店发现了个有意思的东西,说实话一开始我以为只是单纯绘制的2D动画:

    2024年02月12日
    浏览(45)
  • Unity编辑器扩展(外挂)

    每日一句:未来的样子藏在现在的努力里 目录 什么是编译器开发 C#特性[System.Serializable] 特殊目录 命名空间 /*检视器属性控制*/     //添加变量悬浮提示文字     //给数值设定范围(最小0,最大150) //指定输入框,拥有5行 //默认显示5行,最多显示10行内容,再多用滚动条控

    2024年01月24日
    浏览(74)
  • Unity编辑器扩展之GenericMenu菜单扩展

    内容将会持续更新,有错误的地方欢迎指正,谢谢!   Unity编辑器扩展之GenericMenu自定义菜单       TechX 坚持将创新的科技带给世界! 拥有更好的学习体验 —— 不断努力,不断进步,不断探索 TechX —— 心探索、心进取! 助力快速掌握 GenericMenu 菜单扩展 为初学者节省宝贵的

    2024年02月01日
    浏览(60)
  • Unity 扩展自定义编辑器窗口

    在Assets文件夹路径下任意位置创建Editor文件夹,将扩展编辑器的代码放在Editor文件夹下 代码中首先引用命名空间 然后将创建的类继承自EditorWindow 然后通过扩展编辑器菜单功能调用创建窗口的方法 要注意方法中泛型参数需要传入的是自己代码的类,这个功能是根据后面OnGUI方

    2024年04月27日
    浏览(44)
  • Unity 编辑器扩展之 Attribute

    Unity内置属性[Attribute]是一种类似修饰功能的标签。可以对OnSceneGUI,InspectorGUI,MenuGUI,WindowGUI等实现各种各样的GUI扩展。用户只要添加上特性标签,就能够自由的使用这些扩展功能。下面列出一些常用的标签: 隐藏属性在Inspector面板上的显示。在继承了MonoBehaviour的类中,用

    2023年04月09日
    浏览(55)
  • Unity编辑扩展:功能篇之Json数据编辑器

    前言 编辑器扩展算是比较纯粹的功能开发,基本没有什么理论知识,都是一些 Unity 相关接口的使用与数据类型的设计操作等。在本篇文章主要的文字描述基本都是在做代码解释,为了使内容接受度更高,我会尽量描述到代码结构中的每个细节。如果有对此不太了解又很感兴

    2024年02月06日
    浏览(82)
  • 【Unity编辑器扩展】| Inspector监视器面板扩展

    前言 前面我们介绍了Unity中编辑器扩展的一些基本概念及基础知识,还有编辑器扩展中用到的相关特性Attribute介绍。 后面就来针对Uniity编辑器扩展中比较常用的模块进行学习介绍。 本文就来详细介绍一下Unity编辑器扩展中关于 Inspector面板 扩展功能学习。

    2024年02月08日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包