/// <summary> /// 初始AttackNpc数据; /// </summary> /// <returns></returns> void InitAttackNpc(AttackNpcSpawnData spawnData) { AttackNpcData attackNpcData = DataManager.s_AttackNpcDataManager.GetData(spawnData.AttackNpcID); if (attackNpcData == null) { return; } AttackNpc attackNpc = new AttackNpc(spawnData.AttackNpcID); if (attackNpc != null) { m_AttackNpcDic.Add(spawnData.ID, attackNpc); } }
/// <summary> /// 创建AttackNpc; /// </summary> /// <returns></returns> public void CreateAttackNpc(AttackNpcSpawnData spawnData) { if (spawnData == null) { return; } AttackNpcData attackNpcData = DataManager.s_AttackNpcDataManager.GetData(spawnData.AttackNpcID); if (attackNpcData == null) { return; } AttackNpc attackNpc = m_AttackNpcDic [spawnData.ID]; Quaternion rotate = Quaternion.Euler(new Vector3(0, spawnData.Orient * Mathf.Rad2Deg, 0)); GameObject prefab = ResourcesManager.Instance.LoadUnitObject(attackNpcData.Model, UNIT_TYPE.ATTACK_NPC); GameObject npcobj = GameObject.Instantiate(prefab) as GameObject; npcobj.transform.position = spawnData.Position; npcobj.transform.rotation = rotate; UnityEngine.AI.NavMeshAgent agent = npcobj.AddComponent <UnityEngine.AI.NavMeshAgent> (); agent.speed = 0; agent.acceleration = 0; agent.angularSpeed = 0; //agent.avoidancePriority = agent.height = attackNpcData.Height; agent.radius = attackNpcData.Radius; agent.stoppingDistance = 0.5f; CharacterController collider = npcobj.AddComponent <CharacterController> (); collider.height = attackNpcData.Height; collider.radius = attackNpcData.Radius; collider.center = Vector3.up * Mathf.Max(collider.height / 2.0f, collider.radius); npcobj.SetLayerRecursively(LayerMask.NameToLayer("AttackNpc")); AttackNpcController controller = npcobj.AddComponent <AttackNpcController> (); m_AttackNpcControllerDic.Add(spawnData.ID, controller); controller.CurCombatUnit = attackNpc; controller.PatrolRadius = spawnData.PatrolRadius; }
/// <summary> /// 加载NPC数据; /// </summary> public void LoadBattleData() { m_BattleDataDic = new Dictionary <int, BattleData>(); string textAsset = ResourcesManager.Instance.LoadConfigXML(COMMDEF.XML_BATTLE_TEXT).text; XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(textAsset); XmlNode datas = xmlDoc.SelectSingleNode("BattleDatas"); XmlNodeList list = datas.ChildNodes; if (list == null || list.Count < 1) { return; } foreach (XmlNode node in list) { XmlElement element = node as XmlElement; if (!element.Name.Equals("BattleData")) { continue; } BattleData info = new BattleData(); info.ID = CommonHelper.Str2Int(element.GetAttribute("ID")); info.Name = element.GetAttribute("Name"); info.SceneId = CommonHelper.Str2Int(element.GetAttribute("SceneId")); XmlNodeList data = element.ChildNodes; if (data == null || data.Count < 1) { continue; } foreach (XmlNode subNode in data) { XmlElement subElement = subNode as XmlElement; if (subElement.Name.Equals("WarriorSpawnData")) { XmlNodeList spawnDatas = subElement.ChildNodes; if (spawnDatas == null || spawnDatas.Count < 1) { continue; } foreach (XmlNode ssubNode in spawnDatas) { XmlElement ssubElement = ssubNode as XmlElement; if (ssubElement.Name.Equals("WarriorSpawnPos")) { WarriorSpawnPos spawnPos = new WarriorSpawnPos(); float subx = CommonHelper.Str2Float(ssubElement.GetAttribute("PosX")); float suby = CommonHelper.Str2Float(ssubElement.GetAttribute("PosY")); float subz = CommonHelper.Str2Float(ssubElement.GetAttribute("PosZ")); spawnPos.Position = new Vector3(subx, suby, subz); spawnPos.Orient = CommonHelper.Str2Float(ssubElement.GetAttribute("Orient")); //加入npc信息 if (info.WarriorSpawnList == null) { info.WarriorSpawnList = new List <WarriorSpawnPos>(); } info.WarriorSpawnList.Add(spawnPos); } } } else if (subElement.Name.Equals("AttackNpcWaveData")) { XmlNodeList npcWave = subElement.ChildNodes; if (npcWave == null || npcWave.Count < 1) { continue; } if (info.AttackNpcSpawnWaveList == null) { info.AttackNpcSpawnWaveList = new List <AttackNpcSpawnWave>(); } AttackNpcSpawnWave wave = new AttackNpcSpawnWave(); wave.SpawnTime = CommonHelper.Str2Float(subElement.GetAttribute("SpawnTime")); foreach (XmlNode ssubNode in npcWave) { XmlElement ssubElement = ssubNode as XmlElement; if (ssubElement.Name.Equals("AttackNpcSpawnData")) { AttackNpcSpawnData spawnData = new AttackNpcSpawnData(); spawnData.ID = CommonHelper.Str2Int(ssubElement.GetAttribute("ID")); spawnData.AttackNpcID = CommonHelper.Str2Int(ssubElement.GetAttribute("AttackNpcID")); float subx = CommonHelper.Str2Float(ssubElement.GetAttribute("PosX")); float suby = CommonHelper.Str2Float(ssubElement.GetAttribute("PosY")); float subz = CommonHelper.Str2Float(ssubElement.GetAttribute("PosZ")); spawnData.Position = new Vector3(subx, suby, subz); spawnData.Orient = CommonHelper.Str2Float(ssubElement.GetAttribute("Orient")); spawnData.PatrolRadius = CommonHelper.Str2Float(ssubElement.GetAttribute("PatrolRadius")); spawnData.AI = CommonHelper.Str2Int(ssubElement.GetAttribute("AI")); wave.AttackNpcSpawnList.Add(spawnData); } } info.AttackNpcSpawnWaveList.Add(wave); } } info.AttackNpcSpawnWaveList.Sort(delegate(AttackNpcSpawnWave a, AttackNpcSpawnWave b) { return(a.SpawnTime.CompareTo(b.SpawnTime)); }); //加入副本信息 if (!m_BattleDataDic.ContainsKey(info.ID)) { m_BattleDataDic.Add(info.ID, info); } } }