public Chunk(Vector2Int index, GeneratorBehaviour generator) { _generator = generator; _bounds = new Bounds(new Vector3(index.x * _generator.GridSize.x, 0, index.y * _generator.GridSize.z) + _generator.GridSize / 2, _generator.GridSize); Target = new GameObject("Chunk " + index); _renderer = Target.AddComponent <MeshRenderer>(); _renderer.sharedMaterial = new Material(Shader.Find("Custom/SurfaceShader")); _filter = Target.AddComponent <MeshFilter>(); Target.transform.parent = _generator.transform; Target.transform.position = _bounds.min; Target.SetActive(false); _lodMeshes = new LODMesh[_generator.LodLevels.Length]; for (int i = 0; i < _generator.LodLevels.Length; i++) { _lodMeshes[i] = new LODMesh(_generator.LodLevels[i].Lod, UpdateTerrainChunk, _generator); } }
public void UpdateTerrainChunk() { if (!_mapDataReceived) { return; } float viewerDstFromNearestEdge = Mathf.Sqrt(_bounds.SqrDistance(_generator.ViewerPosition)); bool visible = viewerDstFromNearestEdge <= _generator.MaxViewDistance; if (visible) { int lodIndex = 0; for (int i = 0; i < _generator.LodLevels.Length - 1; i++) { if (!(viewerDstFromNearestEdge > _generator.LodLevels[i].DistanceThreshold)) { break; } lodIndex = i + 1; } if (lodIndex != _previousLodIndex) { LODMesh lodMesh = _lodMeshes[lodIndex]; if (lodMesh.HasMesh) { _previousLodIndex = lodIndex; _filter.mesh = lodMesh.Mesh; } else if (!lodMesh.HasRequestedMesh) { lodMesh.RequestMesh(_mapData); } } } Target.SetActive(visible); }