/// <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(); }
/// <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); }
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); }
// 分配一个 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); }
// 检测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); }
public void AddChild(IChunkObject child) { childObjects.Add(child); // 如果这个Chunk正在更新, 那么child物体进入更新 child.EnterUpdate(); }
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); } }