public override void Update()
 {
     if (!_role.Alive || _role.Matrix == null)
     {
         SetFinish();
         return;
     }
     if (_role.Matrix.State != Matrix.STATE_MARCHING)
     {
         SetFinish();
         return;
     }
     if (!_started)
     {
         _started = true;
         if (_role.Alive)
         {
             if (!_role.Matrix.MemberIsInPosition(_role))
             {
                 _runToPosition = new MatRunToPosition(_role);
                 //_role.AddAction(_runToPosition);
             }
             else
             {
                 MoveTo(_role.transform.position, _role.Matrix.GetMatrixPosition(_role));
             }
         }
     }
     else
     {
         if (_runToPosition != null)
         {
             _runToPosition.Update();
             if (_runToPosition.Finished)
             {
                 _runToPosition = null;
             }
         }
         if (_runToPosition == null)
         {
             MoveTo(_role.transform.position, _role.Matrix.GetMatrixPosition(_role));
         }
     }
 }
Beispiel #2
0
    public override void Update()
    {
        _skillSelector.Update();
        _hero = _monster.Map.hero;
        _wall = _monster.Map.wall;
        if (!_monster.Alive)
        {
            return;
        }
        if (_monster.ExecutingSkill != null)
        {
            if (_monster.aiTpl.Cancancelskill == 1)
            {
                if (_monster.ExecutingSkill.CanCancelPhase && _monster.ExecutingSkill.IsTargetRunAway())
                {
                    _monster.ExecutingSkill.Cancel();
                    _monster.AddAction(new RestAction(_monster, null, 0.05f));
                }
            }
            return;
        }
        if (_monster.CanAction())
        {
            if (_duty != null)
            {
                _duty.Update();
                if (_duty.State != Duty.STATE_FREE)
                {
                    return;
                }
            }

            Role  target        = null;
            float distance      = 0.0f;
            bool  matrixLimited = false;
            if (_monster.Matrix != null)
            {
                if (_monster.Matrix.Arrived)
                {
                    if (_monster.Matrix.State == Matrix.STATE_BEATTACKING && _monster.aiTpl.Matrixjob != Matrix.JOB_ATTACK_WALL_ONLY)
                    {
                        matrixLimited = true;
                        AttackToHero();
                    }
                    else
                    {
                        if (_monster.aiTpl.Matrixjob != Matrix.JOB_FREE_ATTACT)
                        {
                            matrixLimited = true;
                            if (_monster.aiTpl.Matrixjob == Matrix.JOB_GUARD)
                            {
                                //if (_monster.Matrix.MemberIsInPosition(_monster))
                                //{

                                //}
                                //else
                                //{

                                //}
                            }
                            else if (_monster.aiTpl.Matrixjob == Matrix.JOB_ATTACK_WALL_ONLY)
                            {
                                if (_monster.Matrix.MemberIsInPosition(_monster))
                                {
                                    if (_wall != null && _wall.Alive)
                                    {
                                        target = _wall;
                                        Skill skill      = null;
                                        bool  GroupAllow = true;

                                        skill = SelectSkill(target);
                                        if (skill != null)
                                        {
                                            if (target.isLife && _monster.Group != null)
                                            {
                                                GroupMemberAction action = new GroupMemberAction(_monster, GroupMemberAction.USE_SKILL);
                                                GroupAllow = _monster.Group.MemberAction(action);
                                            }
                                            if (GroupAllow)
                                            {
                                                skill.Release();
                                            }
                                        }
                                        if (skill == null)
                                        {
                                            Debug.LogError("无法攻击城墙,monsterId=" + _monster.RoleId);
                                        }
                                    }
                                }
                                else if (!(_monster.CurrentAction is MatRunToPosition))
                                {
                                    _monster.AddAction(new MatRunToPosition(_monster));
                                }
                            }
                            else if (_monster.aiTpl.Matrixjob == Matrix.JOB_REMOTE_ATTACK)
                            {
                            }
                        }
                    }
                }
                else
                {
                    if (_monster.Matrix.State == Matrix.STATE_GROUP)
                    {
                        if (!_monster.Matrix.MemberIsInPosition(_monster))
                        {
                            if (!(_monster.CurrentAction is MatRunToPosition))
                            {
                                MatRunToPosition act = new MatRunToPosition(_monster);
                                _monster.AddAction(act);
                            }
                        }
                        matrixLimited = true;
                    }
                    else if (_monster.Matrix.State == Matrix.STATE_MARCHING)
                    {
                        matrixLimited = true;
                        if (!(_monster.CurrentAction is MatMemberMarchAction))
                        {
                            _monster.AddAction(new MatMemberMarchAction(_monster));
                        }
                    }
                    else if (_monster.Matrix.State == Matrix.STATE_BEATTACKING)
                    {
                        //matrixLimited = true;
                        //if (_monster.aiTpl.Matrixjob != Matrix.JOB_FREE_ATTACT)
                        //{

                        //}
                        matrixLimited = true;
                        AttackToHero();
                    }
                }
            }
            if (matrixLimited)
            {
                return;
            }
            if (_hero != null && _hero.Alive)
            {
                distance = Vector2.Distance(_hero.GetAttackablePosition(_monster), _monster.transform.position);
                if (distance < _monster.GetRoleInfo().SeeDistance)
                {
                    target = _hero;
                }
            }
            if (target == null)
            {
                if (_wall != null && _wall.Alive && _monster.aiTpl.Willattackwalk == 1)
                {
                    distance = Vector2.Distance(_wall.GetAttackablePosition(_monster), _monster.transform.position);
                    if (distance < _monster.GetRoleInfo().SeeDistance)
                    {
                        target = _wall;
                    }
                }
            }
            if (target != null)
            {
                AttackTo(target);
            }
            else
            {
                if (_wall != null && _wall.Alive && _monster.aiTpl.Willattackwalk == 1)
                {
                    if (!(_monster.CurrentAction is MonsterMarchAction))
                    {
                        IAction march = new MonsterMarchAction(_monster, _wall);
                        _monster.AddAction(march);
                    }
                }
            }
        }
    }