Exemplo n.º 1
0
 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);
 }
Exemplo n.º 2
0
    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);
                }
            }
        }
    }