public void BuildMap() { if (m_MapViewer == null) { m_MapViewer = GetComponent <MapViewer>(); if (m_MapViewer == null) { m_MapViewer = gameObject.AddComponent <MapViewer_Full>(); } m_ArchiveFile = new MapArchiveFile(config); m_MapViewer.InitMapViewer(m_ArchiveFile, map_root); } ClearMap(); map_data = GenerateTileMapData(); for (int y = 0; y < config.tile_size_x; y++) { for (int x = 0; x < config.tile_size_y; x++) { int index = SharedUtil.PointHash(x, y); TilePrefabConfig tpc = config.GetTilePrefabConfig(map_data[index]); if (tpc != null) { m_MapViewer.SpawnTileMapAt(x, y, config.grid_size, map_root, tpc); } } } }
override public void ShowMapAt(int center_x, int center_y) { TileMapBaseConfig config = m_ArchiveFile.GetConfigFile <TileMapBaseConfig>(); if (config != null) { TilePrefabConfig tpc = null; for (int y = 0; y < config.height; y++) { for (int x = 0; x < config.width; x++) { tpc = config.GetTilePrefabConfig(m_ArchiveFile[x * config.width + y]); if (tpc != null) { SpawnTileMapAt( x, y, m_Config.grid_size, m_MapRoot, tpc); } } } } }
private void DeadOrAlive(bool execute_in_editor = false) { m_KillingList.Clear(); foreach (var key in m_DyingCells.Keys) { if (m_KillingList.Count <= maxDestroyPerFrame || execute_in_editor) { m_KillingList.Add(key); } else { break; } } for (int i = 0; i < m_KillingList.Count; i++) { int index = m_KillingList[i]; GameObject gobj = m_ActiveCells[index]; if (gobj != null) { m_ResourceLoader.RecycleGameObject(gobj); } m_ActiveCells.Remove(index); m_DyingCells.Remove(index); } m_BirthList.Clear(); foreach (int key in m_SpawningCells.Keys) { if (m_BirthList.Count < maxCreatePerFrame || execute_in_editor) { m_BirthList.Add(key); } else { break; } } TilePrefabConfig tpc = null; for (int i = 0; i < m_BirthList.Count; i++) { int key = m_BirthList[i]; tpc = m_Config.GetTilePrefabConfig(m_ArchiveFile[key]); if (tpc != null) { m_ActiveCells[key] = SpawnTileMapAt( m_SpawningCells[key].x, m_SpawningCells[key].y, m_Config.grid_size, m_MapRoot, tpc); } m_SpawningCells.Remove(key); } }
public GameObject GetTileObject(TilePrefabConfig config) { System.Text.StringBuilder sb = new System.Text.StringBuilder(); sb.AppendFormat("{0}/{1}", config.prefab_path, config.group_name); Object obj = Resources.Load(sb.ToString()); GameObject gobj = GameObject.Instantiate(obj as GameObject); return(gobj); }
/// <summary> /// 如果一开始的操作不够流畅,那么在加载场景的时候,就要考虑预缓存一部分prefab了。 /// 具体的算法可以读取配置文件,或者统计每种资源的场上个数来确定。 /// 这个函数也可以在“idle”状态的时候被调用,开始自动Balancing算法来缓慢的优化pool的构成。 /// 这是更进一步的算法,目前还用不到。 /// /// 典型的空间换时间算法,考虑到Tile的单个内存占用量比较小,所以并不会太费。 /// 注意权衡:如果Tile是带Collider的,那么需要权衡是为Tile加上Kinematic的刚体划算(初步分析还是这个划算) /// ,还是直接Spawn一个新的划算。因为移动不带刚体的Collider也是非常耗的…… /// /// </summary> /// <param name="config"></param> /// <param name="warm_up_count"></param> public void WarmUpFor(TilePrefabConfig config, int warm_up_count) { //注册新的 if (m_PrefabPool.ContainsKey(config.group_name) == false) { m_PrefabPool[config.group_name] = new List <GameObject>(); } for (int i = 0; i < warm_up_count; i++) { //直接生成一个并走回收流程,简单粗暴!这样一操作,对象池里就增加了一个备胎。 RecycleGameObject(GetTileObject(config)); } }
private void AddTilePrefabConfig(TilePrefabConfig config) { if (config == null) { return; } List <TilePrefabConfig> theme_item = null; if (prefab_index.TryGetValue(config.group_name, out theme_item) == false) { theme_item = new List <TilePrefabConfig>(); prefab_index[config.group_name] = theme_item; } theme_item.Add(config); }
/// <summary> /// 用名字来建立Prefab pool 的索引 /// </summary> /// <param name="config"></param> /// <returns></returns> public GameObject GetTileObject(TilePrefabConfig config) { System.Text.StringBuilder sb = new System.Text.StringBuilder(); sb.AppendFormat("{0}/{1}", config.prefab_path, config.group_name); GameObject new_game_object = null; if (m_PrefabPool.TryGetValue(config.group_name, out pPrefabPoolProbe) && pPrefabPoolProbe.Count > 0) { new_game_object = pPrefabPoolProbe[pPrefabPoolProbe.Count - 1]; pPrefabPoolProbe.RemoveAt(pPrefabPoolProbe.Count - 1); } else { Object obj = GetObject(sb.ToString()); if (obj != null) { new_game_object = GameObject.Instantiate(obj as GameObject); new_game_object.name = config.group_name; } } return(new_game_object); }
public GameObject SpawnTileMapAt(int x, int y, float grid_size, Transform parent, TilePrefabConfig prefab_config, float override_height = -99999999) { GameObject gobj = m_ResourceLoader.GetTileObject(prefab_config); if (gobj != null) { Transform trans = gobj.transform; trans.SetParent(parent); trans.localPosition = new Vector3(x * grid_size, (override_height > -99999999 ? override_height : prefab_config.vertical_height), y * grid_size); if (prefab_config.random_direction) { trans.localEulerAngles = random_orienation; } else { trans.localEulerAngles = Vector3.zero; } } return(gobj); }