C# 如何在统一的十六进制网格中一次只选择一个平铺

C# 如何在统一的十六进制网格中一次只选择一个平铺,c#,unity3d,C#,Unity3d,正如标题所说!我正在制作一种文明型的城市建设者游戏,作为下学年的练习(只有一名二年级的视频游戏编程学生!) 我已经在游戏中生成了一个网格,看起来像: 正如你所看到的,我已经建立了一个基本的选择系统,目前我一次只能选择一个磁贴,直到我取消选择它,然后我可以选择一个新的磁贴。使用绑定到预置上的碰撞器的OnClick函数选择瓷砖。(最后将包括我目前拥有的代码!) 我想知道如何做的是,每当我选择一个新的磁贴时,自动取消选择一个磁贴,所以我一次只能选择一个磁贴 这就是我现在的选择 public void

正如标题所说!我正在制作一种文明型的城市建设者游戏,作为下学年的练习(只有一名二年级的视频游戏编程学生!)

我已经在游戏中生成了一个网格,看起来像:

正如你所看到的,我已经建立了一个基本的选择系统,目前我一次只能选择一个磁贴,直到我取消选择它,然后我可以选择一个新的磁贴。使用绑定到预置上的碰撞器的OnClick函数选择瓷砖。(最后将包括我目前拥有的代码!)

我想知道如何做的是,每当我选择一个新的磁贴时,自动取消选择一个磁贴,所以我一次只能选择一个磁贴

这就是我现在的选择

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;
}

您好!非常感谢您的回答。虽然我自己无法让它工作,但我相信我一定能够找到它!不过我确实找到了一个更简单的解决方案(至少对我来说):。只需发布它,这样,如果有人通过谷歌搜索找到它,他们就有了另一个选择!