Esempio n. 1
0
    /// <summary>
    /// Acutaliza la malla del game object de este chunk en función del LOD inficado como parametro
    /// </summary>
    /// <param name="lod"></param>
    private void UpdateMeshOfGameObject(int lod)
    {
        //obtengo la malla de ese LOD
        MeshWithLOD lodMesh = _meshLOD_Array[lod];

        if (lodMesh.ThereIsDataOfMeshStored)//Si ya tiene la malla almacenada se actualiza en el objeto de unity
        {
            _indexPreviousLOD = lod;
            _meshFilter.mesh  = lodMesh.DataOfMesh;
        }
        else if (!lodMesh.DataOfMeshHasBeenSolicit) //Si no tiene la malla almacenada se solitita la malla (Y tampoco se ha solicitado anteriormente)
        {
            lodMesh.SolicitDataOfMeshInExternalThread(_heightMapAndColorArray);
        }
    }
Esempio n. 2
0
    /// <summary>
    /// contructor de la clase Chunk
    /// </summary>
    /// <param name="coord"></param>
    /// <param name="size"></param>
    /// <param name="infoLOD_Array"></param>
    /// <param name="transformOfParent"></param>
    /// <param name="material"></param>
    /// <param name="generator"></param>
    public Chunk(Vector2 coord, int size, InfoLOD[] infoLOD_Array, Transform transformOfParent, Material material, ProceduralGenerator generator)
    {
        _position    = coord * size;
        _coordinates = coord;


        _infoLOD_Array    = infoLOD_Array;
        _generator        = generator;
        _chunkHasResource = false;

        //creación del objeto de Unity
        Vector3 posisiton3D = new Vector3(_position.x, 0, _position.y);

        _gameObject            = new GameObject("Chunk");
        _meshCollider          = _gameObject.AddComponent <MeshCollider>();
        _meshRenderer          = _gameObject.AddComponent <MeshRenderer>();
        _meshRenderer.material = material;
        _meshFilter            = _gameObject.AddComponent <MeshFilter>();

        _gameObject.transform.position   = posisiton3D * _generator.ScaleChunkSize;
        _gameObject.transform.parent     = transformOfParent;
        _gameObject.transform.localScale = new Vector3(1, 1, 1) * _generator.ScaleChunkSize;

        //no se quiere que se muestre desde el principio. más a delante se establece se se muestra o no.
        _gameObject.SetActive(false);


        _bounds = new Bounds(_position, new Vector2(1, 1) * size);


        _meshLOD_Array = new MeshWithLOD[infoLOD_Array.Length];
        for (int i = 0; i < infoLOD_Array.Length; i++)
        {
            _meshLOD_Array[i] = new MeshWithLOD(infoLOD_Array[i].LOD, UpdateThisChunk);
            if (infoLOD_Array[i].UseForCollide)
            {
                _meshForCollider = _meshLOD_Array[i];
            }
        }

        //Los dos primeros parametros son necesario spara el calculo de los mapas
        //El ultimo es la función que se va a ejecutar cuando se desencole dentro del hilo principal de Unity
        _generator.SolicitHeightMapAndColorArray(_coordinates, _position, applyTheHeightMapAndColorArrayToTheObject);
    }