Пример #1
0
 public void GenerateStartingChunks()
 {
     int currentX = Mathf.RoundToInt(viewer.position.x / chunkSize.x);
     int currentY = Mathf.RoundToInt(viewer.position.y / chunkSize.y);
     int currentZ = Mathf.RoundToInt(viewer.position.z / chunkSize.z);
     int viewX = viewDist.x / 2;
     int viewY = viewDist.y / 2;
     int viewZ = viewDist.z / 2;
     for (int x = -viewX; x < viewX; x++)
     {
         for (int y = -viewY; y < viewY; y++)
         {
             for (int z = -viewZ; z < viewZ; z++)
             {
                 Vector3 chunkCoord = new Vector3(currentX + x, currentY + y, currentZ + z);
                 if (chunks.ContainsKey(chunkCoord))
                 {
                     chunks[chunkCoord].SetRemove(false);
                 }
                 else
                 {
                     Vector3 worldPosition = new Vector3(chunkCoord.x * chunkSize.x, chunkCoord.y * chunkSize.y, chunkCoord.z * chunkSize.z);
                     TerrainChunk chunk = new TerrainChunk(this, worldPosition, chunkSize, terrainMat);
                     chunk.ScheduleValueJob();
                     chunk.CompleteValueJob();
                     chunks.Add(chunkCoord, chunk);
                 }
             }
         }
     }
 }
Пример #2
0
    // Update is called once per frame
    public void UpdateChunks()
    {
        foreach(TerrainChunk chunk in chunks.Values)
        {
            chunk.SetRemove(true);
        }

        int currentX = Mathf.RoundToInt(viewer.position.x / chunkSize.x);
        int currentY = Mathf.RoundToInt(viewer.position.y / chunkSize.y);
        int currentZ = Mathf.RoundToInt(viewer.position.z / chunkSize.z);
        int viewX = viewDist.x / 2;
        int viewY = viewDist.y / 2;
        int viewZ = viewDist.z / 2;
        for(int x = -viewX; x < viewX; x++)
        {
            for (int y = -viewY; y < viewY; y++)
            {
                for (int z = -viewZ; z < viewZ; z++)
                {
                    Vector3 chunkCoord = new Vector3(currentX + x, currentY + y, currentZ + z);
                    if (chunks.ContainsKey(chunkCoord))
                    {
                        chunks[chunkCoord].SetRemove(false);
                    }
                    else
                    {
                        Vector3 worldPosition = new Vector3(chunkCoord.x * chunkSize.x, chunkCoord.y * chunkSize.y, chunkCoord.z * chunkSize.z);
                        TerrainChunk chunk = new TerrainChunk(this, worldPosition, chunkSize, terrainMat);
                        chunk.ScheduleValueJob();
                        chunks.Add(chunkCoord, chunk);
                    }
                }
            }
        }

        completeCountdown -= Time.deltaTime;
        if (completeCountdown < 0)
        {
            completeCountdown = completeTime;
            if (completePool.Count > 0)
            {
                TerrainChunk chunk = completePool.Dequeue();
                if (!chunk.removed)
                {
                    chunk.CompleteValueJob();
                }
                chunk.queued = false;
            }
        }

        Vector3[] keys = chunks.Keys.ToArray();
        foreach(Vector3 key in keys)
        {
            TerrainChunk chunk = chunks[key];
            if (chunk.ShouldRemove())
            {
                chunk.Remove();
                chunks.Remove(key);
            }
            else if (!chunk.queued && !chunk.IsGenerated() && chunk.IsValueJobComplete())
            {
                completePool.Enqueue(chunk);
                chunk.queued = true;
            }
        }
    }