C# 如何在统一的十六进制网格中一次只选择一个平铺
正如标题所说!我正在制作一种文明型的城市建设者游戏,作为下学年的练习(只有一名二年级的视频游戏编程学生!) 我已经在游戏中生成了一个网格,看起来像: 正如你所看到的,我已经建立了一个基本的选择系统,目前我一次只能选择一个磁贴,直到我取消选择它,然后我可以选择一个新的磁贴。使用绑定到预置上的碰撞器的OnClick函数选择瓷砖。(最后将包括我目前拥有的代码!) 我想知道如何做的是,每当我选择一个新的磁贴时,自动取消选择一个磁贴,所以我一次只能选择一个磁贴 这就是我现在的选择C# 如何在统一的十六进制网格中一次只选择一个平铺,c#,unity3d,C#,Unity3d,正如标题所说!我正在制作一种文明型的城市建设者游戏,作为下学年的练习(只有一名二年级的视频游戏编程学生!) 我已经在游戏中生成了一个网格,看起来像: 正如你所看到的,我已经建立了一个基本的选择系统,目前我一次只能选择一个磁贴,直到我取消选择它,然后我可以选择一个新的磁贴。使用绑定到预置上的碰撞器的OnClick函数选择瓷砖。(最后将包括我目前拥有的代码!) 我想知道如何做的是,每当我选择一个新的磁贴时,自动取消选择一个磁贴,所以我一次只能选择一个磁贴 这就是我现在的选择 public void
public void OnMouseDown() {
if (GameManager.Instance.tileSelected == false) {
if (enabled == false) {
tileOutlineSprite.SetActive (true);
enabled = true;
GameManager.Instance.tileSelected = true;
this.tileInfo.text = tileType;
}
}
else if (enabled == true) {
tileOutlineSprite.SetActive (false);
enabled = false;
GameManager.Instance.tileSelected = false;
this.tileInfo.text = " ";
}
}
这就是我目前用来生成网格的东西!我知道这可能是一个小混乱,现在,我正计划清理和完善它,因为我继续
void generateMap() {
map = new List<List<TileSelect>>(); //generatign the playing field, making a grid of tile prefabs, and storing their positiosn in a 2d list
for (int i = 0; i < mapSizeX; i++) {
List <TileSelect> row = new List<TileSelect>();
for (int j = 0; j < mapSizeY; j++) {
if (i == 0) {
iDiff = 0.8f;
}
if (j % 2 == 0) {
iDiff = i + (.2f * (i+1));
} else if (i != 0) {
iDiff = i + 0.6f + (.2f * (i+1));
}
jDiff = j + (.04f * j);
int rand = Random.Range (1, 101);
if (rand <= 45) {
TileSelect tile = ((GameObject)Instantiate (HeavyForestTile, new Vector3 (iDiff, jDiff, 0), Quaternion.Euler (new Vector3 ()))).GetComponent<TileSelect> ();
tile.gridPosition = new Vector2 (i, j);
tile.tileType = "Heavy Forest";
tile.GetComponent<TileSelect> ().tileInfo = GameObject.Find ("InfoText").GetComponent<Text>();
row.Add (tile);
} else if (rand >= 45 && rand <= 70) {
TileSelect tile = ((GameObject)Instantiate (LightForestTile, new Vector3 (iDiff, jDiff, 0), Quaternion.Euler (new Vector3 ()))).GetComponent<TileSelect> ();
tile.gridPosition = new Vector2 (i, j);
tile.tileType = "Light Forest";
tile.GetComponent<TileSelect> ().tileInfo = GameObject.Find ("InfoText").GetComponent<Text>();
row.Add (tile);
} else if (rand >= 70 && rand <= 90 ) {
TileSelect tile = ((GameObject)Instantiate (GrassTile, new Vector3 (iDiff, jDiff, 0), Quaternion.Euler (new Vector3 ()))).GetComponent<TileSelect> ();
tile.gridPosition = new Vector2 (i, j);
tile.tileType = "Grassland";
tile.GetComponent<TileSelect> ().tileInfo = GameObject.Find ("InfoText").GetComponent<Text>();
row.Add (tile);
} else if (rand >= 90 && rand <= 97) {
TileSelect tile = ((GameObject)Instantiate (GrassRockTile, new Vector3 (iDiff, jDiff, 0), Quaternion.Euler (new Vector3 ()))).GetComponent<TileSelect> ();
tile.gridPosition = new Vector2 (i, j);
tile.tileType = "Light Rocks";
tile.GetComponent<TileSelect> ().tileInfo = GameObject.Find ("InfoText").GetComponent<Text>();
row.Add (tile);
} else if (rand >= 97 && rand <= 100) {
TileSelect tile = ((GameObject)Instantiate (GrassRock2Tile, new Vector3 (iDiff, jDiff, 0), Quaternion.Euler (new Vector3 ()))).GetComponent<TileSelect> ();
tile.gridPosition = new Vector2 (i, j);
tile.tileType = "Heavy Rocks";
tile.GetComponent<TileSelect> ().tileInfo = GameObject.Find ("InfoText").GetComponent<Text>();
row.Add (tile);
}
}
map.Add(row);
}
void generateMap(){
map=new List();//生成游戏场,制作一个网格的瓷砖预制件,并将其位置存储在二维列表中
对于(int i=0;i 如果(rand=45&&rand=70&&rand=90&&rand=97&&rand一个简单的方法是向游戏管理器类添加一个额外的成员:
public class GameManager
{
TileSelect _selectedTile;
public TileSelect selectedTile
{
get { return _selectedTile; }
set
{
//unhighlight the previous selected tile
_selectedTile = value;
//highlight the newly selected tile
}
}
...
}
包括一个设置器,以便每次更改选定的互动程序时,它都会取消高亮显示选定的互动程序并高亮显示新选定的互动程序
单击选定的互动程序时,只需更改它:
void onClick(...)
{
...
//on raycast hit with the 2d tile (targetTile)
gameManager.selectedTile = targetTile;
}
您好!非常感谢您的回答。虽然我自己无法让它工作,但我相信我一定能够找到它!不过我确实找到了一个更简单的解决方案(至少对我来说):。只需发布它,这样,如果有人通过谷歌搜索找到它,他们就有了另一个选择!