这是我的要点代码:
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),无论点击哪个方块都无关紧要。 有人能解释我如何在网格中获得正方形的真正点位置吗?
答案 0 :(得分:1)
首先尝试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>());
}
}
我建议你注意养育子女,因为现在实例化的对象没有父母。
答案 1 :(得分: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()
。