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
cardHeight: 0.88
cardThickness: 0.006
cardScale: 1.25
circleSpacingX: 1.42
frontRowZ: 1.55
backRowZ: 3

View File

@ -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.")]

View File

@ -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;
}

View File

@ -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));
}
}

View File

@ -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()

View File

@ -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

View File

@ -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-зона у противника расположена над его колодой по направлению