Complemento de extensión de menú personalizado del editor FairyGUI

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!

Supongo que te gusta

Origin blog.csdn.net/u012433546/article/details/132367236
Recomendado
Clasificación