当前位置:   article > 正文

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

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名。

  1. local tmp_ui_type = [[
  2. ---@class UIType
  3. return {
  4. classField
  5. }
  6. ]]

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

  1. ---@type CS.FairyEditor.App
  2. local _app = CS.FairyEditor.App
  3. local project = _app.project
  4. ---输出绝对文件路径
  5. local file_out_path =("%s/UIType.lua"):format(project.basePath)
  6. ---Lua模板
  7. local tmp_ui_type = [[
  8. ---@class UIType
  9. return {
  10. classField
  11. }
  12. ]]
  13. ---获取工具菜单
  14. ---@type CS.FairyEditor.Component.MenuBar
  15. local toolMenu = _app.menu:GetSubMenu("tool")
  16. ---添加分隔符
  17. toolMenu:AddSeperator()
  18. ---添加菜单,显示名字,内部标签名,回调方法
  19. toolMenu:AddItem("导出UIType","XiaoExportUIType",function()
  20. local _classField = ""
  21. ---获取工程中的所有包,返回值是列表
  22. local allPackages = _app.project.allPackages
  23. for i = 1, allPackages.Count do
  24. ---C#索引从0开始
  25. ---@type CS.FairyEditor.FPackage
  26. local package = allPackages[i - 1]
  27. ---获取当前包中的所有子项,返回值是列表
  28. local items = package.items
  29. for i = 1, items.Count do
  30. ---@type CS.FairyEditor.FPackageItem
  31. local item = items[i - 1]
  32. ---记录所有UI开头的子项
  33. if string.find(item.name,"UI") == 1 then
  34. local uiType = string.format("%s = %s_%s,\n\t",item.name,package.name,item.name)
  35. _classField = _classField .. uiType
  36. end
  37. end
  38. end
  39. ---输出日志打印
  40. fprint(_classField)
  41. ---替换模板
  42. tmp_ui_type = tmp_ui_type:gsub("classField",_classField)
  43. ---写出模板
  44. local f = io.open(file_out_path,"w")
  45. f:write(tmp_ui_type)
  46. f:close()
  47. ---输出路径打印
  48. fprint(string.format("导出UIType:[url]%s[/url]",file_out_path))
  49. end)
  50. function onDestroy()
  51. -------do cleanup here-------
  52. toolMenu:RemoveItem("XiaoExportUIType")
  53. end
 需求2:

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

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

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

  1. ---添加资源库右键菜单
  2. ---需求:复制Comps文件夹下的组件所转化的脚本路径
  3. ---获取右键菜单
  4. local libcontextMenu = _app.libView.contextMenu
  5. ---添加分割线
  6. libcontextMenu:AddSeperator()
  7. libcontextMenu:AddItem("复制组件脚本路径","XiaoCopyAssetPath",function()
  8. ---获取当前选中的资源
  9. ---@type CS.FairyEditor.FPackageItem
  10. local item = _app.libView:GetSelectedResource()
  11. ---检测资源是否满足条件
  12. if item.path:find("/Comps/") == 1 then
  13. ---准备复制
  14. local cp_str = ("require(\"UI.%s.Comps.%s\")"):format(item.owner.name,item.name)
  15. ---Unity复制操作
  16. CS.UnityEngine.GUIUtility.systemCopyBuffer = cp_str
  17. ---弹窗提示
  18. _app.Alert("复制成功")
  19. else
  20. _app.Alert("复制失败")
  21. end
  22. end)
  1. ---在弹出的菜单中检测当前选择的资源是否满足条件
  2. local function XiaoCopyAssetPathFunc()
  3. ---@type CS.FairyEditor.FPackageItem
  4. local item = _app.libView:GetSelectedResource()
  5. local grayed = true
  6. if item.path:find("/Comps/") == 1 then
  7. -- body
  8. grayed = false
  9. end
  10. libcontextMenu:SetItemGrayed("XiaoCopyAssetPath",grayed)
  11. end
  12. libcontextMenu.onPopup:Add(XiaoCopyAssetPathFunc)

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

  1. ---移除菜单
  2. libcontextMenu:RemoveItem("XiaoCopyAssetPath")
  3. ---移除事件
  4. libcontextMenu.onPopup:Remove(XiaoCopyAssetPathFunc)

完整插件代码

  1. ---@type CS.FairyEditor.App
  2. local _app = CS.FairyEditor.App
  3. local project = _app.project
  4. ---输出绝对文件路径
  5. local file_out_path =("%s/UIType.lua"):format(project.basePath)
  6. ---Lua模板
  7. local tmp_ui_type = [[
  8. ---@class UIType
  9. return {
  10. classField
  11. }
  12. ]]
  13. ---获取工具菜单
  14. ---@type CS.FairyEditor.Component.MenuBar
  15. local toolMenu = _app.menu:GetSubMenu("tool")
  16. ---添加分隔符
  17. toolMenu:AddSeperator()
  18. ---添加菜单,显示名字,内部标签名,回调方法
  19. toolMenu:AddItem("导出UIType","XiaoExportUIType",function()
  20. local _classField = ""
  21. ---获取工程中的所有包,返回值是列表
  22. local allPackages = _app.project.allPackages
  23. for i = 1, allPackages.Count do
  24. ---C#索引从0开始
  25. ---@type CS.FairyEditor.FPackage
  26. local package = allPackages[i - 1]
  27. ---获取当前包中的所有子项,返回值是列表
  28. local items = package.items
  29. for i = 1, items.Count do
  30. ---@type CS.FairyEditor.FPackageItem
  31. local item = items[i - 1]
  32. ---记录所有UI开头的子项
  33. if string.find(item.name,"UI") == 1 then
  34. local uiType = string.format("%s = %s_%s,\n\t",item.name,package.name,item.name)
  35. _classField = _classField .. uiType
  36. end
  37. end
  38. end
  39. ---输出日志打印
  40. fprint(_classField)
  41. ---替换模板
  42. tmp_ui_type = tmp_ui_type:gsub("classField",_classField)
  43. ---写出模板
  44. local f = io.open(file_out_path,"w")
  45. f:write(tmp_ui_type)
  46. f:close()
  47. ---输出路径打印
  48. fprint(string.format("导出UIType:[url]%s[/url]",file_out_path))
  49. end)
  50. ---添加资源库右键菜单
  51. ---需求:复制Comps文件夹下的组件所转化的脚本路径
  52. ---获取右键菜单
  53. local libcontextMenu = _app.libView.contextMenu
  54. ---添加分割线
  55. libcontextMenu:AddSeperator()
  56. libcontextMenu:AddItem("复制组件脚本路径","XiaoCopyAssetPath",function()
  57. ---获取当前选中的资源
  58. ---@type CS.FairyEditor.FPackageItem
  59. local item = _app.libView:GetSelectedResource()
  60. ---检测资源是否满足条件
  61. if item.path:find("/Comps/") == 1 then
  62. ---准备复制
  63. local cp_str = ("require(\"UI.%s.Comps.%s\")"):format(item.owner.name,item.name)
  64. ---Unity复制操作
  65. CS.UnityEngine.GUIUtility.systemCopyBuffer = cp_str
  66. ---弹窗提示
  67. _app.Alert("复制成功")
  68. else
  69. _app.Alert("复制失败")
  70. end
  71. end)
  72. ---在弹出的菜单中检测当前选择的资源是否满足条件
  73. local function XiaoCopyAssetPathFunc()
  74. ---@type CS.FairyEditor.FPackageItem
  75. local item = _app.libView:GetSelectedResource()
  76. local grayed = true
  77. if item.path:find("/Comps/") == 1 then
  78. -- body
  79. grayed = false
  80. end
  81. libcontextMenu:SetItemGrayed("XiaoCopyAssetPath",grayed)
  82. end
  83. libcontextMenu.onPopup:Add(XiaoCopyAssetPathFunc)
  84. function onDestroy()
  85. -------do cleanup here-------
  86. libcontextMenu:RemoveItem("XiaoExportUIType")
  87. ---移除菜单
  88. libcontextMenu:RemoveItem("XiaoCopyAssetPath")
  89. ---移除事件
  90. libcontextMenu.onPopup:Remove(XiaoCopyAssetPathFunc)
  91. end

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/959481
推荐阅读
相关标签
  

闽ICP备14008679号