コード例 #1
0
        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);
            }
        }
コード例 #2
0
        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);
        }