Creating Editor Visualization for Move Component in Unreal Engine 5 C++

Jul 13, 2024

Creating Editor Visualization for Move Component in Unreal Engine 5 C++

Previous Video Recap

  • Topics Covered: Move component, actors, and components
  • Move Component: Moved an object around the scene with an FVector move offset (3D vector) and a speed parameter to control movement.
  • Drawbacks: No visualization of where the object was moving, making it frustrating to set up correctly.

Today's Objective

  • Goal: Add editor visualization for the move component using Unreal Engine's editor modules and interfaces.
  • Steps: Understanding Unreal Engine core concepts and modules, followed by creating and registering the editor module.

Core Concepts of Unreal Engine

  • Modules: Containers with headers and source code serving specific purposes (engine, editor, game, plugins).
  • Example (Visual Studio structure):
    • Runtime directory (contains modules like D3D12RHI for DirectX 12).
    • Source directory (contains the project-specific modules like newCPPTutorial).

Creating an Editor Module

Step 1: Modify Project File

  • Project File: Add a new module entry in the .uproject file.
    {
        "Name": "newCPPTutorialEditor",
        "Type": "Editor",
        "LoadingPhase": "PostEngineInit"
    }
    
  • Reason: Separate game code from editor-specific code for clear distinction and shipping purposes.

Step 2: Modify Target File

  • Target File: Add the new module in newCPPTutorialEditor.Target.cs.
    ExtraModuleNames.AddRange(new string[] { "newCPPTutorial", "newCPPTutorialEditor" });
    
  • Create Module Folder: In Source directory, add newCPPTutorialEditor folder and create necessary files (.Build.cs, source files).

Step 3: Implementing Editor Module

Editor Module Header (.h file)

  • Create File: newCPPTutorialEditor.h
    class FNewCPPTutorialEditorModule : public IModuleInterface
    {
        public:
            virtual void StartupModule() override;
            virtual void ShutdownModule() override;
    };
    

Editor Module Source (.cpp file)

  • Create File: newCPPTutorialEditor.cpp
    #include "newCPPTutorialEditor.h"
    IMPLEMENT_MODULE(FNewCPPTutorialEditorModule, newCPPTutorialEditor)
    
  • Build File: Add dependencies.
    PublicDependencyModuleNames.AddRange(new string[] { "newCPPTutorial", "UnrealEd" });
    

Step 4: Register Component Visualizer

  • Create Visualizer Files: newCPPTutorialEditor/MoveComponentVisualizer.h and .cpp
    class FMoveComponentVisualizer : public FComponentVisualizer {
        // Define methods here
    }
    
  • Register Visualizer in StartupModule
    void FNewCPPTutorialEditorModule::StartupModule() {
        if (GUnrealEd) {
            TSharedPtr<FMoveComponentVisualizer> Visualizer = MakeShareable(new FMoveComponentVisualizer);
            GUnrealEd->RegisterComponentVisualizer(UMoveComponent::StaticClass()->GetFName(), Visualizer);
            Visualizer->OnRegister();
        }
    }
    
  • Unregister in ShutdownModule
    void FNewCPPTutorialEditorModule::ShutdownModule() {
        if (GUnrealEd) {
            GUnrealEd->UnregisterComponentVisualizer(UMoveComponent::StaticClass()->GetFName());
        }
    }
    

Implementing Draw Visualization Function

  • Header File: MoveComponentVisualizer.h
    virtual void DrawVisualization(const UActorComponent* Component, const FSceneView* View, FPrimitiveDrawInterface* PDI) override;
    
  • Source File: MoveComponentVisualizer.cpp
    void FMoveComponentVisualizer::DrawVisualization(const UActorComponent* Component, const FSceneView*, FPrimitiveDrawInterface* PDI) {
        // Implement draw logic
    }
    
  • Draw Line Example:
    PDI->DrawLine(StartVector, EndVector, FLinearColor::Red, SDPG_World);
    

Final Steps

  • Build and Test: Ensure Unreal Engine compiles successfully and the editor visualizations appear as intended.
  • Debugging: Use the Module panel in Unreal Engine to check if modules load correctly.

Conclusion

  • Outcome: Successfully added in-editor visualization for Move Component.
  • Next Steps: Improve move functionality, allowing interactions with Blueprints, dynamic pausing, and resetting movements.

Stay tuned for more tutorials!