Chunk Loading

Caves
This commit is contained in:
brausjonas
2022-05-16 23:00:47 +02:00
parent 04bb44a5c8
commit 6d9e1180fd
11 changed files with 168 additions and 47 deletions
@@ -57,7 +57,7 @@ Transform:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6443714940181712877}
m_LocalRotation: {x: -0.7071068, y: 0, z: 0, w: 0.7071068}
m_LocalPosition: {x: 0, y: -0.132, z: 0.024}
m_LocalPosition: {x: 0, y: -0.092, z: 0.024}
m_LocalScale: {x: 0.24999988, y: 0.24999988, z: 0.25}
m_Children: []
m_Father: {fileID: 4093383343133656141}
@@ -9,6 +9,7 @@ public class Chunk
private Material material;
private ChunkCoord chunkPosition;
private World world;
public bool active = false;
//rendering
public GameObject gameObject;
@@ -136,6 +137,17 @@ public class Chunk
meshFilter.mesh = mesh;
meshRenderer.material = material;
collider.sharedMesh = mesh;
active = true;
}
public void DestroyMesh()
{
meshFilter.mesh = null;
vertices.Clear();
triangles.Clear();
uv.Clear();
collider.sharedMesh = null;
active = false;
}
public void Edit(byte x, byte y, byte z, byte blockID)
@@ -6,6 +6,7 @@ public class Data
{
public static int chunkWidth = 15, chunkHeight = 250;
public static int textureAtlasSize = 16;
public static int viewDistance = 9;
public static readonly Vector3[] vertices =
{
@@ -277,10 +277,10 @@ public class Player : MonoBehaviour
private float CheckUpSpeed(float upSpeed)
{
if (
world.CheckBlock(new Vector3(transform.position.x - playerWidth, transform.position.y + upSpeed + 2f, transform.position.z - playerWidth)) ||
world.CheckBlock(new Vector3(transform.position.x + playerWidth, transform.position.y + upSpeed + 2f, transform.position.z - playerWidth)) ||
world.CheckBlock(new Vector3(transform.position.x + playerWidth, transform.position.y + upSpeed + 2f, transform.position.z + playerWidth)) ||
world.CheckBlock(new Vector3(transform.position.x - playerWidth, transform.position.y + upSpeed + 2f, transform.position.z + playerWidth))
world.CheckBlock(new Vector3(transform.position.x - playerWidth, transform.position.y + upSpeed + 1.9f, transform.position.z - playerWidth)) ||
world.CheckBlock(new Vector3(transform.position.x + playerWidth, transform.position.y + upSpeed + 1.9f, transform.position.z - playerWidth)) ||
world.CheckBlock(new Vector3(transform.position.x + playerWidth, transform.position.y + upSpeed + 1.9f, transform.position.z + playerWidth)) ||
world.CheckBlock(new Vector3(transform.position.x - playerWidth, transform.position.y + upSpeed + 1.9f, transform.position.z + playerWidth))
)
{
return 0;
+57 -7
View File
@@ -24,10 +24,12 @@ public class World : MonoBehaviour
[SerializeField] private Player player;
[SerializeField] private GameObject deadScreen;
[SerializeField] private GameObject pauseScreen;
private ChunkCoord lastPlayerChunkCoord = new ChunkCoord(0, 0);
//chunks
private Chunk[,] chunks;
private Queue<ChunkCoord> chunksToUpdate = new Queue<ChunkCoord>();
private List<Chunk> lastActiveChunks = new List<Chunk>();
//blocks
[SerializeField] public BlockData[] blockData;
@@ -54,6 +56,17 @@ public class World : MonoBehaviour
private void Update()
{
ChunkCoord playerChunkCoord = new ChunkCoord((int)(player.transform.position.x / Data.chunkWidth),
(int)(player.transform.position.z / Data.chunkWidth));
if (lastPlayerChunkCoord.x != playerChunkCoord.x || lastPlayerChunkCoord.z != playerChunkCoord.z)
{
LoadChunks(playerChunkCoord);
}
lastPlayerChunkCoord = new ChunkCoord((int)(player.transform.position.x / Data.chunkWidth),
(int)(player.transform.position.z / Data.chunkWidth));
//update 1 chunk in list
if (chunksToUpdate.Count > 0)
{
@@ -107,6 +120,41 @@ public class World : MonoBehaviour
}
}
private void LoadChunks(ChunkCoord playerChunk)
{
List<Chunk> checkList = new List<Chunk>();
for (int x = playerChunk.x - Data.viewDistance; x < playerChunk.x + Data.viewDistance; x++)
{
for (int z = playerChunk.z - Data.viewDistance; z < playerChunk.z + Data.viewDistance; z++)
{
if(chunks[x, z].gameObject == null)
{
chunks[x, z].Initialize();
chunks[x, z].gameObject.transform.SetParent(gameObject.transform);
}
if(!chunks[x, z].active)
{
chunksToUpdate.Enqueue(new ChunkCoord(x, z));
}
checkList.Add(chunks[x, z]);
}
}
foreach (Chunk c in lastActiveChunks)
{
if (!checkList.Contains(c))
{
c.DestroyMesh();
}
}
lastActiveChunks.Clear();
lastActiveChunks = new List<Chunk>(checkList);
}
//enqueue player position update to list
public void UpdatePlayerPosition(Vector3 position, byte id)
{
@@ -149,14 +197,14 @@ public class World : MonoBehaviour
//initialized the chunk objects
public void CreateChunks()
{
for (int x = 0; x < worldSize; x++)
for (int x = worldSize / 2 - Data.viewDistance; x < worldSize / 2 + Data.viewDistance; x++)
{
for (int z = 0; z < worldSize; z++)
for (int z = worldSize / 2 - Data.viewDistance; z < worldSize / 2 + Data.viewDistance; z++)
{
chunks[x, z].Initialize();
chunks[x, z].gameObject.transform.SetParent(gameObject.transform);
chunks[x, z].AddBlocks();
chunks[x, z].CreateMesh();
chunksToUpdate.Enqueue(new ChunkCoord(x, z));
lastActiveChunks.Add(chunks[x, z]);
}
}
}
@@ -213,11 +261,11 @@ public class World : MonoBehaviour
int zInChunk = z - (zChunk * Data.chunkWidth);
Chunk c = chunks[xChunk, zChunk];
for (int y = 0; y < Data.chunkHeight; y++)
for (int y = Data.chunkHeight - 1; y > 0; y--)
{
if (c.blocks[xInChunk, y, zInChunk] == 0)
if (c.blocks[xInChunk, y, zInChunk] != 0)
{
return (byte)(y - 1);
return (byte)(y + 1);
}
}
@@ -309,6 +357,8 @@ public class World : MonoBehaviour
Time.timeScale = 1;
player.transform.position = player.GetDefaultPlayerPosition();
deadScreen.SetActive(false);
LoadChunks(new ChunkCoord((int)(player.transform.position.x / Data.chunkWidth),
(int)(player.transform.position.z / Data.chunkWidth)));
}
public void ResumeButton()