// Internal version of RequestChunkUnloading without ChunkOperations. This is called by UnloadChunkOperation public void _RequestChunkUnloading(List <Vector3Int> chunkPositions, ChunkLoader requester) { // If no positions passed, ignore if (chunkPositions == null || chunkPositions.Count == 0) { return; } foreach (Vector3Int chunkPosition in chunkPositions) { // Check that this request exists and that the chunk loader has actually requested it previously if (chunkLoadingRequests.ContainsKey(chunkPosition) && chunkLoadingRequests[chunkPosition].Contains(requester)) { // Remove the chunk from the requests list chunkLoadingRequests[chunkPosition].Remove(requester); // If this chunk is no longer requested by any chunk loader, remove it entirely. if (chunkLoadingRequests[chunkPosition].Count == 0) { chunkLoadingRequests.Remove(chunkPosition); } } } /** * Note: This does not unload the chunk immediately because there is no need. * The ProcessOperation() method will see that this chunk is being used and keep track of it in its "chunksUsed" list. * Once no other chunk loader/operation requires it, it will unload the chunk. */ }
// Internal version of RequestChunkUnloading without ChunkOperations. This is called by UnloadChunkOperation public async Task _RequestChunkLoading(List <Vector3Int> chunkPositions, ChunkLoader requester) { // If no positions passed, ignore if (chunkPositions == null || chunkPositions.Count == 0) { return; } foreach (Vector3Int chunkPosition in chunkPositions) { // Add it the requester to the list if (chunkLoadingRequests.ContainsKey(chunkPosition)) { // Make sure that this requester did not already ask for this chunk to be loaded if (!chunkLoadingRequests[chunkPosition].Contains(requester)) { chunkLoadingRequests[chunkPosition].Add(requester); } } else { chunkLoadingRequests.Add(chunkPosition, new List <ChunkLoader> { requester }); } } // Actually load the chunk into the chunks list await GetOrCreateChunk(chunkPositions); }
/// <summary> /// Request the unloading of multiple chunks. /// This will not fail if the chunks weren't loaded in the first place. /// </summary> /// <param name="chunkPositions">The positions at which to unload the chunks from.</param> /// <param name="requester">The ChunkLoader that requested this.</param> public async Task RequestChunkUnloading(List <Vector3Int> chunkPositions, ChunkLoader requester) { if (debugMode) { Debug.Log("Requesting for chunks " + chunkPositions.ToStringFlattened() + " to unload."); } await AddChunkOperation(new UnloadChunkOperation(chunkPositions, requester)); }
public UnloadChunkOperation(List <Vector3Int> chunkPositions, ChunkLoader requester) : base("unload", chunkPositions) { Requester = requester; }