ChunkSystem.cs 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. namespace KairoEngine.Chunks
  6. {
  7. public class ChunkSystem<TChunkBlock>
  8. {
  9. public Vector3Int chunkSize = new Vector3Int(16, 16, 16);
  10. public Dictionary<Vector3Int, Chunk<TChunkBlock>> chunks;
  11. public ChunkSystem(Vector3Int chunkSize, bool debug = false)
  12. {
  13. this.chunkSize = chunkSize;
  14. this.chunks = new Dictionary<Vector3Int, Chunk<TChunkBlock>>();
  15. }
  16. public void CreateChunk(Vector3Int position, Func<Chunk<TChunkBlock>, Vector3Int, TChunkBlock> createChunkBlock)
  17. {
  18. Chunk<TChunkBlock> chunk = new Chunk<TChunkBlock>(chunkSize, position, createChunkBlock);
  19. chunks.Add(position, chunk);
  20. }
  21. public TChunkBlock GetBlock(Vector3Int position)
  22. {
  23. Chunk<TChunkBlock> chunk = GetChunk(position);
  24. if(!chunk.isInitialized()) return default(TChunkBlock);
  25. Vector3Int pos = new Vector3Int();
  26. pos.x = position.x - (Mathf.FloorToInt(position.x / chunkSize.x ) * chunkSize.x);
  27. pos.y = position.y - (Mathf.FloorToInt(position.y / chunkSize.y ) * chunkSize.y);
  28. pos.z = position.z - (Mathf.FloorToInt(position.z / chunkSize.z ) * chunkSize.z);
  29. return chunk.GetBlock(pos);
  30. }
  31. public void SetBlock(Vector3Int position, TChunkBlock data)
  32. {
  33. Chunk<TChunkBlock> chunk = GetChunk(position);
  34. if(!chunk.isInitialized()) return;
  35. Vector3Int pos = new Vector3Int();
  36. pos.x = position.x - (Mathf.FloorToInt(position.x / chunkSize.x ) * chunkSize.x);
  37. pos.y = position.y - (Mathf.FloorToInt(position.y / chunkSize.y ) * chunkSize.y);
  38. pos.z = position.z - (Mathf.FloorToInt(position.z / chunkSize.z ) * chunkSize.z);
  39. chunk.SetBlock(pos, data);
  40. }
  41. public Chunk<TChunkBlock> GetChunk(Vector3Int position)
  42. {
  43. Vector3Int pos = new Vector3Int();
  44. pos.x = Mathf.FloorToInt(position.x / chunkSize.x ) * chunkSize.x;
  45. pos.y = Mathf.FloorToInt(position.y / chunkSize.y ) * chunkSize.y;
  46. pos.z = Mathf.FloorToInt(position.z / chunkSize.z ) * chunkSize.z;
  47. Chunk<TChunkBlock> chunk;
  48. chunks.TryGetValue(pos, out chunk);
  49. return chunk;
  50. }
  51. }
  52. }