public void UpdateTerrainChunk() { if (_hasReceivedMapData) { float _distanceFromNearEdge = Mathf.Sqrt(_bounds.SqrDistance(viewerPosition)); bool _isVisible = _distanceFromNearEdge <= maxViewDistance; if (_isVisible) { int _lodIndex = 0; for (int i = 0; i < _detailLevels.Length - 1; i++) { if (_distanceFromNearEdge > _detailLevels[i].distanceThreashold) { _lodIndex = i + 1; } else { break; } } if (_lodIndex != _previousLodIndex) { LODetail _lodMesh = _meshLod[_lodIndex]; if (_lodMesh.hasMesh) { _meshFilter.mesh = _lodMesh.mesh; _previousLodIndex = _lodIndex; } else if (!_lodMesh.hasRequestedMesh) { _lodMesh.RequestMesh(_mapData); } } } SetVisible(_isVisible); } }
public MapChunk(Vector2 _coordinates, int _size, LODInfo[] _lodLevels, Transform _parent, Material _material) { _positionV2 = _coordinates * _size; _bounds = new Bounds(_positionV2, Vector2.one * _size); Vector3 _positionV3 = new Vector3(_positionV2.x, 0, _positionV2.y); _detailLevels = _lodLevels; _go = new GameObject("Terrain Chunk"); _meshRenderer = _go.AddComponent <MeshRenderer>(); _meshFilter = _go.AddComponent <MeshFilter>(); _meshRenderer.material = _material; _go.transform.position = _positionV3; _go.transform.parent = _parent; SetVisible(false); _meshLod = new LODetail[_detailLevels.Length]; for (int i = 0; i < _detailLevels.Length; i++) { _meshLod[i] = new LODetail(_detailLevels[i].lod, UpdateTerrainChunk); } _generator.RequestMapData(_positionV2, OnMapDataReceived); }