找回密码
 立即注册
查看: 566|回复: 0

Unreal编辑器拓展_Gizmo

[复制链接]
发表于 2020-12-24 09:36 | 显示全部楼层 |阅读模式
Unity的编辑器拓展十分方便,只要重写OnDrawGizmos()就能实现编辑器下的可视化,而虚幻并没有对应的功能。不过虚幻编辑器的拓展也是很强大的,只要几步也能写个接口提供Gizmo的绘制。
创建编辑器模式插件。
重写你的FEdMode子类
  1. bool IsCompatibleWith(FEditorModeID OtherModeID) const override
复制代码
返回true。
  1. bool UsesToolkits() const override
复制代码
返回false。
可以删除你的Toolkit类型及清空依赖,不需要模式面板。
声明EdMode的ID
  1. const static FEditorModeID EM_XD_DrawGizmoEdModeId;
  2. const FEditorModeID FXD_DrawGizmoEdMode::EM_XD_DrawGizmoEdModeId = TEXT("EM_XD_DrawGizmoEdMode");
复制代码

进入你的IModuleInterface子类
在StartupModule()的实现后面补上
  1. FEditorModeRegistry::Get().RegisterMode<FXD_DrawGizmoEdMode>(FXD_DrawGizmoEdMode::EM_XD_DrawGizmoEdModeId);       
  2. FCoreDelegates::OnPostEngineInit.AddLambda([]()
  3.         {
  4.                 GLevelEditorModeTools().AddDefaultMode(FXD_DrawGizmoEdMode::EM_XD_DrawGizmoEdModeId);
  5.         });
复制代码
在ShutdownModule()中补上
  1. FCoreDelegates::OnPostEngineInit.RemoveAll(this);
  2. FEditorModeRegistry::Get().UnregisterMode(FXD_DrawGizmoEdMode::EM_XD_DrawGizmoEdModeId);
复制代码

至此准备工作结束,可以进行Gizmo绘制的实现。
新建运行时模块DrawGizmoRuntime(名字随意),创建接口DrawGizmoInterface,并提供以下函数定义。(模块创建方式可以参考https://wiki.unrealengine.com/Creating_an_Editor_Module
  1. virtual void DrawGizmoNative(const FSceneView* View, FViewport* Viewport, FPrimitiveDrawInterface* PDI, bool IsSelected) {}
  2. virtual void DrawHUDNative(FViewport* Viewport, const FSceneView* View, FCanvas* Canvas, bool IsSelected) {}
复制代码

再次进入你的FEdMode子类,重写
  1. void Render(const FSceneView* View, FViewport* Viewport, FPrimitiveDrawInterface* PDI) override
  2. {
  3.         UWorld* World = GetWorld();
  4.         for (TActorIterator<AActor> It(World); It; ++It)
  5.         {
  6.                 AActor* Actor = *It;
  7.                 if (IXD_DrawGizmoInterface* DrawGizmo = Cast<IXD_DrawGizmoInterface>(Actor))
  8.                 {
  9.                         DrawGizmo->DrawGizmoNative(View, Viewport, PDI, Actor->IsSelectedInEditor());
  10.                 }
  11.         }
  12. }
复制代码
  1. void DrawHUD(FEditorViewportClient* ViewportClient, FViewport* Viewport, const FSceneView* View, FCanvas* Canvas) overrid
  2. {
  3.         UWorld* World = GetWorld();
  4.         for (TActorIterator<AActor> It(World); It; ++It)
  5.         {
  6.                 AActor* Actor = *It;
  7.                 if (IXD_DrawGizmoInterface* DrawGizmo = Cast<IXD_DrawGizmoInterface>(Actor))
  8.                 {
  9.                         DrawGizmo->DrawHUDNative(Viewport, View, Canvas, Actor->IsSelectedInEditor());
  10.                 }
  11.         }
  12. }
复制代码

向全场景的Actor广播绘制事件。


如何使用:
继承DrawGizmoInterface,重写提供的DrawGizmoNative与DrawHUDNative。
例子:
  1. {
  2.         DrawDirectionalArrow(PDI, (InteractSingleConfig.InteractLocation * GetActorTransform()).ToMatrixWithScale(), FColor::Red, 50.f, 5.f, SDPG_World, 1.f);
  3. }
复制代码
具体参考PrimitiveDrawingUtils类,有详细的绘制帮助函数。


如何接收点击事件?
参考FSplineComponentVisualizer类吧。


TODO:
    提供蓝图绘制版本。在编辑的红框标识区域添加可见性开关。


Github地址:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-24 14:56 , Processed in 0.088718 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表