System Overview

Summary: Complete 3D building system for Unity featuring grid-based placement, snapping mechanics, undo/redo, saving/loading, and multiplayer synchronization.

The 3D Building System provides everything needed for construction games, architectural tools, or any application requiring dynamic 3D object placement.

Grid-Based Placement

Precision placement with configurable grid sizes (0.25m to 2m increments)

Smart Snapping

Automatic alignment to nearby objects, edges, and surfaces

Undo/Redo System

Full history tracking with keyboard shortcuts (Ctrl+Z, Ctrl+Y)

Save/Load

JSON-based serialization for complex building structures

Core Components

BuildingManager
Singleton

Type: MonoBehaviour

Central controller handling all building operations, UI, and system state.

PlaceBuilding() DeleteBuilding() Undo() Redo()
BuildingPiece
ScriptableObject

Type: ScriptableObject

Data container for building pieces (prefab, dimensions, materials, cost).

prefab size materials buildCost
BuildPreview
Component

Type: MonoBehaviour

Visual feedback system for placement preview (green/red validation).

UpdatePosition() SetValid() SetInvalid()
GridSystem
Static Class

Type: Static Class

Mathematical utilities for grid calculations and coordinate transformations.

WorldToGrid() GridToWorld() SnapToGrid()

Placement System

Placement Workflow

1

Selection

User selects building piece from UI palette or hotkeys

2

Preview

Ghost preview follows mouse cursor with collision checking

3

Validation

System checks for collisions, support, and build permissions

4

Placement

On click, instantiate final building piece with materials

public class PlacementController : MonoBehaviour
{
    private BuildPreview currentPreview;
    private BuildingPiece selectedPiece;
    
    void Update()
    {
        if (selectedPiece != null)
        {
            Vector3 mousePosition = GetMouseWorldPosition();
            Vector3 gridPosition = GridSystem.SnapToGrid(mousePosition);
            
            currentPreview.UpdatePosition(gridPosition);
            
            bool isValid = CheckPlacementValid(gridPosition);
            currentPreview.SetValid(isValid);
            
            if (Input.GetMouseButtonDown(0) && isValid)
            {
                PlaceBuilding(gridPosition);
            }
        }
    }
}

Code Examples

Core implementation examples for the building system:

Save System Example

using System.Collections.Generic;
using UnityEngine;

[System.Serializable]
public class BuildingData
{
    public string pieceId;
    public Vector3 position;
    public Quaternion rotation;
    public Dictionary<string, string> customData;
}

public class SaveSystem : MonoBehaviour
{
    public void SaveBuildings(List<Building> buildings)
    {
        List<BuildingData> data = new List<BuildingData>();
        
        foreach (var building in buildings)
        {
            data.Add(new BuildingData
            {
                pieceId = building.PieceId,
                position = building.Transform.position,
                rotation = building.Transform.rotation
            });
        }
        
        string json = JsonUtility.ToJson(data);
        System.IO.File.WriteAllText("savegame.json", json);
        Debug.Log("Game saved!");
    }
}

System Architecture

Building System Architecture

Presentation Layer

  • UI Manager
  • Build Preview
  • Selection Visuals
  • Grid Visualization

Logic Layer

  • Building Manager
  • Placement Controller
  • Snapping System
  • Validation System

Data Layer

  • Building Pieces DB
  • Save/Load System
  • Undo/Redo Stack
  • Multiplayer Sync