public override IEnumerator RunLogic() { while (!m_Quit) { if (m_Ctrl.Model.CurHp > 0) { if (!m_Ctrl.IsMoving) { m_Ctrl.Move(((MinionCtrl)m_Ctrl).EndPoint); } // 检测攻击目标 if (m_Ctrl.Target == null || m_Ctrl.Target.Model == null || m_Ctrl.Target.Model.CurHp <= 0) { AIBaseCtrl target = m_Radar.FindRecentlyEnemy(); if (target != null) { m_Ctrl.Target = target; m_Ctrl.ChangeState(AIStateEnum.ATTACK); } } } yield return(null); } }
public override void OnOperationResponse(OperationResponse response) { // 获取修改的数据 DtoHero[] heros = JsonMapper.ToObject <DtoHero[]>(response[(byte)ParameterCode.HerosArray] as string); // 更新数据 for (int i = 0; i < heros.Length; i++) { DtoHero hero = heros[i]; AIBaseCtrl ctrl = BattleData.Instance.CtrlDict.ExTryGet(hero.Id); if (ctrl == null) { return; } ctrl.Model = hero; // 更新自己的数据 if (ctrl.Model.Id == GameData.HeroData.Id) { GameData.HeroData = hero; (UIManager.Instance.GetPanel(UIPanelType.Battle) as BattlePanel).UpdateView(); } } // 自己获得金币 int heroId = (int)response[(byte)ParameterCode.HeroId]; if (heroId == GameData.HeroData.Id) { // 金币音效 SoundManager.Instance.PlayEffectMusic(Paths.UI_BUY); } }
/// <summary> /// 创建小兵 /// </summary> /// <param name="minion"></param> public void CreateMinion(params object[] args) { DtoMinion minion = (DtoMinion)args[0]; // 创建实例 GameObject go = null; //go = Instantiate(Resources.Load<GameObject>(Paths.RES_MODEL_MINION + minion.Name), //Team1MinionPoint[0].position, Quaternion.AngleAxis(180, Vector3.up)); go = PoolManager.Instance.GetObject("Minion"); if (minion.Team == 1) { go.transform.position = Team1MinionPoint[0].position; go.transform.SetParent(Team1Parent); } else { go.transform.position = Team2MinionPoint[0].position; go.transform.SetParent(Team2Parent); } // 初始化控制器 AIBaseCtrl ctrl = go.GetComponent <AIBaseCtrl>(); ctrl.Init(minion, minion.Team == GameData.HeroData.Team); CtrlDict.Add(minion.Id, ctrl); }
/// <summary> /// 攻击加倍效果 直到时间结束或进行一次普通攻击 /// </summary> /// <param name="skillId"></param> /// <param name="level"></param> /// <param name="from"></param> /// <param name="to"></param> /// <param name="effect"></param> public static void AttackDouble(int skillId, int level, AIBaseCtrl from, AIBaseCtrl[] to, EffectModel effect) { // 计时器键值 string timeKey = ServerConfig.GetEffectKey(from.Model.Id, skillId, effect.Type); // 添加buff from.AddBuff(effect.Type, timeKey); // 增加攻击 int value = from.Model.Attack * ((int)effect.EffectValue - 1); from.Model.Attack += value; // 更新ui if (from.Model.Id == GameData.HeroData.Id) { (UIManager.Instance.GetPanel(UIPanelType.Battle) as BattlePanel).UpdateView(); } // 恢复攻击 TimerManager.Instance.AddTimer(timeKey, (float)effect.Duration, () => { from.Model.Attack -= value; // 移除buff from.RemoveBuff(effect.Type); // 更新ui if (from.Model.Id == GameData.HeroData.Id) { (UIManager.Instance.GetPanel(UIPanelType.Battle) as BattlePanel).UpdateView(); } }); }
/// <summary> /// 创建小兵 /// </summary> /// <param name="minion"></param> private void CreateMinion(params object[] args) { DtoMinion minion = (DtoMinion)args[0]; // 创建实例 GameObject go = null; go = PoolManager.Instance.GetObject("Minion"); if (minion.Team == 1) { go.transform.position = TeamOne.position; go.transform.SetParent(TeamOne); } else { go.transform.position = TeamTwo.position; go.transform.SetParent(TeamTwo); } // 初始化控制器 AIBaseCtrl ctrl = go.GetComponent <AIBaseCtrl>(); ctrl.Init(minion, false); if (minion.Team == 1) { (ctrl as MinionCtrl).EndPoint = TeamTwo.position; ctrl.ChangeState(AIStateEnum.IDLE); } else { (ctrl as MinionCtrl).EndPoint = TeamOne.position; ctrl.ChangeState(AIStateEnum.IDLE); } }
/// <summary> /// 使用技能 /// </summary> /// <param name="level"></param> /// <param name="from">使用者</param> /// <param name="to">目标</param> public void RunSkill(int level, AIBaseCtrl from, AIBaseCtrl[] to) { for (int i = 0; i < Handler.GetInvocationList().Length; i++) { var action = (EffectHandler)Handler.GetInvocationList()[i]; action(Id, level, from, to, Effects[i]); } }
void Start() { DtoMinion data = new DtoMinion(0, 0, TeamId, Hp, Attack, Defense, 5, 1.0f, 8, "Hero"); AIBaseCtrl ctrl = GetComponent <AIBaseCtrl>(); ctrl.Model = data; ctrl.Init(data, true); }
/// <summary> /// 普通攻击 /// </summary> /// <param name="skillId"></param> /// <param name="level"></param> /// <param name="from"></param> /// <param name="to"></param> /// <param name="effect"></param> public static void NormalAttack(int skillId, int level, AIBaseCtrl from, AIBaseCtrl[] to, EffectModel effect) { if (from == null || to == null) { return; } // 调用攻击方法 from.AttackResponse(to); }
/// <summary> /// 进入范围添加敌人 /// </summary> /// <param name="other"></param> private void OnTriggerEnter(Collider other) { AIBaseCtrl ctrl = other.GetComponent <AIBaseCtrl>(); if (ctrl == null || ctrl.Model.Team == m_Ctrl.Model.Team) { return; } EnemyList.Add(ctrl); }
/// <summary> /// 死亡响应 /// </summary> public virtual void DeathResponse() { // 失去目标 Target = null; // 隐藏血条 SetHpBar(false); // 隐藏小地图头像 MiniMapHead.gameObject.SetActive(false); // 设置到死亡层 gameObject.layer = LayerMask.NameToLayer("Death"); }
/// <summary> /// 处理计算伤害的响应 /// </summary> /// <param name="response"></param> public override void OnOperationResponse(OperationResponse response) { DtoDamage[] damages = JsonMapper.ToObject <DtoDamage[]>(response[(byte)ParameterCode.DtoDamages] as string); DtoDamage item = null; for (int i = 0; i < damages.Length; i++) { item = damages[i]; if (item == null) { continue; } int toId = item.ToId; // 获取目标控制器 AIBaseCtrl toCtrl = BattleData.Instance.CtrlDict.ExTryGet(toId); if (toCtrl == null) { return; } toCtrl.Model.CurHp -= item.Damage; toCtrl.OnHpChange(); // 显示伤害数值 BattlePanel panel = UIManager.Instance.GetPanel(UIPanelType.Battle) as BattlePanel; panel.FloatDamage(item.Damage, toCtrl.transform); // 如果被攻击的是自己 if (toId == GameData.HeroData.Id) { GameData.HeroData = toCtrl.Model as DtoHero; // 更新ui界面 panel.UpdateView(); if (item.IsDead) { // 开始复活倒计时 (UIManager.Instance.GetPanel(UIPanelType.Battle) as BattlePanel).StartRebirthCD(); // 遮罩 UIManager.Instance.ShopPanel(UIPanelType.Mask); toCtrl.DeathResponse(); } } else { // 如果目标死亡了 if (item.IsDead) { toCtrl.DeathResponse(); } } } }
/// <summary> /// 离开范围移除敌人 /// </summary> /// <param name="other"></param> private void OnTriggerExit(Collider other) { AIBaseCtrl ctrl = other.GetComponent <AIBaseCtrl>(); if (EnemyList.Contains(ctrl)) { EnemyList.Remove(ctrl); if (m_Ctrl.Target == ctrl) { m_Ctrl.Target = null; } } }
/// <summary> /// 使用技能 /// </summary> /// <param name="skillId"></param> /// <param name="from"></param> /// <param name="to"></param> public void UseSkill(int skillId, int level, AIBaseCtrl from, AIBaseCtrl[] to = null) { if (!HandlerDict.ContainsKey(skillId)) { Log.Error("没有找到技能 : " + skillId); return; } SkillHandler handler = HandlerDict.ExTryGet(skillId)[level - 1]; if (handler != null) { handler.RunSkill(level, from, to); } }
/// <summary> /// 寻找最近的敌人 /// </summary> /// <returns></returns> public AIBaseCtrl FindRecentlyEnemy() { AIBaseCtrl enemy = null; float rDistance = 1000; foreach (AIBaseCtrl item in EnemyList) { float distance = Vector2.Distance(transform.position, item.transform.position); if (rDistance > distance) { rDistance = distance; enemy = item; } } return(enemy); }
/// <summary> /// 寻找一个敌人 /// </summary> /// <returns></returns> public AIBaseCtrl FindEnemy() { AIBaseCtrl enemy = null; for (int i = EnemyList.Count - 1; i >= 0; i--) { enemy = EnemyList[i]; if (enemy == null || enemy.Model.CurHp <= 0) { EnemyList.Remove(enemy); continue; } return(enemy); } return(null); }
/// <summary> /// 移速加倍 直到时间结束 /// </summary> /// <param name="skillId"></param> /// <param name="level"></param> /// <param name="from"></param> /// <param name="to"></param> /// <param name="effect"></param> public static void SpeedDouble(int skillId, int level, AIBaseCtrl from, AIBaseCtrl[] to, EffectModel effect) { // 计时器键值 string timeKey = ServerConfig.GetEffectKey(from.Model.Id, skillId, effect.Type); // 添加buff from.AddBuff(effect.Type, timeKey); // 增加移速 float value = from.Speed * (float)(effect.EffectValue - 1); from.Speed += value; // 恢复移速 TimerManager.Instance.AddTimer(timeKey, (float)effect.Duration, () => { from.Speed -= value; // 移除buff from.RemoveBuff(effect.Type); }); }
public static void AttackSpeedDouble(int skillId, int level, AIBaseCtrl from, AIBaseCtrl[] to, EffectModel effect) { // 计时器键值 string timeKey = ServerConfig.GetEffectKey(from.Model.Id, skillId, effect.Type); // 添加buff from.AddBuff(effect.Type, timeKey); float original = (float)from.Model.AttackInterval; // 增加攻速 1/攻击间隔 转换为每秒攻击次数 再乘以倍数 from.Model.AttackInterval = 1 / (1 / from.Model.AttackInterval * effect.EffectValue); from.AnimeCtrl.SetAttackSpeed((float)from.Model.AttackInterval); // 恢复攻速 TimerManager.Instance.AddTimer(timeKey, (float)effect.Duration, () => { from.Model.AttackInterval = original; from.AnimeCtrl.SetAttackSpeed(original); // 移除buff from.RemoveBuff(effect.Type); }); }
/// <summary> /// 初始化游戏对象 /// </summary> /// <param name="heros"></param> /// <param name="builds"></param> public void InitData(DtoHero[] heros, DtoBuild[] builds, SkillModel[] skills) { int myTeam = GetMyTeamId(heros, GameData.Player.Id); // 初始化技能数据 SkillManager.Instance.Init(heros, skills); #region 英雄 // 创建英雄 GameObject go = null; foreach (DtoHero item in heros) { if (item.Team == 1) { go = Instantiate(Resources.Load <GameObject>(Paths.RES_MODEL_HERO + item.Name), Team1HeroPoint[0].position, Quaternion.AngleAxis(180, Vector3.up)); go.transform.SetParent(Team1Parent); } else { go = Instantiate(Resources.Load <GameObject>(Paths.RES_MODEL_HERO + item.Name), Team2HeroPoint[0].position, Quaternion.AngleAxis(180, Vector3.up)); go.transform.SetParent(Team2Parent); } // 初始化控制器 AIBaseCtrl ctrl = go.GetComponent <AIBaseCtrl>(); ctrl.Init(item, item.Team == myTeam); CtrlDict.Add(item.Id, ctrl); // 判断这个英雄是不是自己 if (item.Id == GameData.Player.Id) { // 保存自己英雄的控制器 GameData.HeroCtrl = ctrl; // 保存自己英雄的数据 GameData.HeroData = ctrl.Model as DtoHero; } } #endregion #region 建筑 // 创建建筑 for (int i = 0; i < builds.Length; i++) { DtoBuild build = builds[i]; if (build.Team == 1) { go = Team1Builds[build.TypeId - 1]; go.SetActive(true); } else if (build.Team == 2) { go = Team2Builds[build.TypeId - 1]; go.SetActive(true); } // 初始化控制器 AIBaseCtrl ctrl = go.GetComponent <AIBaseCtrl>(); ctrl.Init(build, build.Team == myTeam); if (build.Team == myTeam) { ctrl.Init(build, true); ctrl.MiniMapHead.color = Color.blue; } else { ctrl.Init(build, false); ctrl.MiniMapHead.color = Color.red; } CtrlDict.Add(build.Id, ctrl); } #endregion // 发送初始化完成的消息 MOBAClient.BattleManager.Instance.InitComplete(); }
/// <summary> /// 设置控制器 /// </summary> /// <param name="ai"></param> public void SetCtrl(AIBaseCtrl ctrl) { m_Ctrl = ctrl; }
/// <summary> /// 开启 /// </summary> /// <param name="ctrl"></param> public void Open(AIBaseCtrl ctrl) { m_Ctrl = ctrl; gameObject.SetActive(true); }