Scale cards by 25 percent and center hand with hidden side panel
CI / test (push) Successful in 2m27s Details

This commit is contained in:
MpakobecEx 2026-10-23 17:21:15 +05:00
parent 6d8882ba2f
commit 5a6e96b678
7 changed files with 36 additions and 8 deletions

View File

@ -15,6 +15,7 @@ MonoBehaviour:
cardWidth: 0.63 cardWidth: 0.63
cardHeight: 0.88 cardHeight: 0.88
cardThickness: 0.006 cardThickness: 0.006
cardScale: 1.25
circleSpacingX: 1.42 circleSpacingX: 1.42
frontRowZ: 1.55 frontRowZ: 1.55
backRowZ: 3 backRowZ: 3

View File

@ -16,6 +16,8 @@ namespace Vanguard.Board3D
public float cardWidth = 0.63f; public float cardWidth = 0.63f;
public float cardHeight = 0.88f; public float cardHeight = 0.88f;
public float cardThickness = 0.006f; public float cardThickness = 0.006f;
[Tooltip("Общий масштаб всех карт на столе и в руке.")]
public float cardScale = 1.25f;
[Header("Поле")] [Header("Поле")]
[Tooltip("Расстояние между центрами соседних кругов по X.")] [Tooltip("Расстояние между центрами соседних кругов по X.")]

View File

@ -24,6 +24,7 @@ namespace Vanguard.Board3D
private Quaternion _targetRotation = Quaternion.identity; private Quaternion _targetRotation = Quaternion.identity;
private Vector3 _targetPosition; private Vector3 _targetPosition;
private Vector3 _targetScale = Vector3.one; private Vector3 _targetScale = Vector3.one;
private Vector3 _baseScale = Vector3.one;
private bool _immediate; private bool _immediate;
private bool _dragging; private bool _dragging;
@ -212,6 +213,7 @@ namespace Vanguard.Board3D
SetState(baseRotation, faceUp, rested, damageLayout); SetState(baseRotation, faceUp, rested, damageLayout);
_targetPosition = position; _targetPosition = position;
_targetScale = Vector3.one * Mathf.Max(0.05f, scale); _targetScale = Vector3.one * Mathf.Max(0.05f, scale);
_baseScale = _targetScale;
_immediate = immediate; _immediate = immediate;
if (_dragging) if (_dragging)
@ -250,7 +252,7 @@ namespace Vanguard.Board3D
_dragging = true; _dragging = true;
_dragOriginPosition = transform.position; _dragOriginPosition = transform.position;
_dragOriginRotation = transform.rotation; _dragOriginRotation = transform.rotation;
_targetScale = Vector3.one * 1.05f; _targetScale = _baseScale * 1.05f;
if (_collider != null) if (_collider != null)
_collider.enabled = false; _collider.enabled = false;
SetHighlight(null); SetHighlight(null);
@ -267,7 +269,7 @@ namespace Vanguard.Board3D
_config.dragLift + (_config.cardThickness * 0.5f), _config.dragLift + (_config.cardThickness * 0.5f),
worldPosition.z); worldPosition.z);
transform.rotation = Quaternion.Euler(0f, yaw, 0f); transform.rotation = Quaternion.Euler(0f, yaw, 0f);
transform.localScale = Vector3.one * 1.05f; transform.localScale = _baseScale * 1.05f;
} }
public void DropAt(Vector3 position, Quaternion rotation) public void DropAt(Vector3 position, Quaternion rotation)
@ -277,7 +279,7 @@ namespace Vanguard.Board3D
_collider.enabled = true; _collider.enabled = true;
_targetPosition = position; _targetPosition = position;
_targetRotation = rotation; _targetRotation = rotation;
_targetScale = Vector3.one; _targetScale = _baseScale;
_immediate = false; _immediate = false;
} }
@ -288,7 +290,7 @@ namespace Vanguard.Board3D
_collider.enabled = true; _collider.enabled = true;
_targetPosition = _dragOriginPosition; _targetPosition = _dragOriginPosition;
_targetRotation = _dragOriginRotation; _targetRotation = _dragOriginRotation;
_targetScale = Vector3.one; _targetScale = _baseScale;
_immediate = false; _immediate = false;
} }

View File

@ -35,6 +35,7 @@ namespace Vanguard.Board3D
private PlaymatLayoutConfig _config; private PlaymatLayoutConfig _config;
private PlaymatLayout _layout; private PlaymatLayout _layout;
private float _handViewportX;
private MatchView _view; private MatchView _view;
private int _selfPlayer; private int _selfPlayer;
private bool _hasRendered; private bool _hasRendered;
@ -105,6 +106,11 @@ namespace Vanguard.Board3D
return false; return false;
} }
public void SetHandViewportX(float value)
{
_handViewportX = Mathf.Clamp(value, 0.05f, 0.95f);
}
public void ConfigureRuntime( public void ConfigureRuntime(
AnimationConfig animationConfig, AnimationConfig animationConfig,
InputLockService inputLock) InputLockService inputLock)
@ -159,6 +165,7 @@ namespace Vanguard.Board3D
_config = config != null ? config : PlaymatLayoutConfig.Default; _config = config != null ? config : PlaymatLayoutConfig.Default;
_layout = new PlaymatLayout(_config); _layout = new PlaymatLayout(_config);
_handViewportX = _config.handViewportX;
_selfPlayer = 0; _selfPlayer = 0;
_built = true; _built = true;
@ -257,7 +264,7 @@ namespace Vanguard.Board3D
spec.Rested, spec.Rested,
immediateAll || changed, immediateAll || changed,
spec.DamageLayout, spec.DamageLayout,
spec.Scale); spec.Scale * Mathf.Max(0.05f, _config.cardScale));
card.SetHighlight(spec.Highlight); card.SetHighlight(spec.Highlight);
card.SetStats(spec.Stats, spec.StatsModified); card.SetStats(spec.Stats, spec.StatsModified);
@ -889,7 +896,7 @@ namespace Vanguard.Board3D
var halfHeight = Mathf.Tan( var halfHeight = Mathf.Tan(
_camera.fieldOfView * 0.5f * Mathf.Deg2Rad) * _config.handViewDistance; _camera.fieldOfView * 0.5f * Mathf.Deg2Rad) * _config.handViewDistance;
var halfWidth = halfHeight * Mathf.Max(0.1f, _camera.aspect); var halfWidth = halfHeight * Mathf.Max(0.1f, _camera.aspect);
var x = ((_config.handViewportX - 0.5f) * 2f * halfWidth) var x = ((_handViewportX - 0.5f) * 2f * halfWidth)
+ (offset * step); + (offset * step);
var y = (_config.handViewportY - 0.5f) * 2f * halfHeight var y = (_config.handViewportY - 0.5f) * 2f * halfHeight
+ (1f - Mathf.Abs(offset) / safeCount) * _config.handViewArc; + (1f - Mathf.Abs(offset) / safeCount) * _config.handViewArc;
@ -934,7 +941,7 @@ namespace Vanguard.Board3D
false, false,
false, false,
false, false,
scale); scale * Mathf.Max(0.05f, _config.cardScale));
} }
} }

View File

@ -662,6 +662,7 @@ namespace Vanguard.UI
_view = snapshot.View; _view = snapshot.View;
_finished = _view.IsFinished; _finished = _view.IsFinished;
_pendingIntents.Clear(); _pendingIntents.Clear();
FinishDiscardSelection();
_triggerPowerSlot = null; _triggerPowerSlot = null;
PrepareTriggerSelection(); PrepareTriggerSelection();
if (_view.Clock != null) if (_view.Clock != null)
@ -1130,6 +1131,15 @@ namespace Vanguard.UI
_phasePanel.anchoredPosition = new Vector2(-468f + shift, 0f); _phasePanel.anchoredPosition = new Vector2(-468f + shift, 0f);
if (_opponentZones?.Root != null) if (_opponentZones?.Root != null)
_opponentZones.Root.anchoredPosition = new Vector2(-488f + shift, -108f); _opponentZones.Root.anchoredPosition = new Vector2(-488f + shift, -108f);
if (_board3D != null)
{
_board3D.SetHandViewportX(
_intentPanelVisible
? (_board3D.Config != null
? _board3D.Config.handViewportX
: 0.44f)
: 0.5f);
}
} }
private void OnConcedeClicked() private void OnConcedeClicked()

View File

@ -1004,6 +1004,10 @@ Battle; Boot и общие сервисы остаются персистент
муллиган», с выбором — «Заменить X карт». муллиган», с выбором — «Заменить X карт».
- Trigger-зона противника зеркальна: над его колодой в сторону центра, - Trigger-зона противника зеркальна: над его колодой в сторону центра,
а не за дальним краем. а не за дальним краем.
- Карты на столе и в руке масштабируются общим `cardScale = 1.25`
(+25%); drag сохраняет базовый масштаб.
- Рука центрируется при скрытии боковой панели (`handViewportX = 0.5`);
при показе возвращается к значению из layout-конфига.
- Камера боя: `(0, 4.2, -8)` → цель `(0, 0, 0)`, только наклон по X; - Камера боя: `(0, 4.2, -8)` → цель `(0, 0, 0)`, только наклон по X;
поле по центру, без бокового смещения. поле по центру, без бокового смещения.
- UI: reference-разрешение **1920×1080**, CanvasScaler `matchWidthOrHeight - UI: reference-разрешение **1920×1080**, CanvasScaler `matchWidthOrHeight

View File

@ -75,6 +75,7 @@
углом к горизонту и не двигается игроком: `(0, 4.2, -8)`, цель углом к горизонту и не двигается игроком: `(0, 4.2, -8)`, цель
`(0, 0, 0)`, FOV 46; наклон только по X, без бокового смещения. Драг-н-дроп `(0, 0, 0)`, FOV 46; наклон только по X, без бокового смещения. Драг-н-дроп
на плоскость стола с подсветкой целей и плавным снапом. на плоскость стола с подсветкой целей и плавным снапом.
Все карты на столе и в руке увеличены на 25% (`cardScale = 1.25`).
- Поле: у каждого игрока два ряда `R V R` / `R R R` (V + 5 RC), у - Поле: у каждого игрока два ряда `R V R` / `R R R` (V + 5 RC), у
противника зеркально; между полями общий круг защиты; колода, дроп, противника зеркально; между полями общий круг защиты; колода, дроп,
триггер-зона и урон — 3D-зоны. Локальный игрок всегда снизу, даже если триггер-зона и урон — 3D-зоны. Локальный игрок всегда снизу, даже если
@ -99,7 +100,8 @@
Кнопка внутри overlay позволяет выйти в меню. Кнопка внутри overlay позволяет выйти в меню.
- Правую панель действий можно временно скрыть кнопкой «Скрыть панель» - Правую панель действий можно временно скрыть кнопкой «Скрыть панель»
в верхней строке; поле остаётся видимым, вернуть — «Показать панель». в верхней строке; поле остаётся видимым, вернуть — «Показать панель».
При скрытии панель фаз и блоки противника сдвигаются вправо. При скрытии панель фаз и блоки противника сдвигаются вправо, а рука
центрируется по горизонтали; при показе возвращается влево.
- Кнопка муллигана находится в панели «Фазы» и динамическая: без выбора — - Кнопка муллигана находится в панели «Фазы» и динамическая: без выбора —
«Закончить муллиган», с выбором — «Заменить X карт». «Закончить муллиган», с выбором — «Заменить X карт».
- Trigger-зона у противника расположена над его колодой по направлению - Trigger-зона у противника расположена над его колодой по направлению