public static void Init(DEM_Skill skillDem, DEM_Monster monDem)
        {
            // 初始化所有的怪物
            var monIdAndPosList = monDem.GetAllMonsterIdAndRespawnPosition();
            var netIdArr        = NetworkIdManager.s_instance.AssignNetworkId(monIdAndPosList.Count);
            var idAndPosList    = monDem.GetAllMonsterIdAndRespawnPosition();

            for (int i = 0; i < idAndPosList.Count; i++)
            {
                // 实例化 monster
                (DE_Unit, DE_MonsterData)deTuple;
                monDem.GetMonsterById(idAndPosList[i].Item1, out deTuple);
                E_Monster monster = new E_Monster();
                monster.Reset(netIdArr[i], idAndPosList[i].Item2, deTuple.Item1, deTuple.Item2);

                // monster
                EM_Monster.s_instance.AddMonster(monster);
                // 视野
                EM_Sight.s_instance.InitMonster(monster);
                // boss
                if (monster.m_MonsterType == MonsterType.BOSS || monster.m_MonsterType == MonsterType.FINAL_BOSS)
                {
                    EM_BossDamage.s_instance.AddBoss(monster.m_networkId);
                }
            }

            // 所有怪物技能
            var monEn = monDem.GetAllMonsterEn();

            while (monEn.MoveNext())
            {
                short            monId            = monEn.Current.Key;
                var              skillIdAndLvList = monEn.Current.Value.Item2.m_skillIdAndLevelList;
                E_MonsterSkill[] monSkillArr      = new E_MonsterSkill[skillIdAndLvList.Count];
                for (int i = 0; i < skillIdAndLvList.Count; i++)
                {
                    DE_Skill     skillDe;
                    DE_SkillData skillDataDe;
                    if (!skillDem.GetSkillByIdAndLevel(skillIdAndLvList[i].Item1, skillIdAndLvList[i].Item2, out skillDe, out skillDataDe))
                    {
                        continue;
                    }
                    monSkillArr[i] = new E_MonsterSkill(skillIdAndLvList[i].Item2, skillDe, skillDataDe);
                }
                EM_MonsterSkill.s_instance.SetMonsterSkill(monId, monSkillArr);
            }
        }
        public E_Skill[] InitCharacter(int netId, int charId)
        {
            E_Skill[] res;
            Dictionary <short, E_Skill> charSkillDict;

            // 若角色已经加载
            if (m_characterSkillDict.TryGetValue(netId, out charSkillDict))
            {
                res = new E_Skill[charSkillDict.Count];
                var en = charSkillDict.Values.GetEnumerator();
                var i  = 0;
                while (en.MoveNext())
                {
                    res[i] = en.Current;
                    i++;
                }
                return(res);
            }
            var ddoList = m_dds.GetSkillListByCharacterId(charId);

            res           = new E_Skill[ddoList.Count];
            charSkillDict = new Dictionary <short, E_Skill> ();
            for (int i = 0; i < ddoList.Count; i++)
            {
                DE_Skill     de;
                DE_SkillData dataDe;
                if (!m_dem.GetSkillByIdAndLevel(ddoList[i].m_skillId, ddoList[i].m_skillLevel, out de, out dataDe))
                {
                    continue;
                }
                E_Skill skillObj = m_skillPool.GetInstance();
                skillObj.Reset(de, dataDe, ddoList[i]);
                res[i] = skillObj;
                charSkillDict.Add(skillObj.m_SkillId, skillObj);
            }
            m_characterSkillDict[netId] = charSkillDict;
            return(res);
        }