SusUnitCard

Сводка юнита в ростере / магазине — портрет, name / type, HP · AP · level, опциональный badge и слот actions.
Пакет
SusGame · Молекулы (коммерческий)
Свойства
| Имя | Тип | По умолчанию | |
|---|---|---|---|
UnitName | Prop<string> | "" | |
UnitType | Prop<string> | "" | |
Image | Prop<string> | "" | |
Icon | Prop<string> | "" | |
ImageSize | Prop<int> | 160 | |
IconSize | Prop<int> | 32 | |
Hp | Prop<int> | 100 | |
MaxHp | Prop<int> | 100 | |
Ap | Prop<int> | 0 | |
Level | Prop<int> | 1 | |
Selected | Prop<bool> | false | |
Disabled | Prop<bool> | false | |
Highlight | Prop<bool> | false | |
BadgeText | Prop<string> | "" |
Слоты
| Имя |
|---|
headerExtra |
bodyExtra |
actions |
События
| Имя | Поле | Payload |
|---|---|---|
Clicked | OnClicked | SusUnitCard |
Хуки стиля
Контракт USS-классов — внешний вид переопределяется без правки C#. Состояния переключаются этими классами:
sus-hiddensus-slotsus-unit-cardsus-unit-card__badgesus-unit-card__bodysus-unit-card__body-extrasus-unit-card__footersus-unit-card__headersus-unit-card__header-extrasus-unit-card__header-infosus-unit-card__iconsus-unit-card__imagesus-unit-card__namesus-unit-card__statsus-unit-card__stat-labelsus-unit-card__stat-valuesus-unit-card__subtitlesus-unit-card--disabledsus-unit-card--highlightsus-unit-card--selected
Использование
Props управляют chrome; медиа — через SusGameMedia. Клик вызывает OnClicked, если не задан Disabled.
var card = new SusUnitCard();
card.UnitName.Value = "Mara";
card.UnitType.Value = "Sergeant";
card.Image.Value = "portraits/mara";
card.Icon.Value = "";
card.Hp.Value = 42;
card.MaxHp.Value = 50;
card.Ap.Value = 4;
card.Level.Value = 3;
card.Selected.Value = true;
card.BadgeText.Value = "Turn";
card.OnClicked += c => { /* select unit */ };
// Optional: card.RefreshMedia();<template>
<sus:SusUnitCard :UnitName="Name.Value"
:UnitType="Type.Value"
:Image="Img.Value"
:Icon="Icon.Value"
:IconSize="IcoSize.Value"
:Hp="Hp.Value"
:MaxHp="MaxHp.Value"
:Ap="Ap.Value"
:Level="Level.Value"
:Selected="Sel.Value"
:Disabled="Dis.Value"
:Highlight="Hi.Value"
:BadgeText="Badge.Value"
@clicked="OnClicked">
<!-- slot actions: e.g. SusButton row -->
</sus:SusUnitCard>
</template>
<script>
public Prop<string> Name = new("Mara");
public Prop<string> Type = new("Sergeant");
public Prop<string> Img = new("portraits/mara");
public Prop<string> Icon = new("");
public Prop<int> IcoSize = new(32);
public Prop<int> Hp = new(42);
public Prop<int> MaxHp = new(50);
public Prop<int> Ap = new(4);
public Prop<int> Level = new(3);
public Prop<bool> Sel = new(true);
public Prop<bool> Dis = new(false);
public Prop<bool> Hi = new(false);
public Prop<string> Badge = new("Turn");
void OnClicked(SusUnitCard card) { /* … */ }
</script>| Prop / API | Роль |
|---|---|
UnitName · UnitType | Заголовок + подзаголовок (UnitType → подпись подзаголовка) |
Image · Icon | Ключ портрета из каталога / fallback-иконка (предпочтителен Image) |
ImageSize | Заявленный размер (по умолчанию 160); portrait chrome — это USS 3:4 — отрисовка не сжимается через этот prop |
IconSize | Размер мета-иконки (по умолчанию 32) |
Hp · MaxHp | Строка HP как Hp / MaxHp |
Ap · Level | Строка статов |
Selected · Disabled · Highlight | Классы состояния BEM; Disabled блокирует OnClicked |
BadgeText | Угловой badge, если не пуст |
Слот headerExtra | Ваша собственная строка под подзаголовком (ранг, прогресс ранга, тег) |
Слот bodyExtra | Ваш собственный блок под статами (описание, перки) |
Слот actions | Ряд действий в подвале |
RefreshMedia() | Переприменить image/icon после позднего связывания |
OnClicked | Payload = эта карточка |
Слоты: headerExtra и bodyExtra
У карточки намеренно нет пропов ранга или описания. Каждая игра называет и показывает ранг по-своему, поэтому карточка оставляет под это содержимое два слота:
| Слот | Класс хоста | Положение |
|---|---|---|
headerExtra | sus-unit-card__header-extra | Внутри sus-unit-card__header-info, сразу после подзаголовка |
bodyExtra | sus-unit-card__body-extra | Сразу после ряда статов (sus-unit-card__body), перед подвалом |
Оба хоста — колонки без padding, margin и минимального размера. Пустой хост имеет нулевую высоту, поэтому карточка без содержимого слотов сохраняет свою геометрию в точности. Отступы вложенного — на вашей стороне.
var card = new SusUnitCard();
card.UnitName.Value = "Mara";
card.UnitType.Value = "Sergeant";
var rank = new SusChip();
rank.Label.Value = "Captain";
rank.Size.Value = "small";
var rankProgress = new SusProgressLinear();
rankProgress.Value.Value = 65f;
rankProgress.Height.Value = 4f;
card.Slot("headerExtra").Add(rank);
card.Slot("headerExtra").Add(rankProgress);
card.Slot("bodyExtra").Add(new Label("Holds the line while the squad regroups."));В шаблоне слот заполняется через v-slot (см. Слоты):
<sus:SusUnitCard :UnitName="Name.Value" :UnitType="Type.Value">
<template v-slot:headerExtra>
<ui:Label text="Captain" class="my-unit-rank" />
</template>
<template v-slot:bodyExtra>
<ui:Label text="Holds the line while the squad regroups." />
</template>
</sus:SusUnitCard>Если ваш скин раньше переносил badge в sus-unit-card__header-info из кода (например, по GeometryChangedEvent), добавляйте его вместо этого в слот headerExtra.
Заметки
- Отличается от SusHudUnitCard (тактическая панель / combat chrome).
- Связанная плитка сквада: SusSquadCard.