using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityGameFramework.Runtime; using GameFramework.Event; using BattleDefine; /// /// 描述: /// 作者:WJ /// public class AIManager : MonoBehaviour { /// /// 单键 /// private static AIManager m_Instance; /// /// 刷怪点MO /// private Dictionary mPointMos = new Dictionary(); /// /// 近战攻击角色 /// private List mNearAttackRoles = new List(); /// /// 远程攻击角色 /// private List mFarAttackRoles = new List(); private List mAreaLocks = new List(); /// /// 当前所在刷怪点索引 /// public int mCurPoint = 0; public Transform playerPoint; /// /// 检测朝玩家移动 /// private bool mCheckMoveToPlayer = true; /// /// 单键 /// public static AIManager Instance { get { if (m_Instance == null) { m_Instance = GameObject.Find("AIManager").AddComponent(); } return m_Instance; } } /// /// 初始化 /// public void Init() { mPointMos.Clear(); // 关卡数据 sm_gate gateMo = sm_gate.GetMoById(GameDateManager.Instance.GateID); // 出生点 playerPoint = this.transform.Find("Area1/0"); // 刷怪点数据 List levels = gateMo.GetMonsterLevels(); for (int i = 0; i < levels.Count; i++) { Transform tran = transform.Find("Area1/" + (i + 1).ToString()); if (tran) { WJBirthPointMo pointMO = new WJBirthPointMo(); pointMO.point = i + 1; pointMO.pointTran = tran; pointMO.monsters = levels[i].GetMonsterList(); pointMO.bossID = levels[i].boss1; if(tran.CompareTag("NoRandom")) { pointMO.randomPos = false; } mPointMos.Add(i + 1, pointMO); } } // 创建怪物 switch((EBattleSceneType)int.Parse(gateMo.battleType)) { case EBattleSceneType.EBattleType_Default: while (CreateNextPointMonster(Vector3.zero)) { } break; case EBattleSceneType.EBattleType_Boss: CreatPointMonster(1, Vector3.zero); break; case EBattleSceneType.EBattleType_Guide: CreatPointMonster(1, Vector3.zero); break; case EBattleSceneType.EBattleType_Arena: break; case EBattleSceneType.EBattleType_Safe: break; } } public Transform GetPlayerCreatePoint() { return GameObject.Find("AIManager/Area1/0").transform; } public Transform GetPointMOByIndex(int index) { return playerPoint; } /// /// 创建怪物点 /// public bool CreatPointMonster(int point, Vector3 livePos) { if (mPointMos.ContainsKey(point)) { mCurPoint = point; // 怪物 for (int i = 0; i < mPointMos[point].monsters.Count; i++) { if (livePos == Vector3.zero) { livePos = mPointMos[point].pointTran.position; } float radius = mPointMos[point].randomDis; // 在出生位置小范围随机 if (mPointMos[point].randomPos) { livePos += new Vector3(Random.Range(-radius, radius), 0, Random.Range(-radius, radius)); } //if (mPointMos[point].monsters[i].heroId == mPointMos[point].bossID) //{ // RoleManager.Instance.CreateMonster(point, mPointMos[point].monsters[i], null, livePos, livePos, radius, true); //} //else //{ // RoleManager.Instance.CreateMonster(point, mPointMos[point].monsters[i], null, livePos, livePos, radius, false); //} } EventComponent nowEvent = GameEntry.GetComponent(); nowEvent.FireNow(this, new NoviceEventSpawnerIndex(point)); mCheckMoveToPlayer = true; return true; } return false; } /// /// 获取场景所有怪物数量 /// /// public int GetMonsterMaxNumber() { int nodeIndex = 1; int maxNumber = 0; foreach (var item in mPointMos) { maxNumber += GetPointMonsterNumber(nodeIndex); } return maxNumber; } /// /// 获取单一出生点 怪物数量 /// /// /// public int GetPointMonsterNumber(int point) { int number = 0; if (mPointMos.ContainsKey(point)) { number += mPointMos[point].monsters.Count; } return number; } /// /// 创建下一个怪物点 /// /// 是否创建成功 public bool CreateNextPointMonster(Vector3 livePos) { mCurPoint++; if (mPointMos.ContainsKey(mCurPoint)) { // 解除区域限制 RemoveAreaLockCmpt(mCurPoint); return CreatPointMonster(mCurPoint, livePos); } return false; } /// /// 添加禁止区域 /// /// public void AddAreaLockCmpt(SceneEventAreaLockLogic al) { mAreaLocks.Add(al); } public SceneEventAreaLockLogic GetAreaLockCmpt(int id) { foreach(var item in mAreaLocks) { if(item.areaIndex == id) { return item; } } return null; } /// /// 移除禁止区域 /// /// public void RemoveAreaLockCmpt(int index) { foreach(var item in mAreaLocks) { if(item.areaIndex == index) { item.AreaUnlock(); mAreaLocks.Remove(item); UI_TipsWindow.InitFloatWaringDialog("前方结界屏障已消失,可以通行!"); break; } } } } /// /// 怪物出生点MO /// public class WJBirthPointMo { /// /// 怪物 /// public List monsters; /// /// BOSS ID /// public int bossID = 0; /// /// 出生点 /// public int point = 0; /// /// 是否小范围随机 /// public bool randomPos = true; /// /// 随机的距离 /// public float randomDis = 5.0f; /// /// 点坐标 /// public Transform pointTran = null; }