void UpdateVisibleChunks() { HashSet <Vector2> alreadyUpdatedChunkCoords = new HashSet <Vector2> (); for (int i = visibleTerrainChunks.Count - 1; i >= 0; i--) { alreadyUpdatedChunkCoords.Add(visibleTerrainChunks [i].coord); visibleTerrainChunks [i].UpdateTerrainChunk(); } int currentChunkCoordX = Mathf.RoundToInt(viewerPosition.x / meshWorldSize); int currentChunkCoordY = Mathf.RoundToInt(viewerPosition.y / meshWorldSize); for (int yOffset = -chunksVisibleInViewDst; yOffset <= chunksVisibleInViewDst; yOffset++) { for (int xOffset = -chunksVisibleInViewDst; xOffset <= chunksVisibleInViewDst; xOffset++) { Vector2 viewedChunkCoord = new Vector2(currentChunkCoordX + xOffset, currentChunkCoordY + yOffset); if (!alreadyUpdatedChunkCoords.Contains(viewedChunkCoord)) { if (terrainChunkDictionary.ContainsKey(viewedChunkCoord)) { terrainChunkDictionary [viewedChunkCoord].UpdateTerrainChunk(); } else { TerrainChunk newChunk = new TerrainChunk(viewedChunkCoord, heightMapSettings, meshSettings, detailLevels, colliderLODIndex, transform, viewer, mapMaterial); terrainChunkDictionary.Add(viewedChunkCoord, newChunk); newChunk.onVisibilityChanged += OnTerrainChunkVisibilityChanged; newChunk.Load(); } } } } }
void OnTerrainChunkVisibilityChanged(TerrainChunk chunk, bool isVisible) { if (isVisible) { visibleTerrainChunks.Add(chunk); } else { visibleTerrainChunks.Remove(chunk); } }