System Overview
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
Type: MonoBehaviour
Central controller handling all building operations, UI, and system state.
Type: ScriptableObject
Data container for building pieces (prefab, dimensions, materials, cost).
Type: MonoBehaviour
Visual feedback system for placement preview (green/red validation).
Type: Static Class
Mathematical utilities for grid calculations and coordinate transformations.
Placement System
Placement Workflow
Selection
User selects building piece from UI palette or hotkeys
Preview
Ghost preview follows mouse cursor with collision checking
Validation
System checks for collisions, support, and build permissions
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