BurbArchitect is a runtime house-building plugin for Unreal Engine 5 inspired by The Sims. It gives your players the ability to draw walls, paint floors, place doors and windows, sculpt terrain, add roofs and stairs, and furnish rooms — all at runtime, with full multiplayer replication out of the box.
Drop the plugin into your project, wire up a few base classes, populate a catalog with your art, and you have a complete architectural build mode ready for your game.
Key features at a glance:
| Requirement | Details |
|---|---|
| Engine | Unreal Engine 5.7 |
| Modules | The plugin depends on: ProceduralMeshComponent, UMG, GameplayTags, Json, JsonUtilities, Landscape, Foliage — all ship with the engine. No third-party dependencies. |
| Project type | C++ or Blueprint (plugin is compiled C++ with full Blueprint exposure) |
Copy (or install via Fab) the BurbArchitect folder into your project's Plugins/ directory:
YourProject/
Plugins/
BurbArchitect/
BurbArchitect.uplugin
Source/
Content/
...
Regenerate project files and compile (or simply restart the editor if using a Blueprint-only project with a pre-compiled binary).
Open Edit → Plugins, search for BurbArchitect, and ensure it is enabled. Restart the editor if prompted.
If you need to reference BurbArchitect classes from your own C++ code, add it to your .Build.cs:
PublicDependencyModuleNames.Add("BurbArchitect");
For Blueprint-only projects this step is not required — all key classes are already exposed to Blueprint.
BurbArchitect ships a set of base classes designed to work together. The fastest way to get running is to create Blueprint children of each and assign them in your Game Mode.
| Base Class | What It Does |
|---|---|
ABurbGameModeBase | Sets the starting gameplay mode (Build or Live) for new players |
ABurbPawn | Camera pawn with spring arm, zoom, rotation, floor-level navigation, cutaway system |
ABurbPlayerController | Cursor tracing, tool spawning, catalog activation, save/load helpers |
ABurbGameStateBase | Game state stub — extend as needed for your game |
Quick start (Blueprint):
BP_BurbGameMode (parent: BurbGameModeBase)BP_BurbPawn (parent: BurbPawn)BP_BurbPlayerController (parent: BurbPlayerController)BP_BurbPawnBP_BurbPlayerControllerBuild (or Live, depending on your game flow)BP_BurbGameMode.Drag an ALotManager actor into your level (search for "LotManager" in the Place Actors panel). This is the central actor that represents a buildable lot.
Configure it in the Details panel:
| Property | Default | Description |
|---|---|---|
| Lot Name | (empty) | Display name for the lot |
| Grid Size X | 20 | Number of tiles along X (range: 8–100) |
| Grid Size Y | 20 | Number of tiles along Y (range: 8–100) |
| Grid Tile Size | 100 | Size of each tile in Unreal units (cm). 100 = 1 meter |
| Floors | 1 | Number of above-ground floors |
| Basements | 0 | Number of basement levels |
| Default Wall Height | 300 | Wall height in cm per floor |
The grid generates automatically on construction. You can also call GenerateGrid() at runtime from Blueprint.
Tip: A 20×20 lot at tile size 100 gives you a 20m × 20m buildable area — a comfortable starter home footprint.
The LotManager is the heart of BurbArchitect. Each lot in your world is one LotManager actor. It owns:
Key Blueprint-callable functions:
| Function | Purpose |
|---|---|
GenerateGrid() | Rebuild the entire grid (data + visuals) |
GenerateGridData() | Rebuild tile data only (no visuals — call at BeginPlay for runtime-only grids) |
GenerateGridMesh() | Rebuild just the visual grid mesh |
LocationToTile(Location, Row, Column) | Convert a world position to grid coordinates |
TileToGridLocation(Level, Row, Column, bCenter, Location) | Convert grid coordinates back to world position |
ToggleGrid(bVisible) | Show/hide the grid for the current level |
SetCurrentLevel(NewLevel) | Change the active floor level |
SaveLotToSlot(SlotName) / LoadLotFromSlot(SlotName) | Slot-based save/load |
ExportLotToFile(FilePath) / ImportLotFromFile(FilePath) | JSON file export/import |
LoadDefaultLot(LotDataAsset) | Load a pre-built lot from a data asset |
ClearLot() | Reset the lot to an empty state |
BuildRoomCache() | Force a room detection recalculation |
GetRoomAtTile(Level, Row, Column) | Query which room a tile belongs to |
The BurbPawn is the player's eyes. It provides:
ToggleCameraMode()MoveUpFloor() / MoveDownFloor() smoothly transitions the camera between storiesCurrentMode) and the OnModeChanged delegateABuildToolImportant Blueprint properties on BurbPawn:
| Property | Category | Description |
|---|---|---|
CurrentMode | Mode | Current gameplay mode (Build or Live) |
CurrentLot | — | Reference to the lot this pawn is building on |
CurrentLevel | — | Active floor level |
CutawayMode | Cutaway | Active wall cutaway mode |
CameraMode | Camera > Mode | Perspective or Isometric |
DefaultToolClass | Build Tools | Default tool spawned when no tool is active (e.g., Selection Tool) |
DeletionToolClass | Build Tools | Tool spawned for deletion mode |
CameraZoomDefault / CameraMinZoom / CameraMaxZoom | Camera > Zoom | Zoom range |
CameraMinPitch / CameraMaxPitch | Camera > Rotation | Pitch clamps |
IsometricCameraPitch | Camera > Isometric | Fixed pitch angle in isometric mode |
Delegates:
OnModeChanged(OldMode, NewMode) — fires when the player switches between Build and Live mode. Bind to this in your UI to show/hide build panels.The player controller handles:
CursorWorldLocation and CursorWorldHitResult to BlueprintHandleCatalogItemActivation(CatalogItem) detects the item type and spawns the correct build toolServerTryCreateBuildTool() and ServerTryCreateBuildToolWithPattern() handle multiplayer tool spawningQuickSave(), QuickLoad(), SaveLotToSlot(), LoadLotFromSlot(), ExportLotToJSON(), ImportLotFromJSON()BroadcastDeleteToSelected() deletes all currently selected objectsMinimal but important. Its main job is setting StartingBurbMode on newly spawned pawns via RestartPlayer(). Set this to Build if players should enter build mode immediately, or Live if they start in gameplay mode and opt into building.
Every lot is built on a 2D tile grid that extends vertically across multiple floor levels. Each tile is a square of GridTileSize units (default 100 cm = 1 meter).
Grid Coordinates:
Row → X axis (0 to GridSizeX-1)
Column → Y axis (0 to GridSizeY-1)
Level → Z axis (negative for basements, 0 for ground, positive for upper floors)
Tiles are stored in a flat TArray<FTileData> on the LotManager, with a spatial hash map (TileIndexMap) for fast O(1) lookups by (Row, Column, Level).
Each FTileData contains:
Floors property on LotManager (number of above-ground stories)Basements property (number of below-ground levels)Rooms are detected automatically when walls form an enclosed area. The system uses flood-fill from the wall graph and supports diagonal walls splitting tiles between rooms. You don't need to manually define rooms — just draw walls and the plugin figures it out.
Call BuildRoomCache() after bulk wall operations, or InvalidateRoom(RoomID) to refresh a specific room. Query room membership with GetRoomAtTile(Level, Row, Column).
BurbArchitect defines two gameplay modes via the EBurbMode enum:
| Mode | Description |
|---|---|
| Build | Full construction mode. The grid is visible, build tools are active, and the player can draw walls, place floors, sculpt terrain, place furniture — the full building experience. |
| Live | Simulation/gameplay mode. The grid and lot boundaries are hidden. Building tools are deactivated. This is where your game's actual gameplay happens (Sim-style living, strategy, etc.). |
Switching modes from Blueprint:
// On BurbPawn:
SetMode(EBurbMode::Build) // Enter build mode
SetMode(EBurbMode::Live) // Enter live mode
ToggleMode() // Flip between the two
The OnModeChanged delegate fires whenever the mode changes — bind your UI to this to show/hide the build toolbar, catalog panel, etc.
When switching to Live mode, the LotManager automatically hides the grid and boundary lines. When switching back to Build, they reappear.
Build tools are the player's instruments for construction. Every tool extends ABuildTool and follows a consistent interaction pattern:
All of these functions are BlueprintNativeEvent — you can override them in Blueprint child classes for custom behavior. They are also fully replicated (server-authoritative with multicast broadcasts).
| Tool | File | What It Does |
|---|---|---|
| BuildWallTool | BuildTools/BuildWallTool.h | Draw walls between tile corners |
| BuildRoomTool | BuildTools/BuildRoomTool.h | Drag-draw a rectangular room (walls + floor in one operation) |
| BuildDiagonalRoomTool | BuildTools/BuildDiagonalRoomTool.h | Room tool supporting diagonal walls |
| BuildFloorTool | BuildTools/BuildFloorTool.h | Paint floor tiles with patterns |
| BuildDoorTool | BuildTools/BuildDoorTool.h | Place doors in walls |
| BuildWindowTool | BuildTools/BuildWindowTool.h | Place windows in walls |
| BuildRoofTool | BuildTools/BuildRoofTool.h | Place and configure roofs |
| BuildStairsTool | BuildTools/BuildStairsTool.h | Place stairs between floor levels |
| BuildFenceTool | BuildTools/BuildFenceTool.h | Place decorative fences |
| BuildHalfWallTool | BuildTools/BuildHalfWallTool.h | Half-height walls |
| BuildBasementTool | BuildTools/BuildBasementTool.h | Excavate basements |
| BuildPoolTool | BuildTools/BuildPoolTool.h | Create pool areas |
| BuildPortalTool | BuildTools/BuildPortalTool.h | Generic portal placement (base for doors/windows) |
| BuildGateTool | BuildTools/BuildGateTool.h | Place gates in fences |
| BuyObjectTool | BuyTools/BuyObjectTool.h | Place furniture and objects |
| BrushRaiseTool | BrushTools/BrushRaiseTool.h | Raise terrain |
| BrushLowerTool | BrushTools/BrushLowerTool.h | Lower terrain |
| BrushFlattenTool | BrushTools/BrushFlattenTool.h | Flatten terrain to a height |
| BrushFlattenLotTool | BrushTools/BrushFlattenLotTool.h | Flatten entire lot |
| BrushSmoothTool | BrushTools/BrushSmoothTool.h | Smooth terrain edges |
Each tool has ValidMaterial and InvalidMaterial properties for placement preview feedback, plus optional sound effects (MoveSound, CreateSound, DeleteSound, FailSound).
Tools are spawned and assigned via the pawn:
// From Blueprint on BurbPawn:
SetCurrentBuildTool(BuildToolReference)
// Or let the system auto-equip via:
EnsureToolEquipped() // Spawns DefaultToolClass if nothing is active
EnsureDeletionToolEquipped() // Spawns DeletionToolClass
The player controller's HandleCatalogItemActivation() is the primary way tools get equipped — it reads the catalog item type and spawns the right tool automatically.
BurbArchitect uses UDataAsset classes to define every item that appears in your build/buy catalog. This makes it easy to add new content without touching code.
UCatalogCategory (Root category — e.g., "Comfort", "Surfaces", "Lighting")
└─ UCatalogSubcategory (Nested sub-category — e.g., "Seating" under "Comfort")
UCatalogItem (Base item — display name, icon, cost, category)
├─ UArchitectureItem (Build tools — walls, rooms, stairs, roofs)
├─ UFurnitureItem (Placeable objects — chairs, tables, lamps)
├─ UFloorPattern (Floor surface materials)
├─ UWallPattern (Wall surface materials)
├─ UDoorItem (Doors with portal size, snapping, meshes)
├─ UWindowItem (Windows with portal size, snapping, meshes)
├─ UFenceItem (Fences with panel/post meshes and spacing)
└─ UGateItem (Gates for fence openings)
CatalogCategory as the classDA_Cat_Comfort)DisplayName, Icon, SortOrder, and optionally DescriptionFor subcategories, create a CatalogSubcategory data asset and set its ParentCategory to the root category you created.
APlaceableObject Blueprint (the actual actor that gets placed in the world)| Property | Description |
|---|---|
PlacementMode | Floor, WallHanging, CeilingFixture, or Surface |
GridSize | Footprint in tiles (e.g., (2, 1, 1) for a couch) |
bMustBeAgainstWall | Requires wall adjacency (beds, toilets) |
bCanPlaceOutdoors | Whether it can be placed outside rooms |
WallMountHeight | Height for wall-hanging items (cm) |
WallOffset | Distance from wall surface (cm) |
CeilingOffset | Distance from ceiling for ceiling fixtures (cm) |
bRequiresFloor | Must have a floor tile underneath |
WallPattern)BaseTexture — diffuse/albedoNormalMap — surface normalsRoughnessMap — roughnessDetailNormal (optional) — extra surface detail with intensity controlBaseMaterial (optional) — material template overridebUseColourSwatches = trueColourSwatches arraybUseColourMask if your RMA texture has an alpha channel mask for recoloringWindowItem)BuildToolClassPortalSize — width × height of the opening in cmPortalOffset — position offset from the wall placement pointHorizontalSnap / VerticalSnap — snap increments when placingbSnapsToFloor — whether the portal anchors to floor levelClassToSpawn to your door/window Blueprint (extends APortalBase)DoorStaticMesh and DoorFrameMeshWindowMeshBuildToolClassFencePanelMesh and FencePostMeshPostSpacing, bPostsAtCorners, bPostsAtEnds, bPostsAtJunctions)FenceHeight and PanelWidth dimensionsWhen the player selects an item from your catalog UI, call:
// On BurbPlayerController:
HandleCatalogItemActivation(CatalogItem)
This function inspects the item's type and automatically:
ABuildTool subclassYour UI just needs to hold references to your catalog data assets and call this one function.
The cutaway system provides Sims-style wall visibility modes. Cycle through them with NextCutawayMode() / PreviousCutawayMode() on the BurbPawn, or set directly with SetCutawayMode().
| Mode | Enum Value | Behavior |
|---|---|---|
| Walls Up | ECutawayMode::WallsUp | All walls and roofs visible |
| Partial Interiors | ECutawayMode::PartialInteriors | Interior walls visible, exterior walls facing camera hidden, roofs hidden |
| Walls Cutaway | ECutawayMode::Partial | All walls facing camera hidden (interior + exterior), roofs hidden |
| Full Cutaway | ECutawayMode::Full | All walls hidden — floor plan view, roofs hidden |
The CutawayFacingThreshold property (range: -1.0 to 1.0) controls how aggressively walls are culled based on camera direction. Higher values hide more walls.
Cutaway updates automatically as the camera rotates, using a sector-based system (45° sectors) to avoid per-frame recalculations.
BurbPawn supports two camera modes:
CameraMinPitch / CameraMaxPitch)IsometricCameraPitch)RotateIsometricLeft() / RotateIsometricRight()OrthoWidthIsometricMinOrthoWidth / IsometricMaxOrthoWidth)Toggle between modes with ToggleCameraMode() or set directly with SetCameraMode(ECameraMode::Isometric).
BurbArchitect provides multiple ways to persist lot data:
// Save:
LotManager->SaveLotToSlot("MyHouse")
// Load:
LotManager->LoadLotFromSlot("MyHouse")
// Or via PlayerController shortcuts:
PlayerController->QuickSave() // saves to "QuickSave" slot
PlayerController->QuickLoad() // loads from "QuickSave" slot
Useful for sharing lots between players or debugging:
LotManager->ExportLotToFile("C:/MyLots/Mansion.json")
LotManager->ImportLotFromFile("C:/MyLots/Mansion.json")
Ship default houses with your game using ULotDataAsset:
LotManager->SaveAsDataAsset("DA_StarterHome", "/Game/DefaultLots/") (Editor only, available in the Details panel)LotManager->LoadDefaultLot(MyLotDataAsset)ULotDataAsset supports metadata — Category, Tags, Price, and Thumbnail — for building lot selection UIs.
| Property | Category | Default | Description |
|---|---|---|---|
GridSizeX / GridSizeY | — | 20 | Lot dimensions in tiles (8–100) |
GridTileSize | — | 100 | Tile size in cm |
DefaultWallHeight | Building | 300 | Wall height per floor (100–500 cm) |
Floors | — | 1 | Above-ground floor count |
Basements | — | 0 | Below-ground level count |
bRemoveTerrainUnderFloors | Building | true | Auto-remove terrain geometry under floor tiles |
bRestoreTerrainOnFloorRemoval | Building | true | Restore terrain when floor tiles are deleted |
bAllowTerrainCeilings | Building | true | Use terrain as basement ceilings (more efficient) |
BasementCeilingOffset | Building | 2.0 | Z-offset below terrain to prevent z-fighting (0–10) |
bEnableTerrainGeneration | Feature Flags | true | Toggle terrain system on/off |
bEnableRoofGeneration | Feature Flags | true | Toggle roof system on/off |
DefaultWallMaterial | — | — | Material applied to new walls |
DefaultFloorMaterial | — | — | Material applied to new floors |
DefaultTerrainMaterial | — | — | Material applied to terrain |
ValidPreviewMaterial | — | — | Green preview material for valid placement |
InvalidPreviewMaterial | — | — | Red preview material for invalid placement |
GridMaterial | — | — | Material for the grid mesh (renders lines procedurally) |
LineColour | — | — | Grid line color |
LineOpacity | — | — | Grid line opacity |
| Property | Category | Default | Description |
|---|---|---|---|
DefaultCameraMode | Camera > Mode | Perspective | Starting camera mode |
CameraRotationSpeed | Camera > Rotation | — | Mouse rotation speed |
CameraDefaultRotation | Camera > Defaults | — | Initial camera rotation |
CameraMaxZoom / CameraMinZoom | Camera > Zoom | — | Zoom range (spring arm length) |
CameraZoomDefault | Camera > Defaults | — | Starting zoom level |
CameraZoomIncrementValue | Camera > Zoom | — | Zoom step per scroll tick |
CameraMinPitch / CameraMaxPitch | Camera > Rotation | — | Pitch angle limits |
IsometricCameraPitch | Camera > Isometric | — | Fixed pitch in iso mode |
IsometricOrthoWidth | Camera > Isometric | — | Starting ortho width |
IsometricMinOrthoWidth / IsometricMaxOrthoWidth | Camera > Isometric | — | Ortho zoom range |
CutawayFacingThreshold | Cutaway | -0.3 | How aggressively walls are hidden (-1.0 to 1.0) |
ZInterpSpeed | Camera > Movement | — | Camera vertical interpolation speed when changing floors |
| Property | Category | Description |
|---|---|---|
ParentNeighbourhood | Neighbourhood | Reference to the ANeighbourhoodManager actor |
NeighbourhoodOffsetRow / NeighbourhoodOffsetColumn | Neighbourhood | Lot position in neighbourhood grid coordinates |
bIsPlacedOnNeighbourhood | Neighbourhood | Read-only — whether the lot is placed on a neighbourhood |
Event BeginPlay
→ Get BurbPawn
→ Bind Event to OnModeChanged
→ [Custom Event: UpdateUI]
→ Branch on NewMode
→ Build: Show Build Panel, Show Catalog
→ Live: Hide Build Panel, Hide Catalog
// In your HUD Blueprint:
Event Tick (or bind to a delegate)
→ Get BurbPawn → CurrentLevel
→ Update Floor Indicator Text ("Floor: {Level}")
Event BeginPlay
→ Get LotManager reference
→ Load Default Lot (DA_StarterHome)
→ Branch on Return Value
→ True: Print "Lot loaded!"
→ False: Print "Failed to load lot"
// On your catalog button widget:
Event On Clicked
→ Get Player Controller (cast to BurbPlayerController)
→ Handle Catalog Item Activation (pass your UCatalogItem data asset reference)
BurbArchitect is built with multiplayer in mind:
LotName, GridSizeX/Y, Floors, Basements, and CurrentLevelCurrentMode, CurrentLot, CurrentLevel, CurrentBuildTool, DisplayName, and CameraModeServerClick, ServerMove, ServerDrag, ServerRelease) with Multicast broadcasts to all clientsServerTryCreateBuildTool, ServerTryCreateBuildToolWithPattern)The general pattern: client initiates → server validates and executes → multicast broadcasts the result. You don't need to set up replication yourself — it's handled by the base classes.
BurbArchitect is developed by Brendan Miller-Young. For support, visit our Discord or GitHub.