修改按钮的prefab
双击Assets/Prefabs
里的MinesweeperButton.prefab
,在MinesweeperButton
下新建一个Text
组件,重命名为Number
,表示这个格子里显示的数字
选中这个Number对象,修改它的字体、字号、居中、字色等内容,文本内容删掉。尺寸也设置为30*30(否则会导致射线框过长,影响按钮点击效果)
在button中存储是否有雷的信息
打开MinesweeperButton.cs
,新增一个变量和对应函数表示这个格子里是否有雷,初始化为false表示没有雷
bool hasBomb = false;
public void SetHasBomb(bool _hasBomb)
{
hasBomb = _hasBomb;
}
public bool GetHasBomb()
{
return hasBomb;
}
判断周围格子是否有雷
打开GameLogic.cs
,为了方便查询周围的格子,首先我们要新建一个List来存储格子列表,然后在每次创建button之后将其塞进List,并设置它的HasBomb值
//新建List存放所有的按钮
List<GameObject> buttonList;
void InitMines(int _maxRow, int _maxCol)
{
bombList = GenerateRandomList(_maxRow * _maxCol, maxBomb);
//每次初始化时new一下这个List
buttonList = new List<GameObject>();
for (int i = 0; i < _maxRow; i++)
{
for (int j = 0; j < _maxCol; j++)
{
int _centerX = (int)(parentButtonPrefab.GetComponent<RectTransform>().rect.width / 2);
int _centerY = (int)(parentButtonPrefab.GetComponent<RectTransform>().rect.height / 2);
int _buttonSize = (int)(buttonPrefab.GetComponent<RectTransform>().rect.height);
Vector3 _pos = new Vector3(_centerX + (i - _maxRow / 2) * _buttonSize, _centerY + (j - _maxCol / 2) * _buttonSize);
GameObject _button = GameObject.Instantiate(buttonPrefab, _pos, Quaternion.identity, parentButtonPrefab.transform);
//将创建好的button塞进List里
buttonList.Add(_button);
//设置这个button所在的行和列
_button.GetComponent<MinesweeperButton>().SetRow(i);
_button.GetComponent<MinesweeperButton>().SetCol(j);
//设置这个按钮的有雷值
if (bombList.Contains(i * _maxCol + j))
{
_button.GetComponent<MinesweeperButton>().SetHasBomb(true);
}
_button.GetComponent<Button>().onClick.AddListener(
delegate{
ClickMine(_button);
}
);
}
}
}
在GameLogic.cs
新建一个函数用来取附近8个格子中的雷的数量
private int GetAroundBombNumber(int _row, int _col)
{
int result = 0;
for (int i = -1; i < 2; i++)
{
for (int j = -1; j < 2; j++)
{
int _nRow = _row + i;
int _nCol = _col + j;
if (i == 0 && j == 0) { continue; }
if ((_nRow < 0) || (_nCol < 0) || (_nRow > maxRow - 1) || (_nCol > maxCol - 1)) { continue; }
if (_nRow * _maxCol + _nCol < 0) { continue; }
if (buttonList[_nRow * _maxCol + _nCol].GetComponent<MinesweeperButton>().GetHasBomb()) { result++; }
}
}
return result;
}
修改ClickMine
函数,在点击格子时判断如果附近雷数量>0,则显示雷,如果附近没有雷,则将格子颜色变灰。代码如下
private void ClickMine(GameObject _button)
{
int _row = _button.GetComponent<MinesweeperButton>().GetRow();
int _col = _button.GetComponent<MinesweeperButton>().GetCol();
if (bombList.Contains(_row * _maxCol + _col))
{
_button.GetComponent<Image>().color = Color.red;
}
//这个格子本身没有雷的情况
else
{
int _aroundBombNumber = GetAroundBombNumber(_row, _col);
if (_aroundBombNumber > 0)
{
//附近有雷,显示雷的数量
_button.GetComponentInChildren<TextMeshProUGUI>().text = _aroundBombNumber.ToString();
}
else
{
//附近没有雷,格子变为灰色
_button.GetComponent<Image>().color = Color.gray;
}
}
}
运行效果如下:
下一篇:【unity】7.自适应按钮大小