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));
     }
 }