ChunkSystem.cs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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 Vector3 voxelSize = new Vector3(1f, 1f, 1f);
  12. public Dictionary<Vector3Int, Chunk<TChunkBlock>> chunks;
  13. public List<Vector3> chunkList = new List<Vector3>();
  14. public ChunkSystem(Vector3Int chunkSize, Vector3 voxelSize, bool debug = false)
  15. {
  16. this.chunkSize = chunkSize;
  17. this.voxelSize = voxelSize;
  18. this.chunks = new Dictionary<Vector3Int, Chunk<TChunkBlock>>();
  19. }
  20. public void CreateChunk(Vector3 globalPosition, Vector3Int position, Func<Chunk<TChunkBlock>, Vector3Int, TChunkBlock> createChunkBlock)
  21. {
  22. Chunk<TChunkBlock> chunk = new Chunk<TChunkBlock>(chunkSize, globalPosition, position, createChunkBlock);
  23. chunks.Add(position, chunk);
  24. chunkList.Add(globalPosition);
  25. }
  26. public Vector3Int GetVoxelFromPosition(Vector3 position, Chunk<TChunkBlock> chunk)
  27. {
  28. Vector3 voxelPos = new Vector3();
  29. voxelPos = position - chunk.globalPosition;
  30. // voxelPos.x = position.x - (Mathf.Floor(position.x / chunkSize.x * voxelSize.x) * chunkSize.x * voxelSize.x);
  31. // voxelPos.y = position.y - (Mathf.Floor(position.y / chunkSize.y * voxelSize.y) * chunkSize.y * voxelSize.y);
  32. // voxelPos.z = position.z - (Mathf.Floor(position.z / chunkSize.z * voxelSize.z) * chunkSize.z * voxelSize.z);
  33. voxelPos = new Vector3(voxelPos.x / voxelSize.x, voxelPos.y / voxelSize.y, voxelPos.z / voxelSize.z);
  34. //voxelPos = new Vector3(voxelPos.x + 0.1f, voxelPos.y + 0.1f, voxelPos.z + 0.1f);
  35. Vector3Int pos = new Vector3Int(Mathf.RoundToInt(voxelPos.x), Mathf.RoundToInt(voxelPos.y), Mathf.RoundToInt(voxelPos.z));
  36. if(pos.x >= chunkSize.x || pos.y >= chunkSize.y || pos.z >= chunkSize.z) Debug.LogError($"Position is out of chunk bounds ({pos} | {position} | {chunk.position})");
  37. pos = new Vector3Int(Mathf.Clamp(pos.x, 0, chunkSize.x - 1), Mathf.Clamp(pos.y, 0, chunkSize.y - 1), Mathf.Clamp(pos.z, 0, chunkSize.z - 1));
  38. return pos;
  39. }
  40. public TChunkBlock GetBlock(Vector3 position)
  41. {
  42. Chunk<TChunkBlock> chunk = GetChunk(position);
  43. if(!chunk.isInitialized()) return default(TChunkBlock);
  44. return chunk.GetBlock(GetVoxelFromPosition(position, chunk));
  45. }
  46. public void SetBlock(Vector3 position, TChunkBlock data)
  47. {
  48. Chunk<TChunkBlock> chunk = GetChunk(position);
  49. if(!chunk.isInitialized()) return;
  50. Vector3Int pos = GetVoxelFromPosition(position, chunk);
  51. if(pos.x >= chunkSize.x || pos.y >= chunkSize.y || pos.z >= chunkSize.z) return;
  52. chunk.SetBlock(pos, data);
  53. }
  54. public Chunk<TChunkBlock> GetChunk(Vector3 position)
  55. {
  56. // Vector3Int pos = new Vector3Int();
  57. // pos.x = Mathf.FloorToInt(position.x / chunkSize.x ) * chunkSize.x;
  58. // pos.y = Mathf.FloorToInt(position.y / chunkSize.y ) * chunkSize.y;
  59. // pos.z = Mathf.FloorToInt(position.z / chunkSize.z ) * chunkSize.z;
  60. // Vector3Int pos = new Vector3Int();
  61. // pos.x = Mathf.FloorToInt(position.x / chunkSize.x * voxelSize.x ) * chunkSize.x;
  62. // pos.y = Mathf.FloorToInt(position.y / chunkSize.y * voxelSize.y) * chunkSize.y;
  63. // pos.z = Mathf.FloorToInt(position.z / chunkSize.z * voxelSize.z) * chunkSize.z;
  64. Vector3 pos = new Vector3(position.x / voxelSize.x, position.y / voxelSize.y, position.z / voxelSize.z);
  65. Vector3Int chunkPos = new Vector3Int();
  66. chunkPos.x = Mathf.FloorToInt(pos.x / chunkSize.x ) * chunkSize.x;
  67. chunkPos.y = Mathf.FloorToInt(pos.y / chunkSize.y ) * chunkSize.y;
  68. chunkPos.z = Mathf.FloorToInt(pos.z / chunkSize.z ) * chunkSize.z;
  69. //Vector3Int chunkPos = new Vector3Int(Mathf.RoundToInt(pos.x), Mathf.RoundToInt(pos.y), Mathf.RoundToInt(pos.z));
  70. Chunk<TChunkBlock> chunk;
  71. //if(!chunks.TryGetValue(chunkPos, out chunk)) Debug.LogWarning($"Chunk not found for position {chunkPos}");
  72. chunks.TryGetValue(chunkPos, out chunk);
  73. return chunk;
  74. }
  75. }
  76. }