using UnityEngine;
using UnityEngine.UI;
///
/// 棋盘格子控件(一个交叉点):
/// 支持两种接入方式:
/// 1. 预制体(拖到 UIChessBoard.prefab_Cell):根节点挂本脚本 + Image + Button,
/// Image 可作点击热区(透明)或格子底图(保留原样显示)
/// 2. 不拖预制体:由 UIChessBoard 代码生成(透明热区)
/// 走子提示(Hint 子物体)没有会自动创建,不拦截射线
///
public class UIChessCell : MonoBehaviour
{
/// 逻辑坐标(x 0~8,y 0~9,红方在下方;黑方视角棋盘会整体翻转)
public Vector2Int gridPos;
/// 点击热区/格子底图(预制体上拖;为空自动 GetComponent)
public Image img_Click;
/// 走子提示(预制体上拖;为空自动找/建名为 Hint 的子物体)
public Image img_Hint;
private Button btn_Click;
private UIChessBoard ownerBoard;
private Sprite sprite_Dot;
private Sprite sprite_Ring;
private float dotSize;
private float ringSize;
/// 由 UIChessBoard 生成时调用(cellSize = 网格间距)
public void Init(UIChessBoard board, Vector2Int pos, float cellSize)
{
ownerBoard = board;
gridPos = pos;
// ---- 点击热区 ----
if (img_Click == null) img_Click = GetComponent();
if (img_Click == null)
{
img_Click = gameObject.AddComponent();
img_Click.color = new Color(1f, 1f, 1f, 0f); // 代码补的热区为全透明(预制体自带底图则保留原样)
}
img_Click.raycastTarget = true;
// ---- 走子提示 ----
if (img_Hint == null)
{
var t = transform.Find("Hint");
if (t != null) img_Hint = t.GetComponent();
if (img_Hint == null) CreateHint();
}
if (img_Hint != null)
{
img_Hint.raycastTarget = false;
img_Hint.gameObject.SetActive(false);
}
// 落子路径点固定用代码绘制的圆点/圆圈(颜色已烘焙)
sprite_Dot = ChessArtFactory.GetHintDotSprite();
sprite_Ring = ChessArtFactory.GetCaptureRingSprite();
dotSize = cellSize * 0.45f;
ringSize = cellSize * 1.12f;
// ---- 按钮 ----
btn_Click = GetComponent