El software involucrado en este artículo es: FairyGUI, VSCode
El entorno del código implica: Lua
Complemento VSCode: EmmyLua
Antes de escribir el menú del editor FairyGUI, comprender la API de FairyGUIEditor nos ayudará a resolver muchos problemas de manera efectiva. La extensión de FairyGUI se implementa a través de la función de complemento que viene con el editor, en el complemento utilizo la plantilla de entorno lua. Importe el LuaAPI del editor. El archivo se puede encontrar en el directorio de complementos del código fuente de FairyGUI-Editor. A continuación, las funciones API correspondientes se explicarán a través de funciones.
La ubicación del complemento.
Si no puede encontrar el panel de complementos, puede agregarlo a través de "Ver → Complementos" o "Herramientas → Complementos".
1. Abra el directorio de complementos. El directorio de complementos se encuentra en la carpeta "Directorio de proyecto/complementos". Cada complemento corresponde a una subcarpeta.
2. Crea un nuevo complemento
3. Actualiza la lista de complementos.
El nacimiento de un nuevo complemento
Haga clic para crear un nuevo complemento y podrá seleccionar el tipo de complemento y el formato de idioma que se escribirán en la plantilla del complemento.
Después de hacer clic en Crear, el nuevo complemento recién creado aparecerá en la lista de complementos.
En este momento, haga clic para abrir el directorio de complementos y encontrará que hay una carpeta de complementos recién creada en el directorio de complementos originalmente vacío. Haga clic derecho y use VSCode para abrirla.
Se puede observar que hay dos archivos "main.lua" y "package.json" en el directorio. Entre ellos, main.lua es el script de entrada del complemento y package.json es el archivo de configuración del complemento.
Después de hacer doble clic en main.lua, podrá ver el método "onDestroy" y puede agregar el código de limpieza posterior aquí. Guarde el código escrito y haga clic para actualizar la lista de complementos en el editor para sincronizar el código del complemento más reciente con el editor. Si el editor guarda en este momento, si no es un error de escritura de código, puede actualizar el complemento reiniciando el editor.
API común personal del editor
La aplicación es la clase de entrada del proyecto, escriba: CS.FairyEditor.App. Los campos de funciones en el editor se pueden ver a través de CS_FairyEditor_App en LuaAPI. Los campos y métodos que se utilizarán se enumeran a continuación.
Aplicación CS.FairyEditor. | ||
Nombre del campo | tipo | efecto |
proyecto | CS.FairyEditor.FProyecto | Registre la configuración y los recursos del proyecto actual. |
libVer | CS.FairyEditor.View.LibraryView | Panel de biblioteca del editor |
inspectorVer | CS.FairyEditor.View.InspectorView | Panel de inspección del editor |
consolaVer | CS.FairyEditor.View.ConsoleView | Panel de consola del editor |
menú | CS.FairyEditor.Component.IMenu | Barra de menú del editor |
Plugin Manager | CS.FairyEditor.PluginManager | Gestión de complementos |
CS.FairyEditor.FProyecto | ||
Nombre del campo | tipo | efecto |
nombre | cadena | Nombre del proyecto "como: FGUIProject" |
rutabase | cadena | La ruta del proyecto "como: D:\Documents\FGUIProject" |
activosRuta | cadena | La ruta del proyecto "como: D:\Documents\FGUIProject\assets" |
todos los paquetes | CS.FairyEditor.Fpaquete[] | Todos los paquetes del proyecto. |
todas las ramas | cadena[] | Todas las sucursales del proyecto. |
CS.FairyEditor.Fpaquete | ||
Nombre del campo | tipo | efecto |
nombre | cadena | El nombre del paquete actual. |
elementos | CS.FairyEditor.FPackageItem[] | Recursos bajo el paquete actual |
CS.FairyEditor.FPackageItem | ||
Nombre del campo | tipo | efecto |
camino | cadena | Ruta de recursos |
nombre | cadena | Nombre del recurso |
CS.FairyEditor.View.LibraryView | ||
Nombre del campo | tipo | efecto |
Menú de contexto | CS.FairyEditor.Component.NPopupMenu | Menú contextual de la biblioteca de recursos |
CS.FairyEditor.Component.NPopupMenu | ||
nombre del método | parámetro | efecto |
Añadir artículo | título:cadena, nombre:cadena, seleccioneDevolución de llamada:(diversión():vacío) | Agregue un elemento de menú y configure un evento de devolución de llamada seleccionado |
AgregarSeparador | Agregar divisor de menú | |
SetItemGrayed | nombre de cadena, bool atenuado | No se puede hacer clic en Establecer objetivo |
en ventana emergente | CS.FairyGUI.EventListener | Evento emergente de menú |
Comience a escribir código de complemento
Requisito 1
Requisito 1: agregue el elemento de menú "Exportar todos los nombres de la interfaz de usuario" al menú de herramientas, haga clic y copie el resultado.
Premisa: todas las interfaces de UI tienen las mismas reglas de nomenclatura. Aquí uso UIXXX, por lo que al obtener todas las UI, solo necesita verificar si existe el nombre de la UI del archivo actual. En esta función requerida, debe preparar un código de texto en formato de código Lua y luego reemplazar el campo de clase con el nombre de la interfaz de usuario obtenido.
local tmp_ui_type = [[
---@class UIType
return {
classField
}
]]
Se han agregado anotaciones detalladas al código. Puede ver el código completo directamente:
---@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.allPackages
for i = 1, allPackages.Count do
---C#索引从0开始
---@type CS.FairyEditor.FPackage
local package = allPackages[i - 1]
---获取当前包中的所有子项,返回值是列表
local items = package.items
for i = 1, items.Count do
---@type CS.FairyEditor.FPackageItem
local item = items[i - 1]
---记录所有UI开头的子项
if string.find(item.name,"UI") == 1 then
local uiType = string.format("%s = %s_%s,\n\t",item.name,package.name,item.name)
_classField = _classField .. uiType
end
end
end
---输出日志打印
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
Requisito 2:
Requisito 2: agregue "Copiar ruta de secuencia de comandos del componente" al menú contextual de la biblioteca de recursos para facilitar la extracción de la ruta requerida del componente actual. E implemente el filtrado de componentes. Si no se cumplen las condiciones, el elemento del menú "Copiar ruta de secuencia de comandos del componente" aparecerá atenuado y no estará disponible.
Requisito previo: todos los componentes que no son de interfaz de usuario se almacenan en la carpeta Comps del paquete actual.
Cree un nuevo complemento o continúe escribiendo en el complemento anterior. Aquí continúo escribiendo desde el complemento anterior.
---添加资源库右键菜单
---需求:复制Comps文件夹下的组件所转化的脚本路径
---获取右键菜单
local libcontextMenu = _app.libView.contextMenu
---添加分割线
libcontextMenu:AddSeperator()
libcontextMenu:AddItem("复制组件脚本路径","XiaoCopyAssetPath",function()
---获取当前选中的资源
---@type CS.FairyEditor.FPackageItem
local 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.FPackageItem
local item = _app.libView:GetSelectedResource()
local grayed = true
if item.path:find("/Comps/") == 1 then
-- body
grayed = false
end
libcontextMenu:SetItemGrayed("XiaoCopyAssetPath",grayed)
end)
No olvides eliminar nuestro elemento de menú "XiaoCopyAssetPath" en el método onDestroy después.
toolMenu:RemoveItem("XiaoCopyAssetPath")
Código de complemento completo
---@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.allPackages
for i = 1, allPackages.Count do
---C#索引从0开始
---@type CS.FairyEditor.FPackage
local package = allPackages[i - 1]
---获取当前包中的所有子项,返回值是列表
local items = package.items
for i = 1, items.Count do
---@type CS.FairyEditor.FPackageItem
local item = items[i - 1]
---记录所有UI开头的子项
if string.find(item.name,"UI") == 1 then
local uiType = string.format("%s = %s_%s,\n\t",item.name,package.name,item.name)
_classField = _classField .. uiType
end
end
end
---输出日志打印
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.FPackageItem
local 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.FPackageItem
local item = _app.libView:GetSelectedResource()
local grayed = true
if item.path:find("/Comps/") == 1 then
-- body
grayed = false
end
libcontextMenu:SetItemGrayed("XiaoCopyAssetPath",grayed)
end)
function onDestroy()
-------do cleanup here-------
toolMenu:RemoveItem("XiaoExportUIType")
toolMenu:RemoveItem("XiaoCopyAssetPath")
end
Actualmente, solo se utilizan estos dos tipos de operaciones de menú. Si hay más operaciones reales en el futuro, ¡continuaremos actualizándolas!