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); // Тёмная пластина под рамкой: слот читается как площадка, а не // как пустой контур. Цвет — синий для R, тёплый для V. var plate = GameObject.CreatePrimitive(PrimitiveType.Cube); plate.name = "Slot Plate"; var plateCollider = plate.GetComponent(); if (plateCollider != null) { if (Application.isPlaying) Object.Destroy(plateCollider); else Object.DestroyImmediate(plateCollider); } plate.transform.SetParent(go.transform, false); plate.transform.localPosition = new Vector3(0f, -0.003f, 0f); plate.transform.localRotation = Quaternion.identity; plate.transform.localScale = new Vector3( config.cardWidth * 1.24f, 0.004f, config.cardHeight * 1.24f); var plateRenderer = plate.GetComponent(); plateRenderer.sharedMaterial = BoardMaterials.Highlight; BoardMaterials.SetShadows(plateRenderer, false); var plateBlock = new MaterialPropertyBlock(); var plateColor = slot == PlaymatLayout.VanguardSlot ? new Color(0.10f, 0.07f, 0.045f, 1f) : new Color(0.035f, 0.07f, 0.13f, 1f); BoardMaterials.SetColor(plateBlock, plateRenderer.sharedMaterial, plateColor); plateRenderer.SetPropertyBlock(plateBlock); 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, Color? color = null) { ApplyColor(highlighted, color ?? _highlightColor); } private void ApplyColor(bool highlighted, Color? color = null) { if (_renderer == null) return; _renderer.GetPropertyBlock(_block); _block.Clear(); BoardMaterials.SetColor( _block, _renderer.sharedMaterial, highlighted ? (color ?? _highlightColor) : _baseColor); _renderer.SetPropertyBlock(_block); } } }