Пример #1
0
    void PushChunkIntoCache(TerrianChunk chunk)
    {
        if (chunk == null)
        {
            return;
        }

        string chunkName = GetChunkName(chunk.chunkX, chunk.chunkZ);

        mCacheChunks[chunkName] = chunk;
        chunk.OnPushIntoCache();
    }
Пример #2
0
    TerrianChunk GetChunkInCache(string chunkName)
    {
        TerrianChunk chunk = null;

        if (mCacheChunks.TryGetValue(chunkName, out chunk))
        {
            mCacheChunks.Remove(chunkName);
            chunk.OnGetFromCache();
        }

        return(chunk);
    }
Пример #3
0
    /// <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);
        });
    }