Что это: компонент одной карты. Отображение (DeckConfig, Suit, Rank), переворот, анимации перемещения/переворота, hover, клики. Настройка в инспекторе, события через UnityEvent. Файл: Scripts/Cards/Components/CardComponent.cs.
Как использовать: добавить на объект карты, задать Config/Suit/Rank в инспекторе; для переворота и анимаций использовать поля и события компонента. Поддерживает: переворот лицом вверх/вниз; анимации перемещения и переворота; hover; UnityEvent (OnClick и др.).
| Поле | Описание |
|---|---|
| Config | DeckConfig со спрайтами |
| Suit | Масть карты |
| Rank | Ранг карты |
| Is Joker | Является ли джокером |
| Is Red Joker | Красный ли джокер |
| Поле | Описание |
|---|---|
| Is Face Up | Показана лицом вверх |
| Is Interactable | Можно ли кликать |
| Поле | Описание |
|---|---|
| Card Image | UI Image для отображения (для UI) |
| Sprite Renderer | SpriteRenderer для отображения (для 2D) |
| Поле | Значение по умолчанию | Описание |
|---|---|---|
| Flip Duration | 0.3 сек | Длительность переворота |
| Move Duration | 0.2 сек | Длительность перемещения |
| Flip Ease | OutQuad | Тип easing для переворота |
| Move Ease | OutQuad | Тип easing для перемещения |
| Поле | Значение по умолчанию | Описание |
|---|---|---|
| Enable Hover Effect | true | Включить эффект наведения |
| Hover Scale | 0.1 | Дельта увеличения (0.1 = +10%). Если 0 — эффект масштаба отключен |
| Hover Y Offset | 20 | Подъём вверх в пикселях. Если 0 — эффект перемещения отключен |
| Hover Duration | 0.15 сек | Скорость анимации |
Примеры настройки:
Hover Scale = 0.1, Hover Y Offset = 20→ увеличение + подъёмHover Scale = 0, Hover Y Offset = 20→ только подъём (без масштаба)Hover Scale = 0.1, Hover Y Offset = 0→ только увеличение (без перемещения)Hover Scale = 0, Hover Y Offset = 0→ hover полностью отключен
Примеры Hover Scale:
0→ эффект масштаба отключен0.1→ увеличение на 10% (станет 110% размера)0.2→ увеличение на 20% (станет 120% размера)-0.1→ уменьшение на 10% (станет 90% размера)
| Событие | Когда вызывается |
|---|---|
OnClick |
Клик по карте |
OnFlip |
Карта перевернулась |
OnMoveComplete |
Перемещение завершено |
OnHoverEnter |
Курсор наведён на карту |
OnHoverExit |
Курсор покинул карту |
OnClick:
→ GameManager.CardClicked
OnFlip:
→ AudioSource.PlayOneShot (cardFlipSound)
public void SetData(CardData data, bool faceUp = true);Устанавливает данные карты и обновляет визуал.
[Button]
public void Flip();
public async UniTask FlipAsync();
public async UniTask FlipAsync(float duration);Переворачивает карту (с анимацией или без).
public async UniTask MoveToAsync(Vector3 position);
public async UniTask MoveToAsync(Vector3 position, float duration);
public async UniTask MoveToLocalAsync(Vector3 localPosition, float duration);Перемещает карту в позицию с анимацией.
public void UpdateOriginalTransform();Обновляет сохранённую позицию и масштаб. Вызывается автоматически HandComponent после расстановки карт.
public void ResetHover();Сбрасывает hover эффект с анимацией.
| Свойство | Тип | Описание |
|---|---|---|
Data |
CardData |
Данные карты |
IsFaceUp |
bool |
Показана лицом вверх (сеттер обновляет визуал) |
IsInteractable |
bool |
Можно ли кликать |
Config |
DeckConfig |
Конфигурация колоды (сеттер обновляет визуал) |
Компонент использует две переменные для масштаба:
_originalScale— неизменный масштаб из префаба (устанавливается в Awake)_currentTargetScale— текущий целевой масштаб (обновляется при перемещении)
При анимации переворота:
- Сохраняется текущий масштаб до начала анимации
- Карта сжимается по X до 0
- Меняется лицо/рубашка
- Карта возвращается к сохранённому масштабу
- Масштаб принудительно устанавливается для точности
Результат: Масштаб карты никогда не искажается, даже при множественных переворотах.
При наведении курсора (IPointerEnterHandler):
- Сохраняется оригинальная позиция
- Карта увеличивается на
_hoverScale(дельта) от текущего масштаба - Карта поднимается на
_hoverYOffsetпикселей
При уходе курсора (IPointerExitHandler):
- Карта возвращается к оригинальной позиции
- Карта возвращается к оригинальному масштабу
Автоматическая настройка:
- В Awake автоматически включается
Image.raycastTarget = trueдля работы hover эффекта - Для UI карт убедитесь, что на сцене есть
EventSystem
Защита от багов:
- Если hover срабатывает во время анимации — анимация завершается корректно
- Если повторный hover — предыдущий сбрасывается мгновенно
- Hover автоматически сбрасывается при начале новой анимации перемещения/переворота
- Использует текущий масштаб, а не оригинальный из Awake
При изменении параметров в инспекторе (только в Edit Mode):
- Данные карты пересоздаются
- Визуал обновляется
- Работает только если назначен DeckConfig
// Префаб карты
GameObject cardPrefab
├── Image (Card Image)
└── CardComponent
├── Config → DeckConfig
├── Card Image → Image
└── События настроеныGameObject cardPrefab
├── SpriteRenderer
└── CardComponent
├── Config → DeckConfig
├── Sprite Renderer → SpriteRenderer
└── Hover Y Offset → 0.5 (для мирового пространства)- CardData — структура данных карты
- DeckConfig — конфигурация колоды
- HandComponent — компонент руки
- CardView — MVP версия (для кода)