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