Example #1
0
        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);
                    }
                }
            }
        }
Example #2
0
        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);
        }
Example #5
0
        /// <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));
            }
        }
Example #6
0
        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);
        }
Example #7
0
        /// <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);
        }
Example #8
0
        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);
        }