如何使用字典在网格中获得点位置?

问题描述 投票:1回答:2

有人能帮我吗?我为我的电路板制作了一个网格。当我试图在棋盘中获得方块的Point位置时,控制台仅返回(0,0)。

这是我的点代码:

public struct Point 
{
    public int X {get; set;}
    public int Y {get; set;}

    public Point(int x, int y){
        this.X = x;
        this.Y = y;

    }


}   

这是脚本,其中每个方块在实例化时在网格中获得一个点:

public Point GridPosition { get; set; }


public void Setup(Point gridPos, Vector3 worldPos)
{
    this.GridPosition = gridPos;
    transform.position = worldPos;
}

private void OnMouseDown(){

    Debug.Log (GridPosition.X + ", "+ GridPosition.Y );

}    

这是我的主要脚本与词典部分:

public static Dictionary<Point,Grid> Tiles { get; set; }

void Start()
{
    CreateLevel ();
}

void CreateLevel()
{

    Tiles = new Dictionary<Point,Grid> ();
}

private void PlaceTilesColliders(Vector3 tileStart, float tileOffset){

    for (int y = 0; y < 8; y++) 
    {
        for (int x = 0; x < 8; x++) 
        {

            TileCollider.GetComponent<Grid> ().Setup (new Point (x, y), new Vector3 (tileStart.x + (tileOffset * x), tileStart.y - (tileOffset * y), 0));

            Tiles.Add (new Point (x, y), Instantiate(TileCollider).GetComponent<Grid>());


        }
    }  
}     

所以,控制台每次返回(0,0),无论点击哪个方块都无关紧要。有人能解释我如何在网格中获得正方形的真正点位置吗?

dictionary unity3d grid point
2个回答
0
投票

avariant对他们的答案基本上是正确的,但我想指出你的代码实际在做什么以及为什么你得到你正在获得的价值。

让我们看看这个循环:

for (int y = 0; y < 8; y++)  {
    for (int x = 0; x < 8; x++)  {
        TileCollider.GetComponent<Grid> ().Setup (new Point (x, y), new Vector3 (tileStart.x + (tileOffset * x), tileStart.y - (tileOffset * y), 0));
        Tiles.Add (new Point (x, y), Instantiate(TileCollider).GetComponent<Grid>());
    }
} 

我们遍历Y和X(这很好),然后我们调用TileCollider.GetComponent<Grid> ()。等等,等一下,TileCollider?这是什么?这不能是我们在场景中的文件之一,我们没有使用我们的X和Y坐标来从场景中获取GameObject来获取此引用...

这意味着我们对它做的任何事情对我们游戏世界中的瓷砖都没有影响!并且因为引用没有更新,我们不断更新它的值到新的X和Y位置,覆盖我们已经完成的任何事情并且没有任何影响。

哎呀。

这就是为什么avariant说你需要调用Instantiate并创建一个新的tile,然后从该GameObject获取组件并在其上调用Setup()


1
投票

首先尝试Instantiate,然后配置生成的新Grid并添加到字典中。

for (int y = 0; y < 8; y++) 
    {
        for (int x = 0; x < 8; x++) 
        {

            GameObject newGrid = Instantiate(TileCollider);
            newGrid.GetComponent<Grid>().Setup(new Point (x, y), new Vector3 (tileStart.x + (tileOffset * x), tileStart.y - (tileOffset * y), 0));

            Tiles.Add(new Point (x, y), newGrid.GetComponent<Grid>());
        }
    } 

不过,我建议您注意养育,因为现在实例化的对象没有父对象。

© www.soinside.com 2019 - 2024. All rights reserved.