EasyEditorPlugin是一个UE下快速开发编辑器扩展的插件,其特点:
1、几行代码即可添加主菜单、工具栏按钮、上下文菜单、Detail扩展等等;
2、运行时脚本热刷新;
3、代码即是UI,结合2可实现UI热刷新;[可选]
4、nodejs + npm海量扩展可用
5、脚本可调用任意UE API,可调用几乎所有c++库
constmain_menu=menus.FindMenu("LevelEditor.MainMenu");constscript_menu=main_menu.AddSubMenuScript(main_menu.GetName(),"Puerts","Puerts","Puerts","Puerts Demo...");constentry=UE.ToolMenuEntry.InitMenuEntry("ShowDemoWindow","ShowDemoWindow","just a test...",()=>{letdemo=newDemoWindow();cpp.UEImGui.AddGlobalWindow(demo.Render.bind(demo));})script_menu.AddMenuEntry("Scripts",entry);consttoolbar=menus.FindMenu('LevelEditor.LevelEditorToolBar')constentry=UE.ToolMenuEntry.InitToolBarButton("Widget","ImGUIWidget",()=>{cpp.UEImGui.AddGlobalWindow(()=>{//console.log('toolbar button click')});});toolbar.AddMenuEntry("ImGUIWidget",entry);consticon=newcpp.FSlateIcon("EditorStyle","LevelEditor.WorldProperties","LevelEditor.WorldProperties.Small");constentry=UE.ToolMenuEntry.InitComboButton("Puerts",undefined,(tool_menu: UE.ToolMenu)=>{constsub_entry=UE.ToolMenuEntry.InitMenuEntry("ShowDemoWindow","ShowDemoWindow","just a test...",()=>{//console.log('toolbar combo button click')});tool_menu.AddMenuEntry("ShowDemo",sub_entry);},"Puerts","Puerts",icon);toolbar.AddMenuEntry("ComboButton",entry);constfolder_context_menu=menus.FindMenu('ContentBrowser.FolderContextMenu');constentry=UE.ToolMenuEntry.InitMenuEntry("PuertsOpen","PuertsOpen","just a test...",(context: UE.ToolMenuContext)=>{if(context){constcontext_menu_context=UE.ToolMenus.FindContext(context,UE.ContentBrowserDataMenuContext_FolderMenu.StaticClass())asUE.ContentBrowserDataMenuContext_FolderMenu;if(context_menu_context){constselected_items=context_menu_context.SelectedItems;console.log(`selected_items num:${selected_items.Num()}`);for(vari=0;i<selected_items.Num();i++){constselecte_item=selected_items.Get(i);letpath=$ref<string>();selecte_item.GetItemPhysicalPath(path);console.log(`name:${selecte_item.GetItemName()}, path:${path}, isfolder:${selecte_item.IsFolder()}`);}}}});folder_context_menu.AddMenuEntry("TS",entry);constasset_context_menu=menus.FindMenu('ContentBrowser.AssetContextMenu');constentry=UE.ToolMenuEntry.InitMenuEntry("PuertsAssetOpen","PuertsAssetOpen","just a test...",(context: UE.ToolMenuContext)=>{if(context){constcontext_menu_context=UE.ToolMenus.FindContext(context,UE.ContentBrowserAssetContextMenuContext.StaticClass())asUE.ContentBrowserAssetContextMenuContext;console.log(typeofcontext_menu_context);if(context_menu_context){constselected_objects=context_menu_context.SelectedObjects;console.log(`selected_objects num:${selected_objects.Num()}`);for(vari=0;i<selected_objects.Num();i++){constselecte_objects=selected_objects.Get(i);console.log(typeof(selecte_objects),selecte_objects.GetClass().GetName());}}}});asset_context_menu.AddMenuEntry("TS",entry);cpp.EasyEditorPlugin.AddConsoleCommand("Puerts.TestCmd","just a test...",(...args:string[])=>{for(vari=0;i<args.length;i++){console.log(`arg${i}: ${args[i]}`);}})本部分内容需要添加两个插件:UEImgui、EasyEditor_ImGui
如果需要接入其它UI能力,或者其它c++库提供的能力,可参考该文档
cpp.UEImGui.AddDetailCustomization(UE.Actor.StaticClass(),(obj:UE.Object)=>{cpp.UEImGui.BeginDetail();cpp.ImGui.Text(`Actor Name:${obj.GetName()}`);cpp.UEImGui.EndDetail();});ImGui.SetNextWindowSize(newImVec2(200,100),1<<2)ImGui.Begin(this.simple_window_titil,isOpened);ImGui.Text("Hello, world!");ImGui.Text(`Application average ${(1000/ImGui.GetIO().Framerate).toFixed(3)} ms/frame (${ImGui.GetIO().Framerate.toFixed(1)} FPS)`);ImGui.End();