Board Layout and Sizing
Expert knowledge of Board display layout, coordinate systems, SVG import settings, and sprite sizing for the 1920×1080 Board hardware.
Display Configuration
Target Display
| Metric | Pixels | World Units (100 PPU) | | ------ | ------ | --------------------- | | Width | 1920 | 19.2 | | Height | 1080 | 10.8 |
Camera Settings
| Setting | Value | | ----------------- | ----------- | | Orthographic Size | 5.4 | | Position | (0, 0, -10) | | Aspect Ratio | 16:9 |
Calculation: Visible Height = orthoSize × 2 = 10.8 world units
Horizontal Layout (19.2 world units)
| Blue UI | Blue Res | Buffer | 5×5 Grid | Buffer | Red Res | Red UI |
| 2.1 | 2.0 | 0.5 | 10.0 | 0.5 | 2.0 | 2.1 |
Zone Coordinates
| Zone | Left | Right | Center | Width | | ----------------- | -------- | -------- | ------- | -------- | | Blue UI | -9.6 | -7.5 | -8.55 | 2.1 | | Blue Reserve | -7.5 | -5.5 | -6.5 | 2.0 | | Left Buffer | -5.5 | -5.0 | — | 0.5 | | Playable Grid | -5.0 | +5.0 | 0.0 | 10.0 | | Right Buffer | +5.0 | +5.5 | — | 0.5 | | Red Reserve | +5.5 | +7.5 | +6.5 | 2.0 | | Red UI | +7.5 | +9.6 | +8.55 | 2.1 |
Reserve Pool Purpose
- Holds drawn tiles before placement (visible to both players)
- Up to 3 tiles per player maximum
- Tiles can be stolen from opponent's reserve
Vertical Layout (10.8 world units)
| Zone | Bottom | Top | Height | | ------------- | ------ | ---- | ------ | | Bottom Margin | -5.4 | -5.0 | 0.4 | | Playable Grid | -5.0 | +5.0 | 10.0 | | Top Margin | +5.0 | +5.4 | 0.4 |
LayoutConfig Reference
All layout constants centralized in Assets/Scripts/Config/LayoutConfig.cs:
public static class LayoutConfig
{
// Screen dimensions
public const float ScreenWidth = 19.2f;
public const float ScreenHeight = 10.8f;
// Tile and grid
public const float TileSize = 2.0f;
public const int GridSize = 5;
// Grid boundaries
public const float GridLeft = -5.0f;
public const float GridRight = 5.0f;
public const float GridBottom = -5.0f;
public const float GridTop = 5.0f;
// Camera
public const float CameraOrthoSize = 5.4f;
// Reserve zones
public const float BlueReserveCenter = -6.5f;
public const float RedReserveCenter = 6.5f;
}
Grid Positioning
Grid to World Conversion
// Grid (0,0) to (4,4) maps to world coordinates
float x = LayoutConfig.GridLeft + (gridX * LayoutConfig.TileSize) + (LayoutConfig.TileSize / 2f);
float y = LayoutConfig.GridBottom + (gridY * LayoutConfig.TileSize) + (LayoutConfig.TileSize / 2f);
Key Grid Positions
| Grid | World Center | Description | | ------ | ------------ | ---------------------- | | (0, 0) | (-4, -4) | Bottom-left | | (2, 2) | (0, 0) | Center (starting tile) | | (4, 4) | (4, 4) | Top-right | | (0, 4) | (-4, 4) | Top-left | | (4, 0) | (4, -4) | Bottom-right |
SVG Import Settings
THE GOLDEN RULE
╔═══════════════════════════════════════════════════════════════╗
║ ║
║ WORLD SIZE = TEXTURE SIZE ÷ PIXELS PER UNIT ║
║ ║
║ ALWAYS use PPU = 100. Adjust Texture Size for world size. ║
║ ║
╚═══════════════════════════════════════════════════════════════╝
Formula: Texture Size = Desired World Size × 100
Standard Settings
| Asset | Desired World Size | Texture Size | PPU | | ---------- | ------------------ | ------------ | --- | | Tiles | 2.0 | 200 | 100 | | Tokens | 0.4 (20% of tile) | 40 | 100 |
Import Steps
- Select SVG file(s) in Project window
- In Inspector:
- Generated Asset Type: Texture2D
- Texture Size: (calculated value)
- Pixels Per Unit: 100
- Click Apply
Common Mistakes
| Mistake | Consequence | Solution | | -------------------------- | -------------------- | ------------------------------- | | Changing PPU | Inconsistent sizing | Always PPU = 100 | | Default Texture Size (256) | Wrong world size | Calculate: WorldSize × 100 | | Matching viewBox | Irrelevant to sizing | Set based on desired world size |
Rendering Order
Higher sorting order = renders in front.
| Layer | Sorting Order | Content | | ------------- | ------------- | --------------------------- | | Background | -10 | Solid color (#0D0F14) | | Tiles | 0 | TileView sprites | | Grid Glow | 1 | Wide semi-transparent lines | | Grid Core | 2 | Thin bright lines | | Reserve Lines | 1 | Zone boundaries | | Tokens | 10 | TokenView sprites |
Grid Visibility
Grid MUST have higher sorting order than tiles (1-2 vs 0) to appear above them.
Player Orientation
Players sit facing each other:
- Blue player: Views from LEFT side (x < 0)
- Red player: Views from RIGHT side (x > 0)
UI text rotation:
- Blue UI: Normal rotation (readable from left)
- Red UI: Rotated 180° (readable from right)
Edge Node Positions
Each tile has 4 edge nodes at side midpoints:
| Node | Offset from Tile Center | | ------ | ----------------------- | | Top | (0, +1.0) | | Right | (+1.0, 0) | | Bottom | (0, -1.0) | | Left | (-1.0, 0) |
Token Snapping
NodeSnapDistance = 0.5world units (appropriate for TokenSize = 0.4)- Tokens snap to the nearest edge node within snap distance
EdgeNode and Tile Rotation
EdgeNode values (Top, Right, Bottom, Left) are tile-local coordinates that rotate with the tile:
// Rotate edge node by rotation steps (each step = 90 degrees clockwise)
public static EdgeNode RotateEdge(EdgeNode node, int rotationSteps)
{
return (EdgeNode)(((int)node + rotationSteps) % 4);
}
// Example: A path from Left to Top on an unrotated tile
// After 1 rotation step (90 CW): becomes Bottom to Right
Center Tile Special Case:
- Center tile (game-tile-13) is the ONLY tile that cannot rotate
- Blue Attack starts on Left node, Red Attack starts on Right node
- These starting positions are fixed and hardcoded per game rules
Coordinate System Summary
World Y
↑
| +5.4 (screen top)
| +5.0 (grid top)
|
-9.6 ←─────────────────┼─────────────────→ +9.6 World X
|
| -5.0 (grid bottom)
| -5.4 (screen bottom)
↓
Troubleshooting
Camera not showing full screen
Cause: Wrong orthographic size
Solution: Set Camera → Orthographic Size = 5.4
Tiles too large/small
Cause: Wrong SVG Texture Size
Solution: Texture Size = World Size × 100
- Tiles: 200 (2.0 × 100)
- Tokens: 40 (0.4 × 100)
Grid lines hidden behind tiles
Cause: Sorting order wrong Solution: Grid sorting order (1-2) must be higher than tiles (0)
Sprites not aligning
Cause: Not using LayoutConfig
Solution: Always use LayoutConfig constants for positioning
Why 5×5 Grid?
- Balanced gameplay: Enough space for strategy, small enough for quick games
- Fits display: 10.0 world units fills the 1920×1080 display with room for UI
- Network aesthetic: 5×5 creates interconnected network paths matching cybersecurity theme
Reference Files
This skill's references/ folder contains:
| File | Contains | Read When |
| ------------------------ | --------------------------------------- | ---------------------------------- |
| coordinate-systems.md | Grid, World, Screen conversion formulas | Implementing coordinate transforms |
| layout-config.md | All LayoutConfig constants and values | Need exact constant values |
| svg-import-settings.md | PPU=100 rule, Texture Size formula | Importing new SVG assets |
| player-zones.md | Reserve pools, hand areas, stealing | Implementing reserve functionality |
Key Source Files
| File | Purpose |
| --------------------------------------- | -------------------- |
| Assets/Scripts/Config/LayoutConfig.cs | All layout constants |
Quick Reference
PPU = 100 (ALWAYS)
Texture Size = World Size × 100
NodeSnapDistance = 0.5 world units
Tiles: 2.0 world units → Texture Size = 200
Tokens: 0.4 world units → Texture Size = 40
Scan to join WeChat group