using UnityEngine;
namespace Vanguard.Board3D
{
/// Круг поля: рамка, коллайдер и подпись V/R.
public sealed class BoardSlotView : MonoBehaviour
{
private MeshRenderer _renderer;
private MaterialPropertyBlock _block;
private Color _baseColor;
private Color _highlightColor;
public int Player { get; private set; }
public int Slot { get; private set; }
public int LocalSeat { get; private set; }
public BoardSlotKey Key => new BoardSlotKey(Player, Slot);
public BoardCardRef Ref => BoardCardRef.EmptySlot(Player, Slot);
public void SetPlayer(int player)
{
Player = player;
}
public static BoardSlotView Create(
Transform parent,
PlaymatLayoutConfig config,
int localSeat,
int player,
int slot,
PlaymatLayout layout)
{
var go = new GameObject("Slot " + PlaymatLayout.SlotLabel(slot));
go.transform.SetParent(parent, false);
go.transform.localPosition = layout.CirclePosition(localSeat, slot);
go.transform.localPosition = new Vector3(
go.transform.localPosition.x,
0.012f,
go.transform.localPosition.z);
var view = go.AddComponent();
view.Player = player;
view.Slot = slot;
view.LocalSeat = localSeat;
view._baseColor = slot == PlaymatLayout.VanguardSlot
? config.vanguardRingColor
: config.ringColor;
view._highlightColor = config.highlightColor;
view._block = new MaterialPropertyBlock();
var filter = go.AddComponent();
filter.sharedMesh = BoardMeshLibrary.Frame(
config.cardWidth * 1.34f,
config.cardHeight * 1.34f,
Mathf.Max(0.018f, config.cardWidth * 0.035f));
var renderer = go.AddComponent();
renderer.sharedMaterial = BoardMaterials.Highlight;
BoardMaterials.SetShadows(renderer, false);
view._renderer = renderer;
view.ApplyColor(false);
var collider = go.AddComponent();
collider.size = new Vector3(
config.cardWidth * 1.12f,
0.02f,
config.cardHeight * 1.12f);
collider.center = Vector3.zero;
var label = slot == PlaymatLayout.VanguardSlot ? "V" : "R";
var text = BoardText.Create(
go.transform,
label,
0.055f,
new Color(1f, 1f, 1f, 0.34f),
new Vector3(0f, 0.001f, 0f));
text.name = "Slot Label";
return view;
}
public void SetHighlighted(bool highlighted)
{
ApplyColor(highlighted);
}
private void ApplyColor(bool highlighted)
{
if (_renderer == null)
return;
_renderer.GetPropertyBlock(_block);
_block.Clear();
BoardMaterials.SetColor(
_block,
_renderer.sharedMaterial,
highlighted ? _highlightColor : _baseColor);
_renderer.SetPropertyBlock(_block);
}
}
}