Exemple #1
0
 /// <summary>
 /// 当Chunk远离摄像机, 停止更新并储存
 /// </summary>
 public IEnumerator ExitUpdate(Tilemap frontTilemap, Tilemap bkTilemap)
 {
     enableUpdate = false;
     foreach (BlockBase block in frontBlocks)
     {
         if (block != null)
         {
             block.ExitUpdate();
         }
     }
     foreach (BlockBase block in bkBlocks)
     {
         if (block != null)
         {
             block.ExitUpdate();
         }
     }
     for (int i = childObjects.Count - 1; i >= 0; i--)
     {
         IChunkObject child = childObjects[i];
         if (child != null)
         {
             child.ExitUpdate();
         }
         yield return(null);
     }
     Save();
 }
Exemple #2
0
        /// <summary>
        /// 更新管辖的所有Block, 以及GameObject, 用于经过一段时间后重新加载此区块.
        /// </summary>
        public IEnumerator EnterUpdate(Tilemap frontTilemap, Tilemap bkTilemap)
        {
            enableUpdate = true;
            foreach (BlockBase block in frontBlocks)
            {
                if (block != null)
                {
                    block.EnterUpdate();
                }
            }
            foreach (BlockBase block in bkBlocks)
            {
                if (block != null)
                {
                    block.EnterUpdate();
                }
            }
            for (int i = childObjects.Count - 1; i >= 0; i--)
            {
                IChunkObject child = childObjects[i];
                if (child != null)
                {
                    child.EnterUpdate();
                }
                yield return(null);
            }


            ShowAllBlockTiles(frontTilemap, bkTilemap);
            // 刷新一些东西出来
            ChunkFlash.Instance.FlashHere(this);
        }
Exemple #3
0
            public bool Generate(ChunkGenerateInfo info, out IChunkObject generated)
            {
                generated = null;
                float noise = Seed.GetNoise(info.maxPos, perlinScale, originIndex);

                if (noise < minLimit)
                {
                    return(false);
                }
                GameObject go = new GameObject(type.ToString());

                go.transform.position = new Vector3(info.maxPos.x + (info.maxValue - 0.4f) * 10, info.maxPos.y + (info.maxValue - 0.4f) * 5, 0);

                if (type == PlanetType.PLANET)
                {
                    generated = go.AddComponent <Planet>();
                    ((Planet)generated).GeneratePlanet(noise);
                }
                else if (type == PlanetType.SUN)
                {
                    generated = go.AddComponent <Sun>();
                    go.transform.localScale *= 20 * (noise * noise + 0.5f);
                }
                else if (type == PlanetType.BLACKHOLE)
                {
                    generated = go.AddComponent <BlackHole>();
                    go.transform.localScale *= 20 * (noise * noise + 0.5f);
                }
                return(true);
            }
Exemple #4
0
    // 分配一个 GameObject 到某个 Chunk
    public void AllotChunkChild(IChunkObject child)
    {
        Vector2    childPos       = child.GetPosition();
        Vector2Int worldPos       = FloorToVector2Int(childPos.x, childPos.y);
        Vector2Int chunkPos       = ToChunkPos(worldPos);
        Chunk      newParentChunk = GetChunk(chunkPos);

        newParentChunk.AddChild(child);
    }
Exemple #5
0
        // 检测Child GameObjects是否逃逸, 从列表删除逃逸的对象, 并返回逃逸的GameObject列表 (ChunkManager : 如果不在自己的范围, 就把它交给其他Chunk管理)
        public List <IChunkObject> CheckRunningChildren()
        {
            List <IChunkObject> outerChildren = new List <IChunkObject>();

            for (int i = childObjects.Count - 1; i >= 0; i--)
            {
                IChunkObject child = childObjects[i];
                //如果不包含这个GameObject, 就加入返回列表
                if (!CheckContain(child.GetPosition()))
                {
                    // 如果这个Chunk正在更新, 那么child物体退出更新
                    if (enableUpdate)
                    {
                        child.ExitUpdate();
                    }
                    childObjects.Remove(child);
                    outerChildren.Add(child);
                }
            }
            return(outerChildren);
        }
Exemple #6
0
 public void AddChild(IChunkObject child)
 {
     childObjects.Add(child);
     // 如果这个Chunk正在更新, 那么child物体进入更新
     child.EnterUpdate();
 }
Exemple #7
0
        public void fromSaveData(SaveData chunkData)
        {
            ChunkData data = (ChunkData)chunkData;

            this.childObjects = new List <IChunkObject>();
            this.frontBlocks  = new BlockBase[TILE_SIZE, TILE_SIZE];
            this.bkBlocks     = new BlockBase[TILE_SIZE, TILE_SIZE];

            this.childObjectIDs = data.childObjectIDs;
            this.frontBlockIDs  = data.frontBlockIDs;
            this.bkBlockIDs     = data.bkBlockIDs;
            this.position       = data.position.GetData();

            // 通过 ID 获得 CreatableSaveData , 然后创建Block
            for (int i = 0; i < TILE_SIZE; i++)
            {
                for (int j = 0; j < TILE_SIZE; j++)
                {
                    ID blockId = frontBlockIDs[i, j];
                    if (blockId == null)
                    {
                        continue;
                    }
                    SaveData originData = SaveManager.Instance.GetSaveData(blockId);
                    if (originData == null)
                    {
                        continue;
                    }
                    CreatableSaveData blockData = (CreatableSaveData)originData;
                    BlockBase         block     = blockData.Create <BlockBase>(blockId);
                    frontBlocks[i, j] = block;
                }
            }
            for (int i = 0; i < TILE_SIZE; i++)
            {
                for (int j = 0; j < TILE_SIZE; j++)
                {
                    ID blockId = bkBlockIDs[i, j];
                    if (blockId == null)
                    {
                        continue;
                    }
                    SaveData originData = SaveManager.Instance.GetSaveData(blockId);
                    if (originData == null)
                    {
                        continue;
                    }
                    CreatableSaveData blockData = (CreatableSaveData)originData;
                    BlockBase         block     = blockData.Create <BlockBase>(blockId);
                    bkBlocks[i, j] = block;
                }
            }
            // childObjects
            foreach (ID childID in childObjectIDs)
            {
                Debug.Log("加载ChunkObjects : " + childID.ToString());
                CreatableSaveData childData = (CreatableSaveData)SaveManager.Instance.GetSaveData(childID);
                if (childData == null)
                {
                    break;
                }
                IChunkObject child = childData.Create <IChunkObject>(childID);
                childObjects.Add(child);
            }
        }