private void LoadInSingleChunk(ChunkData data) { Debug.BeginDeepProfile("chunk_load"); //Initiate chunk Vec2i chunk = new Vec2i(data.X, data.Z); if (LoadedChunks.ContainsKey(chunk)) { return; } GameObject chunkObject = Instantiate(ResourceManager.ChunkPrefab); chunkObject.transform.parent = transform; chunkObject.name = "Chunk " + chunk; //LoadedChunk loadedChunk = chunkObject.AddComponent<LoadedChunk>(); LoadedChunk loadedChunk = chunkObject.GetComponent <LoadedChunk>(); ChunkData[] neigh = { GetChunk(chunk.x, chunk.z + 1), GetChunk(chunk.x + 1, chunk.z + 1), GetChunk(chunk.x + 1, chunk.z) }; //ChunkData[] neigh = { null, null, null }; loadedChunk.SetChunkData(data, neigh); LoadedChunks.Add(chunk, loadedChunk); GameManager.EntityManager.LoadChunk(World.ChunkBases[chunk.x, chunk.z], chunk); Debug.EndDeepProfile("chunk_load"); }
public void UnloadChunk(Vec2i chunk) { if (LoadedChunks.ContainsKey(chunk)) { LoadedChunk loaded = LoadedChunks[chunk]; LoadedChunks.Remove(chunk); GameManager.EntityManager.UnloadChunk(chunk); Destroy(loaded.gameObject); } }
private void LoadChunk(ChunkData c) { GameObject chunkObject = new GameObject(); //We create a new empty gameobject for the chunk chunkObject.transform.parent = transform; chunkObject.name = "Chunk " + c; LoadedChunk loadedChunk = chunkObject.AddComponent <LoadedChunk>(); loadedChunk.SetChunkData(c, new ChunkData[] { null, null, null }); }
/// <summary> /// Loads all chunks within a square of size 2*radius centred on the player /// </summary> /// <param name="middle"></param> /// <param name="radius"></param> public void LoadChunks(Vec2i middle, int radius, bool forceLoad) { LoadedChunksCentre = middle; //Create lists to hold chunks to load and unload List <Vec2i> toLoad = new List <Vec2i>((LoadChunkRadius * 2) * (LoadChunkRadius * 2)); toLoad.AddRange(ToLoad); List <Vec2i> toUnload = new List <Vec2i>(100); //Iterate all loaded chunks and add to to unload foreach (KeyValuePair <Vec2i, LoadedChunk> kvp in LoadedChunks) { toUnload.Add(kvp.Key); } for (int x = -radius; x <= radius; x++) { for (int z = -radius; z <= radius; z++) { if (x + middle.x < 0 || x + middle.x >= World.WorldSize - 1 || z + middle.z < 0 || z + middle.z >= World.WorldSize - 1) { continue; } Vec2i pos = new Vec2i(x + middle.x, z + middle.z); //If it is already loaed, remove it from the to remove if (toUnload.Contains(pos)) { toUnload.Remove(pos); } else if (!toLoad.Contains(pos)) { toLoad.Add(pos); } } } foreach (Vec2i v in toLoad) { if (LoadChunk(v, forceLoad)) { ToLoad.Remove(v); } } List <LoadedChunk> toUnloadChunks = new List <LoadedChunk>(20); foreach (Vec2i v in toUnload) { LoadedChunk lc = LoadedChunks[v]; LoadedChunks.Remove(v); Destroy(lc.gameObject); GameManager.EntityManager.UnloadChunk(v); } }
public void LoadSubworldChunks(Subworld sub) { UnloadAllChunks(); InSubworld = true; foreach (ChunkData c in sub.SubworldChunks) { int x = c.X; int z = c.Z; GameObject chunkObject = Instantiate(ResourceManager.ChunkPrefab);; //We create a new empty gameobject for the chunk chunkObject.transform.parent = transform; chunkObject.name = "sw" + sub.SubworldID + "_" + c.X + "_" + c.Z; LoadedChunk loadedChunk = chunkObject.AddComponent <LoadedChunk>(); ChunkData[] neigh = { sub.GetChunkSafe(x, z + 1), sub.GetChunkSafe(x + 1, z + 1), sub.GetChunkSafe(x + 1, z) }; loadedChunk.SetChunkData(c, neigh); SubworldChunks.Add(new Vec2i(x, z), loadedChunk); } }
/// <summary> /// Destroys the object at the given point /// TODO - make sure multi-tile objects are destroyed correctly. /// TODO - make sure objects with listeners (inventory that destroy on empty) have lsiteners removed correctly /// </summary> /// <param name="worldPos"></param> public void DestroyWorldObject(Vec2i worldPos) { Vec2i chunkPos = World.GetChunkPosition(worldPos); ChunkData c = CRManager.GetChunk(chunkPos); c.SetObject(worldPos.x, worldPos.z, null); //c.Objects[worldPos.x % World.ChunkSize, worldPos.z % World.ChunkSize] = null; LoadedChunk loaded = CRManager.GetLoadedChunk(chunkPos); Debug.Log("Destroy: " + worldPos); if (loaded != null) { if (loaded.LoadedWorldObjects[worldPos.x % World.ChunkSize, worldPos.z % World.ChunkSize] != null) { Destroy(loaded.LoadedWorldObjects[worldPos.x % World.ChunkSize, worldPos.z % World.ChunkSize].gameObject); loaded.LoadedWorldObjects[worldPos.x % World.ChunkSize, worldPos.z % World.ChunkSize] = null; } } }
/// <summary> /// Adds the given world object to the given world position. /// If the object is placed in a loaded chunk, then we load the object into the game /// </summary> /// <param name="worldPos"></param> /// <param name="worldObject"></param> public void AddNewObject(WorldObjectData worldObject) { //Get relevent chunk of object placement. Vec2i chunkPos = World.GetChunkPosition(worldObject.WorldPosition); ChunkData c = CRManager.GetChunk(chunkPos); Vec2i localPos = new Vec2i(worldObject.WorldPosition.x % World.ChunkSize, worldObject.WorldPosition.z % World.ChunkSize); c.SetObject(localPos.x, localPos.z, worldObject); //Check if the object has been added to a loaded chunk LoadedChunk loaded = CRManager.GetLoadedChunk(chunkPos); if (loaded != null) { WorldObject newObject = worldObject.CreateWorldObject(loaded.transform); loaded.LoadedWorldObjects[localPos.x, localPos.z] = newObject; } }