Unity+C#棋盘游戏:如何获取玩家点击的Tile对象?
解决棋盘游戏中获取玩家点击Tile对象的问题
原代码存在的核心问题
- Tile脚本里的
finalTile变量完全多余——点击时只是把当前Tile实例赋值给自己,没有将这个选中的实例传递给Pawn。 - Pawn脚本里的
selectedTile从未被赋值,直接访问selectedTile.finalTile会引用错误对象(或为空),导致日志输出异常。 Debug.Log的执行时机错误——直接写在字段声明下方会在Awake阶段就运行,此时玩家还未进行任何点击操作。
方案一:全局静态变量存储选中Tile(简单直接)
修改Tile.cs,用静态变量记录当前选中的Tile实例:
public class Tile : MonoBehaviour { // 静态变量全局维护选中的Tile public static Tile CurrentSelectedTile; void OnMouseUp() { // 点击时将当前Tile设为选中状态 CurrentSelectedTile = this; } }
在Pawn.cs中,当需要获取选中Tile时(比如掷出6点后等待玩家选择完成):
public class Pawn : MonoBehaviour { // 比如在掷骰子后调用这个方法检查选中状态 void ProcessPlayerSelection() { if (Tile.CurrentSelectedTile != null) { Debug.Log("选中Tile的位置:" + Tile.CurrentSelectedTile.transform.position); // 执行棋子移动到该Tile的逻辑 // 移动完成后清空选中状态,避免重复触发 Tile.CurrentSelectedTile = null; } else { Debug.Log("玩家未选中任何Tile"); } } }
方案二:事件通知(解耦性更强)
适合仅特定Tile可被选择的场景(比如掷6点后的3条路径Tile),通过事件传递选中的Tile实例:
修改Tile.cs,添加点击事件:
using UnityEngine.Events; public class Tile : MonoBehaviour { // 定义Tile点击事件,携带当前Tile实例 public UnityEvent<Tile> OnTileClicked; void OnMouseUp() { // 触发事件,传递自身实例 OnTileClicked?.Invoke(this); } }
在Pawn.cs中订阅可选Tile的点击事件:
using System.Collections.Generic; using UnityEngine; public class Pawn : MonoBehaviour { // 在Inspector中拖拽绑定掷6点后可选的3个Tile public List<Tile> optionalMoveTiles; private Tile _targetTile; void Start() { // 给所有可选Tile绑定点击回调 foreach (var tile in optionalMoveTiles) { tile.OnTileClicked.AddListener(OnTargetTileSelected); } } void OnTargetTileSelected(Tile clickedTile) { _targetTile = clickedTile; Debug.Log("选中的目标Tile位置:" + _targetTile.transform.position); // 执行棋子移动逻辑... } }
内容的提问来源于stack exchange,提问作者Radu Cristea
相关产品推荐
相关产品推荐

