FairyGUI编辑器自定义菜单扩展插件

本文涉及到的软件有:FairyGUI,VSCode

代码环境涉及到了:Lua

VSCode插件:EmmyLua

在编写FairyGUI编辑器菜单前,了解一下FairyGUIEditor的API会有效的帮助我们解决很多问题。FairyGUI的扩展是通过编辑器自带的插件功能实现的,插件中我使用的是lua环境模板。导入编辑器的LuaAPI,文件可以在FairyGUI-Editor源码的插件目录中找到。接下来将通过功能来说明对应的API作用。

插件的位置

 如果找不到插件面板,可以通过“视图→插件”或“工具→插件”添加插件面板。

1、打开插件目录,插件目录是在“项目目录/plugins"文件夹下,每个插件对应一个子文件夹。

2、创建新插件

3、刷新插件列表

一个新插件的诞生

点击创建新插件,可以在插件模板选择要写的插件类型和语言格式

点击创建后,插件列表中就会出现刚刚创建的新插件。

这时候,点击打开插件目录,会发现原本空空的插件目录中多了一个刚刚新建的插件文件夹,右键使用VSCode打开。

可以注意到,目录下有两个文件“main.lua”和“package.json”。其中main.lua是插件的入口脚本,package.json是插件的配置文件。

双击main.lua后可以看到“onDestroy”方法,可以将之后的清理代码添加到此处。保存编写后的代码,在编辑器中点击刷新插件列表,可以将最新插件代码同步到编辑器。如果这时候编辑器保存,如果不是代码书写错误,可以通过重启编辑器进行刷新插件。

 编辑器的个人常用API

App是工程入口类,类型:CS.FairyEditor.App。通过LuaAPI中的CS_FairyEditor_App可以看到编辑器中的功能字段。下面将列出将要用的字段和方法。

CS.FairyEditor.App
字段名类型作用
projectCS.FairyEditor.FProject记录当前工程的配置和资源
libViewCS.FairyEditor.View.LibraryView编辑器的资源库面板
inspectorViewCS.FairyEditor.View.InspectorView编辑器的检查器面板
consoleViewCS.FairyEditor.View.ConsoleView编辑器的控制台面板
menuCS.FairyEditor.Component.IMenu编辑器的菜单栏
pluginManagerCS.FairyEditor.PluginManager插件管理
CS.FairyEditor.FProject
字段名类型作用
namestring工程名“如:FGUIProject”
basePathstring工程的路径“如:D:\Documents\FGUIProject”
assetsPathstring工程的路径“如:D:\Documents\FGUIProject\assets”
allPackagesCS.FairyEditor.Fpackage[]工程中的所有包
allBranchesstring[]工程中的所有分支
CS.FairyEditor.Fpackage
字段名类型作用
namestring当前包的名字
itemsCS.FairyEditor.FPackageItem[]当前包下的资源
CS.FairyEditor.FPackageItem
字段名类型作用
pathstring资源路径
namestring资源名
CS.FairyEditor.View.LibraryView
字段名类型作用
contextMenuCS.FairyEditor.Component.NPopupMenu资源库的右键菜单
CS.FairyEditor.Component.NPopupMenu
方法名参数作用
AddItemcaption:string, name:string, selectCallback:(fun():void)添加一个菜单项并设置选中回调事件
AddSeperator添加菜单分割线
SetItemGrayedstring name, bool grayed设置目标不能点击
onPopupCS.FairyGUI.EventListener菜单弹出事件

 开始编写插件代码

需求1

需求1:在工具菜单中添加“导出所有UI名字”的菜单项,点击后复制结果。

前提:所有UI界面具有相同的命名规则,这里我用的是UIXXX,所以在获取所有UI的时候只需要检测当前文件的名字UI是否存在。在这个需求实现的功能中,需要准备一个lua代码格式的文本代码,之后会将classField替换为获取到的UI名。

local tmp_ui_type = [[
---@class UIType
return {classField
}
]]

代码已经加了详细的注解,可以直接查看完整代码:

---@type CS.FairyEditor.App
local _app = CS.FairyEditor.App
local project = _app.project
---输出绝对文件路径
local file_out_path =("%s/UIType.lua"):format(project.basePath)
---Lua模板
local tmp_ui_type = [[
---@class UIType
return {classField
}
]]
---获取工具菜单
---@type CS.FairyEditor.Component.MenuBar
local toolMenu = _app.menu:GetSubMenu("tool")
---添加分隔符
toolMenu:AddSeperator()
---添加菜单,显示名字,内部标签名,回调方法
toolMenu:AddItem("导出UIType","XiaoExportUIType",function()local _classField = ""---获取工程中的所有包,返回值是列表local allPackages = _app.project.allPackagesfor i = 1, allPackages.Count do---C#索引从0开始---@type CS.FairyEditor.FPackagelocal package = allPackages[i - 1]---获取当前包中的所有子项,返回值是列表local items = package.itemsfor i = 1, items.Count do---@type CS.FairyEditor.FPackageItemlocal item = items[i - 1]---记录所有UI开头的子项if string.find(item.name,"UI") == 1 thenlocal uiType = string.format("%s = %s_%s,\n\t",item.name,package.name,item.name)_classField = _classField .. uiTypeendendend---输出日志打印fprint(_classField)---替换模板tmp_ui_type = tmp_ui_type:gsub("classField",_classField)---写出模板local f = io.open(file_out_path,"w")f:write(tmp_ui_type)f:close()---输出路径打印fprint(string.format("导出UIType:[url]%s[/url]",file_out_path))
end)
function onDestroy()
-------do cleanup here-------toolMenu:RemoveItem("XiaoExportUIType")
end

 需求2:

需求2:在资源库的右键菜单中添加“复制组件脚本路径”,方便提取当前组件的require路径。并且实现组件筛选,在不满足条件的情况下,“复制组件脚本路径”菜单项置灰不可用。

前提:所有非UI的组件都在当前包的Comps的文件夹下存放。

重新新建一个插件或者在之前的插件中继续编写,这里我是接着之前的插件继续写。

---添加资源库右键菜单
---需求:复制Comps文件夹下的组件所转化的脚本路径
---获取右键菜单
local libcontextMenu = _app.libView.contextMenu
---添加分割线
libcontextMenu:AddSeperator()
libcontextMenu:AddItem("复制组件脚本路径","XiaoCopyAssetPath",function()---获取当前选中的资源---@type CS.FairyEditor.FPackageItemlocal item = _app.libView:GetSelectedResource()---检测资源是否满足条件if item.path:find("/Comps/") == 1 then---准备复制local cp_str = ("require(\"UI.%s.Comps.%s\")"):format(item.owner.name,item.name)---Unity复制操作CS.UnityEngine.GUIUtility.systemCopyBuffer = cp_str---弹窗提示_app.Alert("复制成功")else_app.Alert("复制失败")end
end)
---在弹出的菜单中检测当前选择的资源是否满足条件
libcontextMenu.onPopup:Add(function()---@type CS.FairyEditor.FPackageItemlocal item = _app.libView:GetSelectedResource()local grayed = trueif item.path:find("/Comps/") == 1 then-- bodygrayed = falseendlibcontextMenu:SetItemGrayed("XiaoCopyAssetPath",grayed)
end)

之后不要忘记在onDestroy方法中移除我们的菜单项“XiaoCopyAssetPath”

toolMenu:RemoveItem("XiaoCopyAssetPath")

 

完整插件代码

---@type CS.FairyEditor.App
local _app = CS.FairyEditor.App
local project = _app.project---输出绝对文件路径
local file_out_path =("%s/UIType.lua"):format(project.basePath)---Lua模板
local tmp_ui_type = [[
---@class UIType
return {classField
}
]]---获取工具菜单
---@type CS.FairyEditor.Component.MenuBar
local toolMenu = _app.menu:GetSubMenu("tool")
---添加分隔符
toolMenu:AddSeperator()
---添加菜单,显示名字,内部标签名,回调方法
toolMenu:AddItem("导出UIType","XiaoExportUIType",function()local _classField = ""---获取工程中的所有包,返回值是列表local allPackages = _app.project.allPackagesfor i = 1, allPackages.Count do---C#索引从0开始---@type CS.FairyEditor.FPackagelocal package = allPackages[i - 1]---获取当前包中的所有子项,返回值是列表local items = package.itemsfor i = 1, items.Count do---@type CS.FairyEditor.FPackageItemlocal item = items[i - 1]---记录所有UI开头的子项if string.find(item.name,"UI") == 1 thenlocal uiType = string.format("%s = %s_%s,\n\t",item.name,package.name,item.name)_classField = _classField .. uiTypeendendend---输出日志打印fprint(_classField)---替换模板tmp_ui_type = tmp_ui_type:gsub("classField",_classField)---写出模板local f = io.open(file_out_path,"w")f:write(tmp_ui_type)f:close()---输出路径打印fprint(string.format("导出UIType:[url]%s[/url]",file_out_path))
end)---添加资源库右键菜单
---需求:复制Comps文件夹下的组件所转化的脚本路径
---获取右键菜单
local libcontextMenu = _app.libView.contextMenu
---添加分割线
libcontextMenu:AddSeperator()
libcontextMenu:AddItem("复制组件脚本路径","XiaoCopyAssetPath",function()---获取当前选中的资源---@type CS.FairyEditor.FPackageItemlocal item = _app.libView:GetSelectedResource()---检测资源是否满足条件if item.path:find("/Comps/") == 1 then---准备复制local cp_str = ("require(\"UI.%s.Comps.%s\")"):format(item.owner.name,item.name)---Unity复制操作CS.UnityEngine.GUIUtility.systemCopyBuffer = cp_str---弹窗提示_app.Alert("复制成功")else_app.Alert("复制失败")end
end)---在弹出的菜单中检测当前选择的资源是否满足条件
libcontextMenu.onPopup:Add(function()---@type CS.FairyEditor.FPackageItemlocal item = _app.libView:GetSelectedResource()local grayed = trueif item.path:find("/Comps/") == 1 then-- bodygrayed = falseendlibcontextMenu:SetItemGrayed("XiaoCopyAssetPath",grayed)
end)function onDestroy()
-------do cleanup here-------toolMenu:RemoveItem("XiaoExportUIType")toolMenu:RemoveItem("XiaoCopyAssetPath")
end

菜单的操作目前只用到了这两种,后面在实际操作中如果还有,则会继续更新!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/100051.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试-快速学习计算机网络-UDP/TCP

1. OSI四层和七层映射 区别: 应用层,表示层,会话层合并为了应用层数据链路层和物理层合并为了网络接口层 2. TCP和UDP的区别? 总结: 1 . TCP 向上层提供面向连接的可靠服务 ,UDP 向上层提供无连接不可靠服…

Lnton羚通算法算力云平台在环境配置中Windows10终端和VSCode下如何打开Anaconda-Prompt

在Windows 10的终端和VSCode中,可以直接打开Anaconda Prompt。下面是两种方法: Windows 10终端:在开始菜单中搜索"Anaconda Prompt",然后点击打开。这将启动Anaconda Prompt终端,你可以在其中执行conda相关命…

2337. 移动片段得到字符串

题目描述: 给你两个字符串 start 和 target ,长度均为 n 。每个字符串 仅 由字符 ‘L’、‘R’ 和 ‘_’ 组成,其中: 字符 ‘L’ 和 ‘R’ 表示片段,其中片段 ‘L’ 只有在其左侧直接存在一个 空位 时才能向 左 移动&a…

通过Matlab编程分析微分方程、SS模型、TF模型、ZPK模型的关系

微分方程、SS模型、TF模型、ZPK模型的关系 一、Matlab编程 微分方程、SS模型、TF模型、ZPK模型的关系二、对系统输出进行微分计算三、对系统输出进行积分计算四、总结五、系统的零点与极点的物理意义参考 :[https://www.zhihu.com/question/22031360/answer/3073452…

SpringCloud Gateway服务网关的介绍与使用

目录 1、网关介绍2、SpringCloudGateway工作原理3、三大组件3.1 、Route(路由)3.2、断言 Predicate3.3、过滤器 filter 4、Gateway整合nacos的使用4.1 、引入依赖4.2、 编写基础类和启动类4.3、 编写基础配置和路由规则4.4 、测试结果 1、网关介绍 客户…

ubuntu 20.04 安装 高版本cuda 11.7 和 cudnn最新版

一、安装显卡驱动 参考另一篇文章:Ubuntu20.04安装Nvidia显卡驱动教程_ytusdc的博客-CSDN博客 二、安装CUDA 英伟达官网(最新版):CUDA Toolkit 12.2 Update 1 Downloads | NVIDIA Developer CUDA历史版本下载地址:C…

基于YOLOV8模型的西红柿目标检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要:基于YOLOV8模型的西红柿目标检测系统可用于日常生活中检测与定位西红柿目标,利用深度学习算法可实现图片、视频、摄像头等方式的目标检测,另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测算法训练数…

统一git使用方法,git状态变迁图,git commit提交规范

目录 说明 统一git使用方法 git状态变迁图 git commit 提交规范 说明 多次工作中多名员工不懂git多次技术分享,自行查资料学习git并使用,会出现使用各种偏僻的命令,异常问题无法解决;或出现带url的git合并提交。主要是学的不…

EasyPOI 实战总结

EasyPOI实战总结 简介 easypoi功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员 就可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出,通过简单的注解和模板 语言(熟悉的表达式语法),完成以前复杂的写法 使用EasyPOI 环境搭建 # 1.引入相关依…

2022年06月 C/C++(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题:制作蛋糕 小A擅长制作香蕉蛋糕和巧克力蛋糕。制作一个香蕉蛋糕需要2个单位的香蕉,250个单位的面粉,75个单位的糖,100个单位的黄油。制作一个巧克力蛋糕需要75个单位的可可粉,200个单位的面粉,150个单…

Docker的数据管理及端口映射与容器互联(使用centos镜像)

目录 Docker数据管理 1.数据卷 2.数据卷容器 Docker端口映射 Docker容器互联 Docker数据管理 管理 Docker 容器中数据主要有两种方式:数据卷(Data Volumes)和数据卷容器(DataVolumes Containers&…

蓝凌OA custom.jsp 任意文件读取

​曾子曰:“慎终追远,民德归厚矣。” 漏洞复现 访问漏洞url: 出现漏洞的文件为 custom.jsp,构造payload: /sys/ui/extend/varkind/custom.jsp var{"body":{"file":"file:///etc/passwd&q…

vue2+element-ui+springboot编写一个简单的CRUD和上传页面

1.0先看效果图 2.0主功能页面展示 3.0新增功能 4.0更新功能 5.0接口错误提示 前端码云链接:https://gitee.com/xiaojianr/management/tree/master/ 前端拷贝完成需要使用:npm install 命令完成package.json依赖的下载 后端码云链接:https://gitee.com/xiaojianr/manage

ATF BL1/BL2 ufs_read_blocks/ufs_write_blocks使用分析

ATF BL1/BL2 ufs_read_blocks/ufs_write_blocks使用分析 1 ATF的下载链接2 ATF BL1/BL2 ufs_read_blocks/ufs_write_blocks处理流程2.1 ATF BL1/BL2 ufs_read_blocks2.2 ATF BL1/BL2 ufs_write_blocks 3 UFS System Model4 ufs_read_blocks/ufs_write_blocks详细分析4.1 ufs_re…

Blend for Visual Studio:提升用户界面设计的专业工具

随着软件行业的迅速发展,用户界面设计变得越来越重要。一个好的用户界面能够吸引用户的注意力,提供良好的用户体验,并增加应用程序的成功率。在这个背景下,Blend for Visual Studio作为一款专业的用户界面设计工具,为开…

基于PaddleOCR2.7.0发布WebRest服务测试案例

基于PaddleOCR2.7.0发布WebRest服务测试案例 #WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. #警告:这是一个开发服务器。不要在生产部署中使用它。请改用生产WSGI服务器。 输出结果…

AUTOSAR规范与ECU软件开发(实践篇)5.1 ETAS ISOLAR-A工具简介

前言 如前所述, 开发者可以先在系统级设计工具ISOLAR-A中设计软件组件框架, 包括端口接口、 端口等, 即创建各软件组件arxml描述性文件; 再将这些软件组件描述性文件导入到行为建模工具, 如Matlab/Simulink中完成内部行为建模。 亦可以先在行为建模工具中完成逻辑建模, 再…

Docker私有仓库创建

1.Docker私有仓库搭建 拉取私有仓库镜像并启动私有仓库容器。 访问私有仓库容器,表明私有仓库搭建成功。 此时私有仓库就已经搭建完成了。 2.将本机的镜像传到私有仓库 3.将私有仓库镜像拉取到本地

JVM的元空间了解吗?

笔者近期在面试的时候被问到了这个问题,元空间也是Java8当时的一大重大革新,之前暑期实习求职的时候有专门看过,但是近期秋招的时候JVM相关的内容确实有点生疏了,故在此进行回顾。 结构 首先,我们应了解JVM的堆结构&a…

opencv进阶14-Harris角点检测-cv2.cornerHarris

类似于人的眼睛和大脑,OpenCV可以检测图像的主要特征并将这 些特征提取到所谓的图像描述符中。然后,可以将这些特征作为数据 库,支持基于图像的搜索。此外,我们可以使用关键点将图像拼接起 来,组成更大的图像。&#x…