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.pswp.cn/news/42046.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/42046.shtml
英文地址,請注明出處:http://en.pswp.cn/news/42046.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【嵌入式】MKV31F512VLL12 微控制器 (MCU) 、Cyclone? IV E EP4CE10E22I8LN,FPGA-現場可編程門陣列芯片

1、MKV31F512VLL12 微控制器 (MCU) 是適用于BLDC、PMSM和ACIM電機控制應用的高性能解決方案。這些MCU采用運行頻率為100MHz/120MHz、帶數字信號處理 (DSP) 和浮點單元 (FPU) 的ARM Cortex-M4內核。KV3x MCU配備兩個采樣率高達1.2MS/s的16位ADC、多個控制定時器以及512KB閃存。 …

Codeforces Round 893 (Div. 2) D.Trees and Segments

原題鏈接&#xff1a;Problem - D - Codeforces 題面&#xff1a; 大概意思就是讓你在翻轉01串不超過k次的情況下&#xff0c;使得a*&#xff08;0的最大連續長度&#xff09;&#xff08;1的最大連續長度&#xff09;最大&#xff08;1<a<n&#xff09;。輸出n個數&…

模糊測試面面觀 | 模糊測試工具知多少

自1988年威斯康星大學的Barton Miller首次提出模糊測試這一概念以來&#xff0c;模糊測試領域經歷了持續長久發展。模糊測試作為一種軟件測試方法&#xff0c;旨在通過向程序輸入模糊、隨機、異常的數據&#xff0c;探測和發現潛在的漏洞和錯誤。這種方法備受安全研究人員的青睞…

助推打造全球研發中心城市 | 李彥團隊:研發,帶來了二次文藝復興

2017年&#xff0c;長沙經聯合國教科文組織評選&#xff0c;成為中國首座獲評世界“媒體藝術之都”稱號的城市。6年后&#xff0c;基于時代發展的新要求&#xff0c;長沙再次提出了“打造全球研發中心城市”的目標&#xff0c;并朝著新的方向邁進。 舊有的優勢產業在新的研發浪…

信安通用基礎知識

文章目錄 密碼學經典誤區PGP優良保密協議信安經典其它安全手段XSS與CSRF cross site request forgeryCSRF的利用邏輯CSRF示例CSRF防范檢查Referer字段添加校驗token XSS cross site scripting common weakness enumeration常見密碼api誤用&#xff08;摘自畢設參考文獻&#xf…

“深入探究JVM內部機制:如何實現Java程序的運行環境?“

標題&#xff1a;深入探究JVM內部機制&#xff1a;如何實現Java程序的運行環境&#xff1f; 摘要&#xff1a;本文將深入探究Java虛擬機&#xff08;JVM&#xff09;的內部機制&#xff0c;重點討論JVM如何實現Java程序的運行環境。我們將從JVM的結構、類加載、內存管理、垃圾…

01 Python 網絡爬蟲:爬蟲技術的核心原理

不夸張地說&#xff0c;現在哪怕是初中生&#xff0c;只要花點兒時間、精力稍微按「網絡爬蟲」的開發步驟學習了解一下&#xff0c;也能把它玩得賊溜。 聽起來感覺是很高大上的東西&#xff0c;但實際上并不復雜&#xff0c;也就是使用了某種編程語言按照一定步驟、規則主動通…

用Java實現原神抽卡算法

哈嘍~大家好&#xff0c;好久沒有更新了&#xff0c;也確實遇到了很多事&#xff0c;這篇開始恢復更新&#xff0c;喜歡的話&#xff0c;可以給個的三連&#xff0c;什么&#xff1f;你要白嫖&#xff1f;那可以給個免費的贊麻。 &#x1f947;個人主頁&#xff1a;個人主頁??…

七月 NFT 行業解讀:游戲和音樂 NFT 引領增長,Opepen 掀起熱潮

作者&#xff1a;lesleyfootprint.network 2023 年 7 月&#xff0c;NFT 市場的波動性持續存在&#xff0c;交易量呈下降趨勢。然而&#xff0c;游戲和音樂 NFT 等領域的增長引人注目。參與這些細分領域的獨立用戶數量不斷增加&#xff0c;反映了這些領域的復蘇。 本綜合報告…

lvs負載均衡群集

lvs組成 1、lvs基于內核態的netfilter框架實現的IPVS功能&#xff0c;工作在內核態用戶配置VIP等相關信息并且傳遞到IPVS 就需要用到IPVSadm工具。 2、ipvsadm&#xff1a;IPVSadm是lvs用戶態的配套的工具&#xff0c;可以實現VIP和RS 增刪改查。 IPVSadm就是類似于iptables…

侯捷 八部曲 C++面向對象高級開發(上)+(下)【C++學習筆記】 超詳細 萬字筆記總結 筆記合集

文章目錄 Ⅰ C part1 面向對象編程1 頭文件與類的聲明1.1 c vs cpp關于數據和函數1.2 頭文件與類1.2.1 頭文件1.2.2 class的聲明1.2.3 模板初識 2 構造函數2.1 inline 函數2.2 訪問級別2.3 ctor 構造函數2.3.1 ctor 的寫法2.3.2 ctor/函數 重載2.3.3 ctor 放在 private 區 2.4 …

記vite打包vue項目內存溢出問題解決

出現問題 FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory解決方法一&#xff1a; 1.根據網上的資料是通過全局下載npm包increase-memory-limit&#xff1a; npm install -g increase-memory-limit2.在項目目錄執…

學習Vue:路由參數與查詢參數傳遞

在Vue.js中&#xff0c;路由與導航不僅涉及到頁面之間的切換&#xff0c;還包括了向頁面傳遞參數以及獲取查詢參數的功能。本文將詳細介紹如何在Vue Router中傳遞路由參數和查詢參數&#xff0c;幫助您更好地理解和使用這些功能。 路由參數的傳遞 路由參數是指在URL中的動態片…

K8s內部的網路模式實現理解

overlay 網絡模式 在 Kubernetes 中&#xff0c;overlay 網絡模式被用于實現容器之間的網絡通信。 K8s 使用了一種稱為容器網絡接口&#xff08;Container Network Interface&#xff0c;簡稱CNI&#xff09;的規范&#xff0c;該規范定義了容器如何進行網絡連接。實際上&…

SDP 與Rtcp-fb

1、sdp介紹 SDP&#xff08;Session Description Protocol&#xff09;是一種用于描述多媒體會話的協議&#xff0c;它在會話層起著重要的作用。SDP的主要功能是提供會話的元數據和配置信息&#xff0c;以便參與者能夠協商和建立一致的會話。 以下是SDP在會話層的作用&#x…

生活隨筆,記錄我的日常點點滴滴.

前言 &#x1f618;個人主頁&#xff1a;曲終酣興晚^R的小書屋&#x1f971; &#x1f615;作者介紹&#xff1a;一個莽莽撞撞的&#x1f43b; &#x1f496;專欄介紹&#xff1a;日常生活&往事回憶 &#x1f636;?&#x1f32b;?每日金句&#xff1a;被人暖一下就高熱&…

catboost推理開GPU加速

核心設置 model.predict(feature, task_type‘GPU’) 代碼參考 # 訓練配置 params {"catboost": {"n_estimators": 7000,"learning_rate": 0.03,"eval_metric": "AUC","loss_function": "RMSE",&qu…

【sgDragSize】自定義拖拽修改DIV尺寸組件,適用于窗體大小調整

核心原理就是在四條邊、四個頂點加上透明的div&#xff0c;給不同方向提供按下移動鼠標監聽 &#xff0c;對應計算寬度高度、坐標變化 特性&#xff1a; 支持設置拖拽的最小寬度、最小高度、最大寬度、最大高度可以雙擊某一條邊&#xff0c;最大化對應方向的尺寸&#xff1b;再…

一次Linux中的木馬病毒解決經歷(6379端口---newinit.sh)

病毒入侵解決方案 情景 最近幾天一直CPU100%,也沒有注意看到了以為正常的服務調用,直到騰訊給發了郵件警告說我的服務器正在入侵其他服務器的6379端口,我就是正常的使用不可能去入侵別人的系統的,這是違法的. 排查 既然入侵6379端口,就懷疑是通過我的Redis服務進入的我的系統…

Vue基礎-1.知識導航

知識導航&#xff08;就問全不全&#xff09; 當學習 Vue.js 時&#xff0c;除了基本的 HTML、CSS 和 JavaScript 知識外&#xff0c;還有一些其他的技術和語法需要了解&#xff0c;例如 ES6 和 TypeScript。以下是您可能需要學習的一些基礎知識和對應的學習資源&#xff0c;我…