public Region createRegion(int x, int y, int z, bool isAsync) { Region region = new Region(); region.offsetX = x; region.offsetY = y; region.offsetZ = z; regions.Add(region.hashString(), region); loadedRegions += 1; RegionWatcher watcher = new RegionWatcher(region, x, y, z); unloaderQueue.Add(watcher); if (isAsync) { ThreadPool.QueueUserWorkItem(new WaitCallback(region.create), null); return(null); } else { Debug.LogWarning("**Non-async region create called**"); region.create(null); } return(region); }
IEnumerator UnloadRegions() { for (;;) { Debug.Log("Checking Regions"); RegionWatcher regionWatcher = unloaderQueue.Peek(); while (regionWatcher != null) { if (Time.realtimeSinceStartup - regionWatcher.timeSinceActive > 30) { unloaderQueue.Remove(); float distance = Vector3.Distance(clientRenderer.player.transform.position, new Vector3(regionWatcher.x * Region.regionXZ, regionWatcher.y * Region.regionY, regionWatcher.z * Region.regionXZ)); if (Math.Abs(distance) > unloadBlockDistance) { Debug.Log("Region:" + regionWatcher.x + "," + regionWatcher.y + "," + regionWatcher.z + " unloading."); destroyRegion(regionWatcher.region); } else { //update time stamp and put back in queue. regionWatcher.timeSinceActive += 30; unloaderQueue.Add(regionWatcher); } regionWatcher = unloaderQueue.Peek(); } else { //Nothing left to check. break; } } yield return(new WaitForSeconds(unloadTick)); } }