如何在Unity的十六进制网格中一次只选择一个贴图

本文关键字:选择 一次 一个 十六进制 网格 Unity | 更新日期: 2023-09-27 18:04:54

如标题所示!我正在制作一款《文明》类型的城市建造游戏,作为即将到来的学年的练习(游戏邦注:我只是一名二年级电子游戏编程专业的学生!)

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

!

正如你所看到的,我已经设置了一个基本的选择系统,其中目前我一次只能选择一个贴图,直到我取消选择它,然后我可以选择一个新的贴图。使用与预制件上的碰撞器绑定的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);
    }

哦!而且游戏是2d的,如果这对解决方案很重要的话!让我知道,如果你需要更多的信息,我很乐意提供它!

如何在Unity的十六进制网格中一次只选择一个贴图

一个简单的方法是在你的游戏管理器类中添加一个额外的成员:

public class GameManager
{
    TileSelect _selectedTile;
    public TileSelect selectedTile
    {
        get { return _selectedTile; }
        set 
        {  
            //unhighlight the previous selected tile
            _selectedTile = value;
            //highlight the newly selected tile
        }
    }
    ...
}

包含一个setter,这样每当您更改选定的tile时,它会取消选中的tile并突出显示新选中的tile。

简单地改变选定的瓷砖,当它被点击:

void onClick(...)
{
    ...
    //on raycast hit with the 2d tile (targetTile)
    gameManager.selectedTile = targetTile;
}