专业网站建设网页推广,手机app开发定制公司,推广产品引流的最佳方法,可以建网站的公司本文涉及到的软件有#xff1a;FairyGUI#xff0c;VSCode
代码环境涉及到了#xff1a;Lua
VSCode插件#xff1a;EmmyLua
在编写FairyGUI编辑器菜单前#xff0c;了解一下FairyGUIEditor的API会有效的帮助我们解决很多问题。FairyGUI的扩展是通过编辑器自带的插件功能…本文涉及到的软件有FairyGUIVSCode
代码环境涉及到了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
菜单的操作目前只用到了这两种后面在实际操作中如果还有则会继续更新