public CloudsChunk TryGetCloudsChunk(int x, int y, int z) { for (int idx = 0; idx < cloudsChunkMap.Count; idx++) { CloudsChunk chunk = cloudsChunkMap[idx]; if (x < chunk.transform.position.x || z < chunk.transform.position.z || x >= chunk.transform.position.x + chunkSize.x || z >= chunk.transform.position.z + chunkSize.z) { continue; } return(chunk); } return(null); }
void Update() { if (randomize) { noiseScale = Random.Range(32, 128); noiseOffset = Random.insideUnitSphere * noiseScale * noiseScale; for (int idx = 0; idx < chunkMap.Count; idx++) { Chunk chunk = chunkMap[idx]; StartCoroutine(chunk.GenerateChunk()); } randomize = false; return; } Vector3 ppos = player.position; t_chunckUpdateTime += Time.deltaTime; for (int idx = 0; idx < chunkMap.Count; idx++) { Chunk chunk = chunkMap[idx]; CloudsChunk cloudsChunk = cloudsChunkMap[idx]; Vector2 biPlayerPos = new Vector2(player.position.x, player.position.z); Vector2 biChunkPos = new Vector2(chunk.transform.position.x, chunk.transform.position.z); bool activeChunk = Vector3.Distance(biPlayerPos, biChunkPos) <= playerFOV.magnitude; chunk.gameObject.SetActive(activeChunk); if (activeChunk) { chunk.gameObject.SetActive(true); } else { if (chunk.CoroutinesRunning == 0) { chunk.gameObject.SetActive(false); } } // utopia if (activeChunk && t_chunckUpdateTime >= chunckUpdateTime && chunk.CoroutinesRunning == 0) { StartCoroutine(chunk.RefreshMap()); } } if (t_chunckUpdateTime >= chunckUpdateTime) { Chunk chunk = TryGetChunk(ppos); if (chunk != null) { StartCoroutine(chunk.RefreshMap()); } t_chunckUpdateTime = 0.0f; } for (float x = ppos.x - playerFOV.x; x < ppos.x + playerFOV.x; x += chunkSize.x) { for (float z = ppos.z - playerFOV.y; z < ppos.z + playerFOV.y; z += chunkSize.z) { Vector3 idxpos = new Vector3(x, 0, z); Chunk chunk = TryGetChunk(idxpos); CloudsChunk cloudsChunk = TryGetCloudsChunk(idxpos); if (chunk == null) { int xGridCoord = Mathf.FloorToInt(x / chunkSize.x) * chunkSize.x; int zGridCoord = Mathf.FloorToInt(z / chunkSize.z) * chunkSize.z; var instance = Instantiate(chunkPrefab, new Vector3(xGridCoord, 0, zGridCoord), Quaternion.identity).GetComponent <Chunk>(); instance.transform.SetParent(transform); chunkMap.Add(instance); } if (cloudsChunk == null) { int xGridCoord = Mathf.FloorToInt(x / chunkSize.x) * chunkSize.x; int zGridCoord = Mathf.FloorToInt(z / chunkSize.z) * chunkSize.z; var instance = Instantiate(cloudsChunkPrefab, new Vector3(xGridCoord, cloudsHeight, zGridCoord), Quaternion.identity).GetComponent <CloudsChunk>(); instance.transform.SetParent(transform); cloudsChunkMap.Add(instance); } } } }