Пример #1
0
    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);
        }
    }
Пример #2
0
    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);
        }
    }
Пример #3
0
    /// <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);
    }
Пример #4
0
    /// <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();
            }
        });
    }
Пример #5
0
    /// <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);
        }
    }
Пример #6
0
 /// <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]);
     }
 }
Пример #7
0
    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);
    }
Пример #8
0
    /// <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);
    }
Пример #9
0
    /// <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);
    }
Пример #10
0
 /// <summary>
 /// 死亡响应
 /// </summary>
 public virtual void DeathResponse()
 {
     // 失去目标
     Target = null;
     // 隐藏血条
     SetHpBar(false);
     // 隐藏小地图头像
     MiniMapHead.gameObject.SetActive(false);
     // 设置到死亡层
     gameObject.layer = LayerMask.NameToLayer("Death");
 }
Пример #11
0
    /// <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();
                }
            }
        }
    }
Пример #12
0
    /// <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;
            }
        }
    }
Пример #13
0
        /// <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);
            }
        }
Пример #14
0
    /// <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);
    }
Пример #15
0
    /// <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);
    }
Пример #16
0
    /// <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);
        });
    }
Пример #17
0
    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);
        });
    }
Пример #18
0
    /// <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();
    }
Пример #19
0
 /// <summary>
 /// 设置控制器
 /// </summary>
 /// <param name="ai"></param>
 public void SetCtrl(AIBaseCtrl ctrl)
 {
     m_Ctrl = ctrl;
 }
Пример #20
0
 /// <summary>
 /// 开启
 /// </summary>
 /// <param name="ctrl"></param>
 public void Open(AIBaseCtrl ctrl)
 {
     m_Ctrl = ctrl;
     gameObject.SetActive(true);
 }