Skip to content

Write your editor plugin with TypeScript in unreal engine.

License

Notifications You must be signed in to change notification settings

puerts/EasyEditorPlugin

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

15 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

EasyEditorPlugin

EasyEditorPlugin是什么

EasyEditorPlugin是一个UE下快速开发编辑器扩展的插件,其特点:

  • 1、几行代码即可添加主菜单、工具栏按钮、上下文菜单、Detail扩展等等;

  • 2、运行时脚本热刷新;

  • 3、代码即是UI,结合2可实现UI热刷新;[可选]

  • 4、nodejs + npm海量扩展可用

  • 5、脚本可调用任意UE API,可调用几乎所有c++库

效果图

easyeditor

demo工程

EasyEditorPluginDemo

代码示例

添加主菜单

const main_menu = menus.FindMenu("LevelEditor.MainMenu");
const script_menu = main_menu.AddSubMenuScript(main_menu.GetName(), "Puerts", "Puerts", "Puerts", "Puerts Demo...");

const entry = UE.ToolMenuEntry.InitMenuEntry("ShowDemoWindow", "ShowDemoWindow", "just a test...", () => {
    let demo = new DemoWindow();
    cpp.UEImGui.AddGlobalWindow(demo.Render.bind(demo));
})
script_menu.AddMenuEntry("Scripts", entry);

添加工具栏按钮

const toolbar = menus.FindMenu('LevelEditor.LevelEditorToolBar')
const entry = UE.ToolMenuEntry.InitToolBarButton("Widget", "ImGUIWidget", () => {
    cpp.UEImGui.AddGlobalWindow(() => {
        //console.log('toolbar button click')
    });
});
toolbar.AddMenuEntry("ImGUIWidget", entry);

添加工具栏下拉按钮(ComboButton)

const icon = new cpp.FSlateIcon("EditorStyle", "LevelEditor.WorldProperties", "LevelEditor.WorldProperties.Small");
const entry = UE.ToolMenuEntry.InitComboButton("Puerts", undefined, (tool_menu: UE.ToolMenu) => {
    const sub_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);

添加文件夹右键菜单

const folder_context_menu = menus.FindMenu('ContentBrowser.FolderContextMenu');
const entry = UE.ToolMenuEntry.InitMenuEntry("PuertsOpen", "PuertsOpen", "just a test...", (context: UE.ToolMenuContext) => {
    if (context) {
        const context_menu_context =  UE.ToolMenus.FindContext(context, UE.ContentBrowserDataMenuContext_FolderMenu.StaticClass()) as UE.ContentBrowserDataMenuContext_FolderMenu;
        if (context_menu_context) {
            const selected_items = context_menu_context.SelectedItems;
            console.log(`selected_items num:${selected_items.Num()}`);
            for(var i = 0; i < selected_items.Num(); i++) {
                const selecte_item = selected_items.Get(i);
                let path = $ref<string>();
                selecte_item.GetItemPhysicalPath(path);
                console.log(`name:${selecte_item.GetItemName()}, path:${path}, isfolder:${selecte_item.IsFolder()}`);
            }
        } 
    }
});
folder_context_menu.AddMenuEntry("TS", entry);

添加asset右键菜单

const asset_context_menu = menus.FindMenu('ContentBrowser.AssetContextMenu');
const entry = UE.ToolMenuEntry.InitMenuEntry("PuertsAssetOpen", "PuertsAssetOpen", "just a test...", (context: UE.ToolMenuContext) => {
    if (context) {
        const context_menu_context =  UE.ToolMenus.FindContext(context, UE.ContentBrowserAssetContextMenuContext.StaticClass()) as UE.ContentBrowserAssetContextMenuContext;
        console.log(typeof context_menu_context);
        if (context_menu_context) {
            const selected_objects = context_menu_context.SelectedObjects;
            console.log(`selected_objects num:${selected_objects.Num()}`);
            for(var i = 0; i < selected_objects.Num(); i++) {
                const selecte_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(var i = 0; i < args.length; i++) {
        console.log(`arg${i}: ${args[i]}`);
    }
})

ImGui相关

本部分内容需要添加两个插件:UEImguiEasyEditor_ImGui

如果需要接入其它UI能力,或者其它c++库提供的能力,可参考该文档

添加Detail扩展

cpp.UEImGui.AddDetailCustomization(UE.Actor.StaticClass(), (obj:UE.Object) => {
    cpp.UEImGui.BeginDetail();
    cpp.ImGui.Text(`Actor Name:${obj.GetName()}`);
    cpp.UEImGui.EndDetail();
});

ImGUI窗口

ImGui.SetNextWindowSize(new ImVec2(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();

依赖

About

Write your editor plugin with TypeScript in unreal engine.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages