Skip to content

SusMinimap

SusMinimap

Universal minimap — tile grid, free texture, or node graph; unit / POI markers, zoom, fog, camera frustum.

Package

SusGame · Molecules (commercial)

Open in Playground

SusGame · Molecules

Props

NameTypeDefault
RenderModeProp<string>"grid"
MapWidthProp<int>30
MapHeightProp<int>30
MinimapTextureProp<Texture2D>null
ShowGridProp<bool>true
CurrentFloorLevelProp<int>0
ShowPlayerProp<bool>false
PlayerPositionProp<Vector2>new Vector2(0.5f, 0.5f)
PlayerForwardProp<Vector2>new Vector2(0f, 1f)
PlayerModeProp<string>"center"
ViewConeAngleProp<float>70f
CameraTextureProp<Texture2D>null
ShowCameraIndicatorProp<bool>true
CameraBoundsProp<MinimapCameraRect>new MinimapCameraRect()
ZoomProp<float>1f
ZoomCenterProp<Vector2>new Vector2(0.5f, 0.5f)
FollowCameraProp<bool>true
MinZoomProp<float>0.5f
MaxZoomProp<float>3f
ZoomStepProp<float>0.25f
ShowZoomControlsProp<bool>false
RotationModeProp<string>"north-up"
ShowCompassProp<bool>false
ShowEdgeIndicatorsProp<bool>true
MaxEdgeIndicatorsProp<int>6
LabelModeProp<string>"selected"
MaskShapeProp<string>"square"
FrameVisibleProp<bool>true
FrameTitleProp<string>""
ShowFogOfWarProp<bool>false
FogMaskProp<Texture2D>null
InteractiveProp<bool>true
AutoResizeProp<bool>true
MinSizeProp<float>128f
MaxSizeProp<float>512f
MapBoundsProp<MinimapBounds>new MinimapBounds()

Slots

Name
(default)
frameOverlay
cornerTopLeft
cornerTopRight
cornerBottomLeft
cornerBottomRight

Events

NameFieldPayload
CellClickedOnCellClickedVector2
UnitClickedOnUnitClickedint
PoiClickedOnPoiClickedstring
NodeClickedOnNodeClickedstring
ZoomChangedOnZoomChangedfloat

Style hooks

USS class contract — override appearance without touching C#. States toggle via these classes:

  • sus-minimap
  • sus-minimap__camera
  • sus-minimap__compass
  • sus-minimap__compass-label
  • sus-minimap__compass-label--e
  • sus-minimap__compass-label--n
  • sus-minimap__compass-label--s
  • sus-minimap__compass-label--w
  • sus-minimap__container
  • sus-minimap__corner
  • sus-minimap__corner--bl
  • sus-minimap__corner--br
  • sus-minimap__corner--tl
  • sus-minimap__corner--tr
  • sus-minimap__edge-counter
  • sus-minimap__edge-indicator
  • sus-minimap__edge-layer
  • sus-minimap__fog
  • sus-minimap__frame
  • sus-minimap__label
  • sus-minimap__node
  • sus-minimap__node--appear
  • sus-minimap__node--current
  • sus-minimap__node-icon
  • sus-minimap__node-label
  • sus-minimap__nodes
  • sus-minimap__overlay-slot
  • sus-minimap__player-arrow
  • sus-minimap__player-cone
  • sus-minimap__player-layer
  • sus-minimap__poi
  • sus-minimap__poi--kind-loot
  • sus-minimap__poi--kind-objective
  • sus-minimap__poi--pulse
  • sus-minimap__poi-icon
  • sus-minimap__poi-label
  • sus-minimap__pois
  • sus-minimap__terrain
  • sus-minimap__title
  • sus-minimap__unit
  • sus-minimap__unit--kind-loot
  • sus-minimap__unit--kind-objective
  • sus-minimap__unit--selected
  • sus-minimap__unit-dir
  • sus-minimap__unit-hp
  • sus-minimap__unit-hp-fill
  • sus-minimap__units
  • sus-minimap__zoom-btn
  • sus-minimap__zoom-controls
  • sus-minimap--fit
  • sus-minimap--frame-visible
  • sus-minimap--free
  • sus-minimap--grid
  • sus-minimap--interactive
  • sus-minimap--mask-circle
  • sus-minimap--mask-square
  • sus-minimap--node

Usage

Pick RenderMode (grid | free | node), then fill list props from C# (TerrainData / MinimapTexture / NodeData+EdgeData). Markers and clicks are list-driven — not XML lists.

csharp
var map = new SusMinimap();
map.RenderMode.Value = "grid";
map.MapWidth.Value = 30;
map.MapHeight.Value = 30;
map.MaskShape.Value = "circle";
map.FrameTitle.Value = "Floor 1";
map.ShowGrid.Value = true;
map.Interactive.Value = true;

map.TerrainData.Value = new List<SusMinimap.MinimapCell>
{
    new() { X = 0, Z = 0, Type = 1, FloorLevel = 0, Visibility = 2 },
};
map.UnitData.Value = new List<SusMinimap.MinimapUnitMarker>
{
    /* … */
};

map.OnCellClicked += cell => { /* Vector2 grid coords */ };
map.OnUnitClicked += idx => { /* marker index */ };
map.OnPoiClicked += id => { /* … */ };
map.OnNodeClicked += id => { /* … */ };
map.OnZoomChanged += z => { /* … */ };

// Helpers
// map.FocusOn(new Vector2(0.5f, 0.5f), zoom: 1.5f);
// map.ResetZoom();
// map.RegenerateTerrainTexture();
xml
<template>
  <sus:SusMinimap :RenderMode="Mode.Value"
                  :MapWidth="W.Value"
                  :MapHeight="H.Value"
                  :ShowGrid="Grid.Value"
                  :CurrentFloorLevel="Floor.Value"
                  :MaskShape="Mask.Value"
                  :FrameVisible="Frame.Value"
                  :FrameTitle="Title.Value"
                  :ShowFogOfWar="Fog.Value"
                  :Interactive="Ix.Value"
                  :Zoom="Zoom.Value"
                  :MinZoom="MinZ.Value"
                  :MaxZoom="MaxZ.Value"
                  :FollowCamera="Follow.Value"
                  :ShowCameraIndicator="Cam.Value"
                  :AutoResize="Auto.Value"
                  :MinSize="MinS.Value"
                  :MaxSize="MaxS.Value"
                  @cell-clicked="OnCell"
                  @unit-clicked="OnUnit"
                  @poi-clicked="OnPoi"
                  @node-clicked="OnNode"
                  @zoom-changed="OnZoom" />
</template>

<script>
public Prop<string> Mode = new("grid");
public Prop<int> W = new(30);
public Prop<int> H = new(30);
public Prop<bool> Grid = new(true);
public Prop<int> Floor = new(0);
public Prop<string> Mask = new("circle");
public Prop<bool> Frame = new(true);
public Prop<string> Title = new("Floor 1");
public Prop<bool> Fog = new(false);
public Prop<bool> Ix = new(true);
public Prop<float> Zoom = new(1f);
public Prop<float> MinZ = new(0.5f);
public Prop<float> MaxZ = new(3f);
public Prop<bool> Follow = new(true);
public Prop<bool> Cam = new(true);
public Prop<bool> Auto = new(true);
public Prop<float> MinS = new(128f);
public Prop<float> MaxS = new(512f);
void OnCell(Vector2 cell) { /* … */ }
void OnUnit(int index) { /* … */ }
void OnPoi(string id) { /* … */ }
void OnNode(string id) { /* … */ }
void OnZoom(float z) { /* … */ }
// Fill TerrainData / UnitData / PoiData / NodeData / EdgeData /
// MinimapTexture / FogMask / CameraBounds / MapBounds from C#.
</script>
Prop / APIRole
RenderModegrid | free | node
MapWidth · MapHeightGrid dimensions (default 30)
TerrainDataList<MinimapCell> — grid tiles (regenerates texture)
MinimapTexturePre-made texture (free / skip generate)
ShowGrid · CurrentFloorLevelGrid chrome / multi-floor
UnitData · PoiDataMarker lists
NodeData · EdgeDataGraph (node mode)
CameraTexture · ShowCameraIndicator · CameraBounds · FollowCameraFrustum
Zoom · ZoomCenter · MinZoom · MaxZoomZoom
MaskShapesquare | circle
FrameVisible · FrameTitleFrame chrome
ShowFogOfWar · FogMaskFog overlay
InteractiveClick / zoom input
AutoResize · MinSize · MaxSizeHost size clamp
MapBoundsWorld bounds (free World↔minimap)
default / frameOverlay / corner* slotsOverlay content
RegenerateTerrainTexture · FocusOn · ResetZoom · ToggleHelpers
OnCellClicked · OnUnitClicked · OnPoiClicked · OnNodeClicked · OnZoomChangedEvents

Modes

RenderModeSource
gridTerrainData cells → generated texture
freeMinimapTexture (+ MapBounds)
nodeNodeData + EdgeData (nested MinimapNodeState / MinimapEdgeState)

Nested types live on SusMinimap (MinimapCell, MinimapUnitMarker, MinimapPOIMarker, MinimapNode, MinimapEdge, MinimapBounds, MinimapCameraRect) — see .sharq for fields.

Notes

  • HUD chrome wrapper (placeholder / size): SusHudMinimapFrame — inject this atom via SetContent or the default slot.
  • List / texture / bounds props are C#-driven; XML binds the scalar chrome props above.
  • ComponentApi extract may omit list props without [CreateProperty] — use the table / .sharq as source of truth.