diff --git a/client/Assets/Vanguard/Runtime/Board3D/Config/PlaymatLayoutConfig.asset b/client/Assets/Vanguard/Runtime/Board3D/Config/PlaymatLayoutConfig.asset index d8acfad..7f43179 100644 --- a/client/Assets/Vanguard/Runtime/Board3D/Config/PlaymatLayoutConfig.asset +++ b/client/Assets/Vanguard/Runtime/Board3D/Config/PlaymatLayoutConfig.asset @@ -15,6 +15,7 @@ MonoBehaviour: cardWidth: 0.63 cardHeight: 0.88 cardThickness: 0.006 + cardScale: 1.25 circleSpacingX: 1.42 frontRowZ: 1.55 backRowZ: 3 diff --git a/client/Assets/Vanguard/Runtime/Board3D/Config/PlaymatLayoutConfig.cs b/client/Assets/Vanguard/Runtime/Board3D/Config/PlaymatLayoutConfig.cs index 4d632ef..1307519 100644 --- a/client/Assets/Vanguard/Runtime/Board3D/Config/PlaymatLayoutConfig.cs +++ b/client/Assets/Vanguard/Runtime/Board3D/Config/PlaymatLayoutConfig.cs @@ -16,6 +16,8 @@ namespace Vanguard.Board3D public float cardWidth = 0.63f; public float cardHeight = 0.88f; public float cardThickness = 0.006f; + [Tooltip("Общий масштаб всех карт на столе и в руке.")] + public float cardScale = 1.25f; [Header("Поле")] [Tooltip("Расстояние между центрами соседних кругов по X.")] diff --git a/client/Assets/Vanguard/Runtime/Board3D/View/Card3D.cs b/client/Assets/Vanguard/Runtime/Board3D/View/Card3D.cs index 6c25e65..daf3ed1 100644 --- a/client/Assets/Vanguard/Runtime/Board3D/View/Card3D.cs +++ b/client/Assets/Vanguard/Runtime/Board3D/View/Card3D.cs @@ -24,6 +24,7 @@ namespace Vanguard.Board3D private Quaternion _targetRotation = Quaternion.identity; private Vector3 _targetPosition; private Vector3 _targetScale = Vector3.one; + private Vector3 _baseScale = Vector3.one; private bool _immediate; private bool _dragging; @@ -212,6 +213,7 @@ namespace Vanguard.Board3D SetState(baseRotation, faceUp, rested, damageLayout); _targetPosition = position; _targetScale = Vector3.one * Mathf.Max(0.05f, scale); + _baseScale = _targetScale; _immediate = immediate; if (_dragging) @@ -250,7 +252,7 @@ namespace Vanguard.Board3D _dragging = true; _dragOriginPosition = transform.position; _dragOriginRotation = transform.rotation; - _targetScale = Vector3.one * 1.05f; + _targetScale = _baseScale * 1.05f; if (_collider != null) _collider.enabled = false; SetHighlight(null); @@ -267,7 +269,7 @@ namespace Vanguard.Board3D _config.dragLift + (_config.cardThickness * 0.5f), worldPosition.z); 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) @@ -277,7 +279,7 @@ namespace Vanguard.Board3D _collider.enabled = true; _targetPosition = position; _targetRotation = rotation; - _targetScale = Vector3.one; + _targetScale = _baseScale; _immediate = false; } @@ -288,7 +290,7 @@ namespace Vanguard.Board3D _collider.enabled = true; _targetPosition = _dragOriginPosition; _targetRotation = _dragOriginRotation; - _targetScale = Vector3.one; + _targetScale = _baseScale; _immediate = false; } diff --git a/client/Assets/Vanguard/Runtime/Board3D/View/GameBoard3D.cs b/client/Assets/Vanguard/Runtime/Board3D/View/GameBoard3D.cs index ee9826d..cba99f6 100644 --- a/client/Assets/Vanguard/Runtime/Board3D/View/GameBoard3D.cs +++ b/client/Assets/Vanguard/Runtime/Board3D/View/GameBoard3D.cs @@ -35,6 +35,7 @@ namespace Vanguard.Board3D private PlaymatLayoutConfig _config; private PlaymatLayout _layout; + private float _handViewportX; private MatchView _view; private int _selfPlayer; private bool _hasRendered; @@ -105,6 +106,11 @@ namespace Vanguard.Board3D return false; } + public void SetHandViewportX(float value) + { + _handViewportX = Mathf.Clamp(value, 0.05f, 0.95f); + } + public void ConfigureRuntime( AnimationConfig animationConfig, InputLockService inputLock) @@ -159,6 +165,7 @@ namespace Vanguard.Board3D _config = config != null ? config : PlaymatLayoutConfig.Default; _layout = new PlaymatLayout(_config); + _handViewportX = _config.handViewportX; _selfPlayer = 0; _built = true; @@ -257,7 +264,7 @@ namespace Vanguard.Board3D spec.Rested, immediateAll || changed, spec.DamageLayout, - spec.Scale); + spec.Scale * Mathf.Max(0.05f, _config.cardScale)); card.SetHighlight(spec.Highlight); card.SetStats(spec.Stats, spec.StatsModified); @@ -889,7 +896,7 @@ namespace Vanguard.Board3D var halfHeight = Mathf.Tan( _camera.fieldOfView * 0.5f * Mathf.Deg2Rad) * _config.handViewDistance; 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); var y = (_config.handViewportY - 0.5f) * 2f * halfHeight + (1f - Mathf.Abs(offset) / safeCount) * _config.handViewArc; @@ -934,7 +941,7 @@ namespace Vanguard.Board3D false, false, false, - scale); + scale * Mathf.Max(0.05f, _config.cardScale)); } } diff --git a/client/Assets/Vanguard/Runtime/UI/BattleView.cs b/client/Assets/Vanguard/Runtime/UI/BattleView.cs index cdca8e7..edb2d78 100644 --- a/client/Assets/Vanguard/Runtime/UI/BattleView.cs +++ b/client/Assets/Vanguard/Runtime/UI/BattleView.cs @@ -662,6 +662,7 @@ namespace Vanguard.UI _view = snapshot.View; _finished = _view.IsFinished; _pendingIntents.Clear(); + FinishDiscardSelection(); _triggerPowerSlot = null; PrepareTriggerSelection(); if (_view.Clock != null) @@ -1130,6 +1131,15 @@ namespace Vanguard.UI _phasePanel.anchoredPosition = new Vector2(-468f + shift, 0f); if (_opponentZones?.Root != null) _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() diff --git a/docs/HANDOFF.md b/docs/HANDOFF.md index 30fb605..8465512 100644 --- a/docs/HANDOFF.md +++ b/docs/HANDOFF.md @@ -1004,6 +1004,10 @@ Battle; Boot и общие сервисы остаются персистент муллиган», с выбором — «Заменить X карт». - Trigger-зона противника зеркальна: над его колодой в сторону центра, а не за дальним краем. +- Карты на столе и в руке масштабируются общим `cardScale = 1.25` + (+25%); drag сохраняет базовый масштаб. +- Рука центрируется при скрытии боковой панели (`handViewportX = 0.5`); + при показе возвращается к значению из layout-конфига. - Камера боя: `(0, 4.2, -8)` → цель `(0, 0, 0)`, только наклон по X; поле по центру, без бокового смещения. - UI: reference-разрешение **1920×1080**, CanvasScaler `matchWidthOrHeight diff --git a/docs/SESSION-STATE.md b/docs/SESSION-STATE.md index ccbbfec..a1a1d05 100644 --- a/docs/SESSION-STATE.md +++ b/docs/SESSION-STATE.md @@ -75,6 +75,7 @@ углом к горизонту и не двигается игроком: `(0, 4.2, -8)`, цель `(0, 0, 0)`, FOV 46; наклон только по X, без бокового смещения. Драг-н-дроп на плоскость стола с подсветкой целей и плавным снапом. + Все карты на столе и в руке увеличены на 25% (`cardScale = 1.25`). - Поле: у каждого игрока два ряда `R V R` / `R R R` (V + 5 RC), у противника зеркально; между полями общий круг защиты; колода, дроп, триггер-зона и урон — 3D-зоны. Локальный игрок всегда снизу, даже если @@ -99,7 +100,8 @@ Кнопка внутри overlay позволяет выйти в меню. - Правую панель действий можно временно скрыть кнопкой «Скрыть панель» в верхней строке; поле остаётся видимым, вернуть — «Показать панель». - При скрытии панель фаз и блоки противника сдвигаются вправо. + При скрытии панель фаз и блоки противника сдвигаются вправо, а рука + центрируется по горизонтали; при показе возвращается влево. - Кнопка муллигана находится в панели «Фазы» и динамическая: без выбора — «Закончить муллиган», с выбором — «Заменить X карт». - Trigger-зона у противника расположена над его колодой по направлению