PlacementSystemComponent
The PlacementSystemComponent is the core orchestrator of the Grid Placement System plugin. It provides a comprehensive grid-based object placement system with precision controls, multiple surface types, audio feedback, and intuitive interaction methods.
Overview
This component should be added to your Player Pawn to enable grid-based placement functionality. It manages camera controls, input handling, object validation, surface detection, visual feedback, and audio cues during placement mode.
Quick Setup
Add the PlacementSystemComponent to your Player Pawn - all assets and input mappings are auto-loaded from the plugin content.
Configuration Categories
Core Settings
Controls fundamental behavior of the placement system.

| Property | Type | Default | Description |
|---|---|---|---|
| Auto Exit After Placement | Boolean | false | Automatically exit placement mode after placing an object |
| Auto Create Grids | Boolean | true | Automatically detect and create grids on tagged surfaces when entering placement mode |
| Default Object To Place | Actor Class | None | Object class to select automatically when entering placement mode |
Audio

Configure audio feedback for placement actions.
| Property | Type | Default | Description |
|---|---|---|---|
| Sounds Enabled | Boolean | true | Enable/disable all placement audio feedback |
| Master Sound Volume | Float | 1.0 | Global volume multiplier for all placement sounds |
| Snap Sound | Sound Base | Auto-loaded | Sound played when objects snap to grid |
| Place Sound | Sound Base | Auto-loaded | Sound played when objects are placed |
| Rotate Sound | Sound Base | Auto-loaded | Sound played when objects are rotated |
Grid Settings

Configure the visual grid system and surface detection.
| Property | Type | Default | Description |
|---|---|---|---|
| Placement Type Tags | Map | Floor: "Floor" Wall: "Wall" Roof: "Roof" | Tags used to identify different surface types in your level |
| Grid Size | Float | 25.0 | Size of each grid cell in Unreal units (25 = 25cm) |
| Grid Color | Linear Color | White | Primary color of the grid lines |
| Sub Grid Color | Linear Color | White | Color of sub-division grid lines |
| Grid Pattern | Texture2D | None | Optional texture pattern for the grid overlay |
Materials

Visual materials used by the placement system (auto-loaded from plugin content).
| Property | Type | Default | Description |
|---|---|---|---|
| Grid Material | Material Interface | Auto-loaded | Material applied to surfaces to show the grid |
| Selected Outline Material | Material Interface | Auto-loaded | Outline material for selected/preview objects |
| Overlay Material | Material Interface | Auto-loaded | Material for the placement indicator overlay |
Object Editing

Settings for editing already-placed objects.
| Property | Type | Default | Description |
|---|---|---|---|
| Allow Object Selection | Boolean | true | Enable clicking on placed objects to select them for editing |
| Allow Object Deletion | Boolean | true | Allow deleting selected objects with the delete key |
Controls

Camera and movement configuration.
| Property | Type | Default | Description |
|---|---|---|---|
| Camera Movement Speed | Float | 800.0 | Speed of camera movement during placement |
| Zoom Speed | Float | 100.0 | Speed of camera zoom in/out |
| Min Zoom Distance | Float | 200.0 | Minimum camera distance from target |
| Max Zoom Distance | Float | 1700.0 | Maximum camera distance from target |
| Object Rotation Increment | Float | 45.0 | Degrees to rotate objects per input (45° = 8 directions) |
Precision Placement

Fine-tuned placement controls.
| Property | Type | Default | Description |
|---|---|---|---|
| Allow Precision Placement | Boolean | true | Enable precision mode when holding Shift |
| Show Precision Mode Indicator | Boolean | false | Hide/Unhide Overlay when in Precision Mode |
Visuals

Visual feedback and indicators.
| Property | Type | Default | Description |
|---|---|---|---|
| Show Placement Overlay | Boolean | true | Show the placement indicator overlay |
| Valid Placement Color | Linear Color | Green | Color when placement location is valid |
| Invalid Placement Color | Linear Color | Red | Color when placement location is blocked |
| Precision Mode Color | Linear Color | White | Color when in precision placement mode |
Camera Settings

Camera behavior during placement mode (supports both Third-Person and First-Person setups).
| Property | Type | Default | Description |
|---|---|---|---|
| Disable Collision In Placement Mode | Boolean | true | Disable camera collision while placing objects |
| Enable Camera Pitch Constraint | Boolean | true | Limit camera pitch to prevent flipping |
| Min Camera Pitch | Float | -60.0 | Minimum camera pitch angle (degrees) |
| Max Camera Pitch | Float | 0.0 | Maximum camera pitch angle (degrees) |
| Vertical Min Offset Z | Float | 0.0 | Minimum vertical camera offset |
| Vertical Max Offset Z | Float | 200.0 | Maximum vertical camera offset |
Input Settings

Input mapping contexts and actions (auto-loaded from plugin content).
| Property | Type | Description |
|---|---|---|
| Placement Mapping Context | Input Mapping Context | Context active during placement mode |
| Toggle Mapping Context | Input Mapping Context | Context for toggling placement mode |
| IA_Placement Toggle | Input Action | Toggle placement mode on/off |
| IA_Placement Confirm | Input Action | Confirm object placement |
| IA_Placement Cancel | Input Action | Cancel placement or exit mode |
| IA_Placement Rotate | Input Action | Rotate preview object |
| IA_Placement Zoom | Input Action | Zoom camera in/out |
| IA_Placement Move | Input Action | Move camera |
| IA_Placement Shift | Input Action | Hold for precision mode |
| IA_Select Object | Input Action | Select placed objects for editing |
| IA_Delete Object | Input Action | Delete selected objects |
| IA_Placement Vertical | Input Action | Move camera vertically |
Debug Settings

Development and debugging tools.
| Property | Type | Default | Description |
|---|---|---|---|
| Show Debug Info | Boolean | false | Display debug information on screen |
Blueprint API
Core Functions
Note: You don't need to use this API unless necessary
PlacementHelper already handles system initialization internally.
Initialize()
UFUNCTION(BlueprintCallable, Category = "GPS: Placement System")
void Initialize();Initializes the placement system. Call this in your Pawn's BeginPlay event.
StoreInitialCameraState()
UFUNCTION(BlueprintCallable, Category = "GPS: Placement System")
void StoreInitialCameraState();Stores the initial camera state to restore later when exiting placement mode.
EnterPlacementMode()
UFUNCTION(BlueprintCallable, Category = "GPS: Placement System")
bool EnterPlacementMode();Enters placement mode. Returns true if successful.
ExitPlacementMode()
UFUNCTION(BlueprintCallable, Category = "GPS: Placement System")
void ExitPlacementMode();Exits placement mode and returns to normal game mode.
SelectObjectToPlace(ObjectClass)
UFUNCTION(BlueprintCallable, Category = "GPS: Placement System")
bool SelectObjectToPlace(TSubclassOf<AActor> ObjectClass);Selects an object class for placement. Must be in placement mode first.
ClearSelectedObject()
UFUNCTION(BlueprintCallable, Category = "GPS: Placement System")
void ClearSelectedObject();Clears the currently selected object for placement.
RefreshGrids()
UFUNCTION(BlueprintCallable, Category = "GPS: Placement System")
void RefreshGrids();Refreshes the grid system, useful when surfaces are added/removed at runtime.
Object Editing
SelectPlacedObjectForEditing(Actor)
UFUNCTION(BlueprintCallable, Category = "GPS: Object Editing")
void SelectPlacedObjectForEditing(AActor* Actor);Selects a placed object for editing (moving, rotating, deleting).
DeleteSelectedPlacedObject()
UFUNCTION(BlueprintCallable, Category = "GPS: Object Editing")
void DeleteSelectedPlacedObject();Deletes the currently selected placed object.
State Getters
GetCurrentMode()
UFUNCTION(BlueprintCallable, BlueprintPure, Category = "GPS: Placement System")
EPlacementMode GetCurrentMode() const;Returns the current mode: Normal or Placement.
HasSelectedObject()
UFUNCTION(BlueprintCallable, BlueprintPure, Category = "GPS: Placement System")
bool HasSelectedObject() const;Returns true if an object is selected for placement.
GetCurrentPlacementValidity()
UFUNCTION(BlueprintCallable, BlueprintPure, Category = "GPS: Placement System")
EPlacementValidity GetCurrentPlacementValidity() const;Returns the current placement validity: Valid, Invalid, or Unknown.
IsInPrecisionMode()
UFUNCTION(BlueprintCallable, BlueprintPure, Category = "GPS: Precision Placement")
bool IsInPrecisionMode() const;Returns true if precision placement mode is active (Shift held + precision enabled).
Events
Core Placement Events
OnPlacementModeChanged
UPROPERTY(BlueprintAssignable, Category = "GPS: Events")
FOnPlacementModeChanged OnPlacementModeChanged;Fired when entering or exiting placement mode.
Parameters: NewMode (EPlacementMode)
OnObjectPlaced
UPROPERTY(BlueprintAssignable, Category = "GPS: Events")
FOnObjectPlaced OnObjectPlaced;Fired when a new object is successfully placed.
Parameters: PlacedObject (AActor*), WorldLocation (FVector)
OnPlacementValidityChanged
UPROPERTY(BlueprintAssignable, Category = "GPS: Events")
FOnPlacementValidityChanged OnPlacementValidityChanged;Fired when placement validity changes (valid/invalid/unknown).
Parameters: NewValidity (EPlacementValidity)
OnNeedObjectSelection
UPROPERTY(BlueprintAssignable, Category = "GPS: Events")
FOnNeedObjectSelection OnNeedObjectSelection;Fired when the system needs an object to be selected for placement.
Object Management Events
OnPlacedObjectSelected
UPROPERTY(BlueprintAssignable, Category = "GPS: Events")
FOnPlacedObjectSelected OnPlacedObjectSelected;Fired when a placed object is selected for editing.
Parameters: SelectedObject (AActor*)
OnPlacedObjectDeselected
UPROPERTY(BlueprintAssignable, Category = "GPS: Events")
FOnPlacedObjectDeselected OnPlacedObjectDeselected;Fired when a placed object is deselected.
Parameters: DeselectedObject (AActor*)
OnPlacedObjectMoved
UPROPERTY(BlueprintAssignable, Category = "GPS: Events")
FOnPlacedObjectMoved OnPlacedObjectMoved;Fired when a placed object is moved to a new location.
Parameters: MovedObject (AActor*), NewLocation (FVector)
OnPlacedObjectDeleted
UPROPERTY(BlueprintAssignable, Category = "GPS: Events")
FOnPlacedObjectDeleted OnPlacedObjectDeleted;Fired when a placed object is deleted.
Parameters: DeletedObject (AActor*)
Tracking and Preview Events
OnObjectClassSelectedForPlacement
UPROPERTY(BlueprintAssignable, Category = "GPS: Events")
FOnObjectClassSelectedForPlacement OnObjectClassSelectedForPlacement;Fired when an object class is selected for placement.
Parameters: ObjectClass (TSubclassOf<AActor>), PlacementType (EPlacementType)
OnObjectPreviewStarted
UPROPERTY(BlueprintAssignable, Category = "GPS: Events")
FOnObjectPreviewStarted OnObjectPreviewStarted;Fired when object preview begins (either for new placement or editing).
Parameters: PreviewActor (AActor*), ObjectClass (TSubclassOf<AActor>), bIsEditing (bool)
OnObjectPreviewEnded
UPROPERTY(BlueprintAssignable, Category = "GPS: Events")
FOnObjectPreviewEnded OnObjectPreviewEnded;Fired when object preview ends.
Parameters: PreviewActor (AActor*)
OnObjectPreviewMoved
UPROPERTY(BlueprintAssignable, Category = "GPS: Events")
FOnObjectPreviewMoved OnObjectPreviewMoved;Fired when the preview object is moved.
Parameters: PreviewActor (AActor*), NewLocation (FVector), NewRotation (FRotator)
OnObjectRotated
UPROPERTY(BlueprintAssignable, Category = "GPS: Events")
FOnObjectRotated OnObjectRotated;Fired when an object is rotated during placement.
Parameters: PreviewActor (AActor*), OldRotation (float), NewRotation (float)
State Change Events
OnPlacementTypeChanged
UPROPERTY(BlueprintAssignable, Category = "GPS: Events")
FOnPlacementTypeChanged OnPlacementTypeChanged;Fired when switching between Floor/Wall/Roof placement.
Parameters: OldType (EPlacementType), NewType (EPlacementType)
OnPrecisionModeChanged
UPROPERTY(BlueprintAssignable, Category = "GPS: Events")
FOnPrecisionModeChanged OnPrecisionModeChanged;Fired when entering or exiting precision mode.
Parameters: bPrecisionModeActive (bool)
OnValidationChangedWithContext
UPROPERTY(BlueprintAssignable, Category = "GPS: Events")
FOnValidationChangedWithContext OnValidationChangedWithContext;Enhanced validation event with additional context.
Parameters: PreviewActor (AActor*), NewValidity (EPlacementValidity), PlacementType (EPlacementType), bPrecisionMode (bool)
OnInputModeChanged
UPROPERTY(BlueprintAssignable, Category = "GPS: Events")
FOnInputModeChanged OnInputModeChanged;Fired when input mode state changes.
Parameters: bPlacementInputActive (bool), bToggleInputActive (bool)
Surface Setup
To use the placement system, you need to tag your level geometry:
- Floor Surfaces: Add the tag
Floorto static mesh actors that should accept floor-placed objects - Wall Surfaces: Add the tag
Wallto vertical static mesh actors for wall-mounted objects - Roof Surfaces: Add the tag
Roofto ceiling/overhead static mesh actors
The system will automatically detect these tagged surfaces and show appropriate grids based on the selected object's placement type.
Default Input Controls
Camera Controls
| Input | Action |
|---|---|
| WASD | Camera Movement |
| Mouse Scroll | Zoom In/Out |
| E/Q | Up/Down Movement |
Object Placement
| Input | Action |
|---|---|
| Left Click | Place Object |
| Right Click | Rotate Object |
| X/ESC | Cancel Placing/Editing Object |
| Delete | Delete Object While Selected |
| Middle Mouse | Select Object for Editing |
Special Modes
| Input | Action |
|---|---|
| Hold Shift | Precision Mode (bypasses grid snapping) |
| Tab | Toggle Enter/Exit Placement Mode |
Camera System Features
Automatic Camera Setup Detection
- Third-Person Projects: Uses existing SpringArm component
- First-Person Projects: Automatically creates temporary SpringArm for placement mode
- Seamlessly restores original camera setup when exiting placement mode
Camera Constraints
- Configurable pitch limits to prevent camera flipping
- Collision detection can be disabled during placement
- Vertical movement constraints with customizable limits
Performance Considerations
- Grid Management: Grids are only shown for the current placement type
- Collision Optimization: Uses oriented bounding box collision for accurate placement validation
- Audio Throttling: Snap sounds have cooldown to prevent audio spam
- Component Architecture: Modular design with dedicated managers for different systems
Audio Feedback System
The system provides audio feedback for key actions:
- Snap Sound: Plays when objects snap to grid positions (with cooldown)
- Place Sound: Plays when objects are successfully placed
- Rotate Sound: Plays when objects are rotated
All sounds respect the master volume setting and can be globally disabled.
Troubleshooting
Objects won't place
- Ensure surfaces are tagged correctly (
Floor,Wall,Roof) - Check that placement location isn't occupied by other objects
- Verify the object implements
IPlaceableObjectInterface - Enable debug info to see collision detection visualization
Camera behaves strangely
- The system automatically detects and handles both TPP and FPP setups
- For FPP projects, a temporary SpringArm is created during placement mode
- Check camera pitch constraints if movement feels limited
- Verify SpringArm component exists for TPP projects
Grid not showing
- Verify
Auto Create Gridsis enabled - Ensure grid material is assigned (should auto-load from plugin)
- Check that surfaces have the correct tags
- Call
RefreshGrids()if surfaces were added at runtime - Check that the placement type matches the surface tags
Audio not playing
- Verify
Sounds Enabledis true - Check
Master Sound Volumeis greater than 0 - Ensure audio assets are properly loaded (should auto-load from plugin)
- Check that your project's audio settings allow 2D/3D sounds
Performance issues
- Disable
Show Debug Infoin shipping builds - Consider reducing grid density for large surfaces
- Limit the number of concurrent preview actors
- Use LODs for complex placeable objects