第一段代码
public class GridAndPieces : MonoBehaviour
{
GameManager gameManager;
/// <summary>
/// GameManager中格子的索引
/// </summary>
[HideInInspector]
public int xIndex, yIndex;//格子的索引
public int fromPosX, fromPosY;//棋子俩的位置
public GameObject gridObj;
public int pieceColorID;//棋子颜色id
// Start is called before the first frame update
void Start()
{
gameManager = GameManager.Instance;
}
/// <summary>
/// 点击黑棋
/// </summary>
public void ClickBlackPiece()
{
gameManager.firstClickPiece = EventSystem.current.currentSelectedGameObject;
pieceColorID = 1;
}
/// <summary>
/// 点击红棋
/// </summary>
public void ClickWhitePiece()
{
gameManager.firstClickPiece = EventSystem.current.currentSelectedGameObject;
pieceColorID = 2;
}
/// <summary>
/// 点击格子获取需要移动的目标位置
/// </summary>
public void ClickGrid()
{
int toPosX, toPosY;//需要移动的目标格子位置的索引值
toPosX = xIndex;
toPosY = yIndex;
if (gameManager.firstClickPiece == null)
{
Debug.Log($"没有可移动的棋子");
return;
}
else
{
bool canValidMove = gameManager.piecesRules.IsMoveValid(toPosX, toPosY);
if (!canValidMove)
{
Debug.Log($"移动不合法");
return;
}
gameManager.piecesMoving.PiecesMove(gameManager.firstClickPiece, toPosX, toPosY, pieceColorID);
gameManager.firstClickPiece = null;
}
第二段代码
public class GridAndPieces : MonoBehaviour
{
GameManager gameManager;
/// <summary>
/// GameManager中格子的索引
/// </summary>
[HideInInspector]
public int xIndex, yIndex;//格子的索引
public GameObject gridObj;
// Start is called before the first frame update
void Start()
{
gameManager = GameManager.Instance;
}
/// <summary>
/// 点击黑棋
/// </summary>
public void ClickBlackPiece()
{
gameManager.firstClickPiece = EventSystem.current.currentSelectedGameObject;
}
/// <summary>
/// 点击红棋
/// </summary>
public void ClickWhitePiece()
{
gameManager.firstClickPiece = EventSystem.current.currentSelectedGameObject;
}
/// <summary>
/// 点击格子获取需要移动的目标位置
/// </summary>
public void ClickGrid()
{
int toPosX, toPosY, pieceColorID=0;//需要移动的目标格子位置的索引值
toPosX = xIndex;
toPosY = yIndex;
if (gameManager.firstClickPiece == null)
{
Debug.Log($"没有可移动的棋子");
return;
}
else
{
if (gameManager.firstClickPiece.name=="heiqi")
{
pieceColorID = 1;
}
if (gameManager.firstClickPiece.name=="baiqi")
{
pieceColorID = 2;
}
bool canValidMove = gameManager.piecesRules.IsMoveValid(toPosX, toPosY);
if (!canValidMove)
{
Debug.Log($"移动不合法");
return;
}
gameManager.piecesMoving.PiecesMove(gameManager.firstClickPiece, toPosX, toPosY, pieceColorID);
gameManager.firstClickPiece = null;
}
老师好:这是两段代码区别就是pieceColorID在代码一种是类的成员变量,代码二种局部变量,在下边传入PiecesMove的方法中 第二段传入正确,第一段代码输出后始终未0, 这是什么原因啊 有区别的地方我用红色字体标记了
第一段代码里 pieceColorID 之所以一直是 0,是因为:
你把它挂在 Grid(格子)的 GridAndPieces 脚本上了;
ClickBlackPiece / ClickWhitePiece 只会改变 棋子对象上脚本里的 pieceColorID;
当你 ClickGrid 时,调用的是 格子上的脚本,它的 pieceColorID 根本没改过 → 默认就是 0。
而第二段代码直接在 ClickGrid 内部用 firstClickPiece 的名字来判断,不依赖格子的 pieceColorID,所以能得到正确结果。