代码之家  ›  专栏  ›  技术社区  ›  Fan4i

如何使用字典获取网格中的点位置?

  •  1
  • Fan4i  · 技术社区  · 7 年前

    有人能帮我吗? 我为我的板做了一个网格。当我试图获取板中正方形的点位置时,console只返回(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),不管单击哪个方块。 有人能告诉我如何在网格中得到正方形的真实点位置吗?

    2 回复  |  直到 7 年前
        1
  •  1
  •   avariant elf    7 年前

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

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

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

        2
  •  0
  •   Draco18s no longer trusts SE    7 年前

    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坐标 取来 从场景中获取此引用的游戏对象。。。

    这意味着 我们对它所做的任何事情都不会对游戏世界中的瓷砖产生影响! 由于引用没有更新,我们不断地将其值更新到新的X和Y位置,覆盖了我们已经做过的事情,对任何事情都没有影响。

    哎呀。

    这就是为什么avariant说你需要打电话 Instantiate 并创建一个新的互动程序,然后从该游戏对象中获取组件并调用 Setup() 在上面。