Advertisement
Soifra

LoadChunks.cs

Apr 15th, 2017
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 11.06 KB | None | 0 0
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4.  
  5. public class LoadChunks : MonoBehaviour
  6. {
  7.     #region Values
  8.     int timer = 0;
  9.  
  10.     List<WorldPos> updateList = new List<WorldPos>();
  11.  
  12.     List<WorldPos> buildList = new List<WorldPos>();
  13.     #endregion
  14.  
  15.     #region Unity Functions
  16.     private void Update()
  17.     {
  18.         DelteChunks();
  19.         FindChunksToLoad();
  20.         LoadAndRenderChunks();
  21.     }
  22.     #endregion
  23.  
  24.     #region Functions
  25.     /// <summary>
  26.     /// An array of world positions spanning out from the world coords of 0, 0, 0
  27.     /// </summary>
  28.     #region Chunk Positions Array
  29.     private static WorldPos[] chunkPositions =
  30.         {
  31.                              new WorldPos( 0, 0,  0), new WorldPos(-1, 0,  0), new WorldPos( 0, 0, -1), new WorldPos( 0, 0,  1), new WorldPos( 1, 0,  0),
  32.                              new WorldPos(-1, 0, -1), new WorldPos(-1, 0,  1), new WorldPos( 1, 0, -1), new WorldPos( 1, 0,  1), new WorldPos(-2, 0,  0),
  33.                              new WorldPos( 0, 0, -2), new WorldPos( 0, 0,  2), new WorldPos( 2, 0,  0), new WorldPos(-2, 0, -1), new WorldPos(-2, 0,  1),
  34.                              new WorldPos(-1, 0, -2), new WorldPos(-1, 0,  2), new WorldPos( 1, 0, -2), new WorldPos( 1, 0,  2), new WorldPos( 2, 0, -1),
  35.                              new WorldPos( 2, 0,  1), new WorldPos(-2, 0, -2), new WorldPos(-2, 0,  2), new WorldPos( 2, 0, -2), new WorldPos( 2, 0,  2),
  36.                              new WorldPos(-3, 0,  0), new WorldPos( 0, 0, -3), new WorldPos( 0, 0,  3), new WorldPos( 3, 0,  0), new WorldPos(-3, 0, -1),
  37.                              new WorldPos(-3, 0,  1), new WorldPos(-1, 0, -3), new WorldPos(-1, 0,  3), new WorldPos( 1, 0, -3), new WorldPos( 1, 0,  3),
  38.                              new WorldPos( 3, 0, -1), new WorldPos( 3, 0,  1), new WorldPos(-3, 0, -2), new WorldPos(-3, 0,  2), new WorldPos(-2, 0, -3),
  39.                              new WorldPos(-2, 0,  3), new WorldPos( 2, 0, -3), new WorldPos( 2, 0,  3), new WorldPos( 3, 0, -2), new WorldPos( 3, 0,  2),
  40.                              new WorldPos(-4, 0,  0), new WorldPos( 0, 0, -4), new WorldPos( 0, 0,  4), new WorldPos( 4, 0,  0), new WorldPos(-4, 0, -1),
  41.                              new WorldPos(-4, 0,  1), new WorldPos(-1, 0, -4), new WorldPos(-1, 0,  4), new WorldPos( 1, 0, -4), new WorldPos( 1, 0,  4),
  42.                              new WorldPos( 4, 0, -1), new WorldPos( 4, 0,  1), new WorldPos(-3, 0, -3), new WorldPos(-3, 0,  3), new WorldPos( 3, 0, -3),
  43.                              new WorldPos( 3, 0,  3), new WorldPos(-4, 0, -2), new WorldPos(-4, 0,  2), new WorldPos(-2, 0, -4), new WorldPos(-2, 0,  4),
  44.                              new WorldPos( 2, 0, -4), new WorldPos( 2, 0,  4), new WorldPos( 4, 0, -2), new WorldPos( 4, 0,  2), new WorldPos(-5, 0,  0),
  45.                              new WorldPos(-4, 0, -3), new WorldPos(-4, 0,  3), new WorldPos(-3, 0, -4), new WorldPos(-3, 0,  4), new WorldPos( 0, 0, -5),
  46.                              new WorldPos( 0, 0,  5), new WorldPos( 3, 0, -4), new WorldPos( 3, 0,  4), new WorldPos( 4, 0, -3), new WorldPos( 4, 0,  3),
  47.                              new WorldPos( 5, 0,  0), new WorldPos(-5, 0, -1), new WorldPos(-5, 0,  1), new WorldPos(-1, 0, -5), new WorldPos(-1, 0,  5),
  48.                              new WorldPos( 1, 0, -5), new WorldPos( 1, 0,  5), new WorldPos( 5, 0, -1), new WorldPos( 5, 0,  1), new WorldPos(-5, 0, -2),
  49.                              new WorldPos(-5, 0,  2), new WorldPos(-2, 0, -5), new WorldPos(-2, 0,  5), new WorldPos( 2, 0, -5), new WorldPos( 2, 0,  5),
  50.                              new WorldPos( 5, 0, -2), new WorldPos( 5, 0,  2), new WorldPos(-4, 0, -4), new WorldPos(-4, 0,  4), new WorldPos( 4, 0, -4),
  51.                              new WorldPos( 4, 0,  4), new WorldPos(-5, 0, -3), new WorldPos(-5, 0,  3), new WorldPos(-3, 0, -5), new WorldPos(-3, 0,  5),
  52.                              new WorldPos( 3, 0, -5), new WorldPos( 3, 0,  5), new WorldPos( 5, 0, -3), new WorldPos( 5, 0,  3), new WorldPos(-6, 0,  0),
  53.                              new WorldPos( 0, 0, -6), new WorldPos( 0, 0,  6), new WorldPos( 6, 0,  0), new WorldPos(-6, 0, -1), new WorldPos(-6, 0,  1),
  54.                              new WorldPos(-1, 0, -6), new WorldPos(-1, 0,  6), new WorldPos( 1, 0, -6), new WorldPos( 1, 0,  6), new WorldPos( 6, 0, -1),
  55.                              new WorldPos( 6, 0,  1), new WorldPos(-6, 0, -2), new WorldPos(-6, 0,  2), new WorldPos(-2, 0, -6), new WorldPos(-2, 0,  6),
  56.                              new WorldPos( 2, 0, -6), new WorldPos( 2, 0,  6), new WorldPos( 6, 0, -2), new WorldPos( 6, 0,  2), new WorldPos(-5, 0, -4),
  57.                              new WorldPos(-5, 0,  4), new WorldPos(-4, 0, -5), new WorldPos(-4, 0,  5), new WorldPos( 4, 0, -5), new WorldPos( 4, 0,  5),
  58.                              new WorldPos( 5, 0, -4), new WorldPos( 5, 0,  4), new WorldPos(-6, 0, -3), new WorldPos(-6, 0,  3), new WorldPos(-3, 0, -6),
  59.                              new WorldPos(-3, 0,  6), new WorldPos( 3, 0, -6), new WorldPos( 3, 0,  6), new WorldPos( 6, 0, -3), new WorldPos( 6, 0,  3),
  60.                              new WorldPos(-7, 0,  0), new WorldPos( 0, 0, -7), new WorldPos( 0, 0,  7), new WorldPos( 7, 0,  0), new WorldPos(-7, 0, -1),
  61.                              new WorldPos(-7, 0,  1), new WorldPos(-5, 0, -5), new WorldPos(-5, 0,  5), new WorldPos(-1, 0, -7), new WorldPos(-1, 0,  7),
  62.                              new WorldPos( 1, 0, -7), new WorldPos( 1, 0,  7), new WorldPos( 5, 0, -5), new WorldPos( 5, 0,  5), new WorldPos( 7, 0, -1),
  63.                              new WorldPos( 7, 0,  1), new WorldPos(-6, 0, -4), new WorldPos(-6, 0,  4), new WorldPos(-4, 0, -6), new WorldPos(-4, 0,  6),
  64.                              new WorldPos( 4, 0, -6), new WorldPos( 4, 0,  6), new WorldPos( 6, 0, -4), new WorldPos( 6, 0,  4), new WorldPos(-7, 0, -2),
  65.                              new WorldPos(-7, 0,  2), new WorldPos(-2, 0, -7), new WorldPos(-2, 0,  7), new WorldPos( 2, 0, -7), new WorldPos( 2, 0,  7),
  66.                              new WorldPos( 7, 0, -2), new WorldPos( 7, 0,  2), new WorldPos(-7, 0, -3), new WorldPos(-7, 0,  3), new WorldPos(-3, 0, -7),
  67.                              new WorldPos(-3, 0,  7), new WorldPos( 3, 0, -7), new WorldPos( 3, 0,  7), new WorldPos( 7, 0, -3), new WorldPos( 7, 0,  3),
  68.                              new WorldPos(-6, 0, -5), new WorldPos(-6, 0,  5), new WorldPos(-5, 0, -6), new WorldPos(-5, 0,  6), new WorldPos( 5, 0, -6),
  69.                              new WorldPos( 5, 0,  6), new WorldPos( 6, 0, -5), new WorldPos( 6, 0,  5)
  70.     };
  71.     #endregion
  72.  
  73.     /// <summary>
  74.     /// Finds chunks that need to be loaded relative to the players position
  75.     /// </summary>
  76.     private void FindChunksToLoad()
  77.     {
  78.         // Get the position of this gameobject to generate around
  79.         WorldPos playerPos = new WorldPos
  80.             (
  81.                 Mathf.FloorToInt(transform.position.x / Chunk.chunkSize) * Chunk.chunkSize,
  82.                 Mathf.FloorToInt(transform.position.y / Chunk.chunkSize) * Chunk.chunkSize,
  83.                 Mathf.FloorToInt(transform.position.z / Chunk.chunkSize) * Chunk.chunkSize
  84.             );
  85.  
  86.         // If there aren't already chunks to generate
  87.         if (buildList.Count == 0)
  88.         {
  89.             // Cycle through the array of positions
  90.             for (int i = 0; i < chunkPositions.Length; i++)
  91.             {
  92.                 // Translate the player position and array position into chunk position
  93.                 WorldPos newChunkPos = new WorldPos
  94.                 (
  95.                     chunkPositions[i].x * Chunk.chunkSize + playerPos.x,
  96.                     0,
  97.                     chunkPositions[i].z * Chunk.chunkSize + playerPos.z
  98.                 );
  99.  
  100.                 // Get the chunk in the defined position
  101.                 Chunk newChunk = world.GetChunk
  102.                 (
  103.                     newChunkPos.x,
  104.                     newChunkPos.y,
  105.                     newChunkPos.z
  106.                 );
  107.  
  108.                 // If the chunk already exists and it's already
  109.                 // rendered or in queue to be rendered continue
  110.                 if (newChunk != null
  111.                     && (newChunk.rendered || updateList.Contains(newChunkPos)))
  112.                     continue;
  113.  
  114.                 // Load a column of chunks in this position
  115.                 for (int y = -4; y < 4; y++)
  116.                 {
  117.                     buildList.Add
  118.                         (
  119.                             new WorldPos
  120.                         (
  121.                             newChunkPos.x,
  122.                             y * Chunk.chunkSize,
  123.                             newChunkPos.z
  124.                         ));
  125.                 }
  126.                 return;
  127.             }
  128.         }
  129.     }
  130.  
  131.     /// <summary>
  132.     /// Handles the building of chunks that are within render distance and populates the updateList
  133.     /// </summary>
  134.     /// <param name="pos"></param>
  135.     private void BuildChunk(WorldPos pos)
  136.     {
  137.         for (int y = pos.y - Chunk.chunkSize; y <= pos.y + Chunk.chunkSize; y += Chunk.chunkSize)
  138.         {
  139.             if (y > 64 || y < -64)
  140.                 continue;
  141.             for (int x = pos.x - Chunk.chunkSize; x <= pos.y + Chunk.chunkSize; x += Chunk.chunkSize)
  142.             {
  143.                 for (int z = pos.z - Chunk.chunkSize; z <= pos.z + Chunk.chunkSize; z += Chunk.chunkSize)
  144.                 {
  145.                     if (world.GetChunk(x, y, z) == null)
  146.                         world.CreateChunk(x, y, z);
  147.                 }
  148.             }
  149.         }
  150.         updateList.Add(pos);
  151.     }
  152.  
  153.     /// <summary>
  154.     /// Handles the chunks within the update list and renders/loads them if not already rendered/loaded
  155.     /// </summary>
  156.     private void LoadAndRenderChunks()
  157.     {
  158.         for (int i = 0; i < 4; i++)
  159.         {
  160.             if (buildList.Count != 0)
  161.             {
  162.                 BuildChunk(buildList[0]);
  163.                 buildList.RemoveAt(0);
  164.             }
  165.         }
  166.         for (int i = 0; i < updateList.Count; i++)
  167.         {
  168.             Chunk chunk = world.GetChunk(updateList[0].x, updateList[0].y, updateList[0].z);
  169.             if (chunk != null)
  170.                 chunk.update = true;
  171.             updateList.RemoveAt(0);
  172.         }
  173.     }
  174.  
  175.     /// <summary>
  176.     /// Every 10 frames checks the distance to the gameobject and if it is over 256 adds it to a list of chunks to delete
  177.     /// </summary>
  178.     private void DelteChunks()
  179.     {
  180.         if (timer == 10)
  181.         {
  182.             var chunksToDelete = new List<WorldPos>();
  183.             foreach (var chunk in world.chunks)
  184.             {
  185.                 float distance = Vector3.Distance(
  186.                     new Vector3(chunk.Value.pos.x, 0, chunk.Value.pos.z),
  187.                     new Vector3(transform.position.x, 0, transform.position.z));
  188.                 if (distance > 256)
  189.                     chunksToDelete.Add(chunk.Key);
  190.             }
  191.             foreach (var chunk in chunksToDelete)
  192.                 world.DestroyChunk(chunk.x, chunk.y, chunk.z);
  193.             timer = 0;
  194.         }
  195.         timer++;
  196.     }
  197.     #endregion
  198. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement