在上一章中,我们创建了地图块的Prefab,并完成了其相关的脚本。在最后一流了一个问题,就是HexGridChunk.Start方法中的hexMesh.Triangulate(cells);语句会报空引用的错误,这是因为地图块只创建了存放地图单元实例的数组,而这个数组是空的。创建地图单元实例的语句是在HexGrid中,我们需要做的就是将创建的地图单元实例添加到其对应的地图块数组中,而不是在HexGrid中设置其父级和进行三角构建。代码如下:
HexGrid.cs 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 private void CreateCell (int x, int z, int i ) { … HexCell cell; cells[i] = Instantiate<HexCell>(cellPrefab); cell = cells[i]; … Text label = Instantiate<Text>(cellLabelPrefab); … AddCellToChunk(x, z, cell); } private void AddCellToChunk (int x, int z, HexCell cell ) {}
我们可以通过地图单元在HexGrid.cells数组中的横纵坐标,计算出当前地图单元应该属于哪个地图块。代码如下:
HexGrid.cs 1 2 3 4 5 6 7 8 9 private void AddCellToChunk (int x, int z, HexCell cell ) { int chunkX = x / HexMetrics.chunkSizeX; int chunkZ = z / HexMetrics.chunkSizeZ; HexGridChunk chunk = chunks[chunkX + chunkZ * chunkCountX]; }
通过计算结果,我们还可以知道当前地图单元在其对应地图块数组中的下标。有了这个下标,我们就可以将当前地图单元实例分配到对应的地图块数组中了。代码如下:
HexGrid.cs 1 2 3 4 5 6 7 8 9 10 11 private void AddCellToChunk (int x, int z, HexCell cell ) { … int localX = x - chunkX * HexMetrics.chunkSizeX; int localZ = z - chunkZ * HexMetrics.chunkSizeZ; chunk.AddCell(localX + localZ * HexMetrics.chunkSizeX, cell); }
接着,我们回到HexGridChunk中,创建AddCell方法。这个方法负责将地图单元实例添加到自身数组中,并且设置地图单元及其UI的父节点。代码如下:
HexGridChunk.cs 1 2 3 4 5 6 7 8 9 10 11 12 13 14 public void AddCell (int index, HexCell cell ) { cells[index] = cell; cell.transform.SetParent(transform, false ); cell.uiRect.SetParent(gridCanvas.transform, false ); }
至此我们就完成了将地图单元实例分配到期对应地图块中的功能了。不过现在的代码还是有一些需要清理的地方,例如在HexGrid中依然有进行三角构建的的相关方法。在下一章中,我们要清理这些遗留的代码,让整个地图系统正常运行。
Github代码