ChunkSystem.cs 2.5 KB

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