void PushChunkIntoCache(TerrianChunk chunk) { if (chunk == null) { return; } string chunkName = GetChunkName(chunk.chunkX, chunk.chunkZ); mCacheChunks[chunkName] = chunk; chunk.OnPushIntoCache(); }
TerrianChunk GetChunkInCache(string chunkName) { TerrianChunk chunk = null; if (mCacheChunks.TryGetValue(chunkName, out chunk)) { mCacheChunks.Remove(chunkName); chunk.OnGetFromCache(); } return(chunk); }
/// <summary> /// 当主控玩家位置改变时的处理 /// </summary> /// <param name="x"></param> /// <param name="z"></param> public void OnPlayerPosChanged(Vector3 playerPos, Action onLoadComplete = null) { int blockX = (int)(playerPos.x / WorldDef.BLOCK_SIZE); int blockZ = (int)(playerPos.z / WorldDef.BLOCK_SIZE); if (blockX == mPlayerBlockX && blockZ == mPlayerBlockZ) { return; } mPlayerBlockX = blockX; mPlayerBlockZ = blockZ; int chunkX = blockX / WorldDef.CHUNK_BLOCK_NUM; int chunkZ = blockZ / WorldDef.CHUNK_BLOCK_NUM; //检查玩家是否还在老的区块范围内,如果没有,则无需调整区块 if (chunkX == mPlayerChunkX && chunkZ == mPlayerChunkZ) { return; } Debug.LogFormat("player change chunk {0} {1}", chunkX, chunkZ); mPlayerChunkX = chunkX; mPlayerChunkZ = chunkZ; //玩家改变了当前所在的区块,则需要重新整理区块排列,加载新的区块 //先把当前区块放入缓存 for (int i = 0; i < mTerrianChunks.Length; i++) { PushChunkIntoCache(mTerrianChunks[i]); } mLoadingChunks.Clear(); mStartChunkX = chunkX - WorldDef.CHUNK_NUM / 2; mStartChunkZ = chunkZ - WorldDef.CHUNK_NUM / 2; for (int cz = mStartChunkZ; cz < mStartChunkZ + WorldDef.CHUNK_NUM; cz++) { for (int cx = mStartChunkX; cx < mStartChunkX + WorldDef.CHUNK_NUM; cx++) { int chunkIdx = (cz - mStartChunkZ) * WorldDef.CHUNK_NUM + cx - mStartChunkX; //尝试从缓存中寻找区块 string chunkName = GetChunkName(cx, cz); TerrianChunk chunk = GetChunkInCache(chunkName); if (chunk == null) { chunk = new TerrianChunk(cx, cz); //缓存也没有区块则新建一个区块 mLoadingChunks.Add(chunk); } //把新区块写入到该位置 mTerrianChunks[chunkIdx] = chunk; } } Loom.RunAsync(() => { ThreadLoadChunk(onLoadComplete); }); }