101 lines
3.4 KiB
C#
101 lines
3.4 KiB
C#
using UnityEngine;
|
||
|
||
namespace Vanguard.Board3D
|
||
{
|
||
/// <summary>Круг поля: рамка, коллайдер и подпись V/R.</summary>
|
||
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<BoardSlotView>();
|
||
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<MeshFilter>();
|
||
filter.sharedMesh = BoardMeshLibrary.Frame(
|
||
config.cardWidth * 1.34f,
|
||
config.cardHeight * 1.34f,
|
||
Mathf.Max(0.018f, config.cardWidth * 0.035f));
|
||
|
||
var renderer = go.AddComponent<MeshRenderer>();
|
||
renderer.sharedMaterial = BoardMaterials.Highlight;
|
||
BoardMaterials.SetShadows(renderer, false);
|
||
view._renderer = renderer;
|
||
view.ApplyColor(false);
|
||
|
||
var collider = go.AddComponent<BoxCollider>();
|
||
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.14f,
|
||
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);
|
||
}
|
||
}
|
||
}
|