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
Floor
to static mesh actors that should accept floor-placed objects - Wall Surfaces: Add the tag
Wall
to vertical static mesh actors for wall-mounted objects - Roof Surfaces: Add the tag
Roof
to 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 Grids
is 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 Enabled
is true - Check
Master Sound Volume
is 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 Info
in shipping builds - Consider reducing grid density for large surfaces
- Limit the number of concurrent preview actors
- Use LODs for complex placeable objects