/// <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); } }
/// <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); }