К содержимому

SusMinimap

SusMinimap

Универсальная миникарта — tile grid, free texture или node graph; маркеры unit / POI, zoom, fog, frustum камеры.

Пакет

SusGame · Атомы (коммерческий)

Открыть в песочнице

SusGame · Molecules

Свойства

ИмяТипПо умолчанию
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()

Слоты

Имя
(по умолчанию)
frameOverlay
cornerTopLeft
cornerTopRight
cornerBottomLeft
cornerBottomRight

События

ИмяПолеPayload
CellClickedOnCellClickedVector2
UnitClickedOnUnitClickedint
PoiClickedOnPoiClickedstring
NodeClickedOnNodeClickedstring
ZoomChangedOnZoomChangedfloat

Хуки стиля

Контракт USS-классов — внешний вид переопределяется без правки C#. Состояния переключаются этими классами:

  • 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

Использование

Выберите RenderMode (grid | free | node), затем заполните list-пропы из C# (TerrainData / MinimapTexture / NodeData+EdgeData). Маркеры и клики управляются списками — не XML-списками.

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 / APIРоль
RenderModegrid | free | node
MapWidth · MapHeightРазмеры сетки (по умолчанию 30)
TerrainDataList<MinimapCell> — тайлы сетки (перегенерирует текстуру)
MinimapTextureГотовая текстура (free / без генерации)
ShowGrid · CurrentFloorLevelОформление сетки / несколько этажей
UnitData · PoiDataСписки маркеров
NodeData · EdgeDataГраф (режим node)
CameraTexture · ShowCameraIndicator · CameraBounds · FollowCameraFrustum камеры
Zoom · ZoomCenter · MinZoom · MaxZoomМасштаб
MaskShapesquare | circle
FrameVisible · FrameTitleОформление рамки
ShowFogOfWar · FogMaskОверлей тумана войны
InteractiveВвод кликов / масштабирования
AutoResize · MinSize · MaxSizeОграничение размера хоста
MapBoundsГраницы мира (free, World↔minimap)
default / frameOverlay / corner* slotsСодержимое оверлея
RegenerateTerrainTexture · FocusOn · ResetZoom · ToggleХелперы
OnCellClicked · OnUnitClicked · OnPoiClicked · OnNodeClicked · OnZoomChangedСобытия

Режимы

RenderModeИсточник
gridЯчейки TerrainData → сгенерированная текстура
freeMinimapTexture (+ MapBounds)
nodeNodeData + EdgeData (вложенные MinimapNodeState / MinimapEdgeState)

Вложенные типы находятся в SusMinimap (MinimapCell, MinimapUnitMarker, MinimapPOIMarker, MinimapNode, MinimapEdge, MinimapBounds, MinimapCameraRect) — поля смотрите в .sharq.

Заметки

  • HUD-обёртка (плейсхолдер / размер): SusHudMinimapFrame — вставляйте этот атом через SetContent или дефолтный слот.
  • List/texture/bounds-пропы управляются из C#; XML привязывает только скалярные пропы оформления выше.
  • Извлечение ComponentApi может пропускать list-пропы без [CreateProperty] — используйте таблицу / .sharq как источник истины.