Ejemplo n.º 1
0
    protected IEnumerator WAIT()
    {
        _aniSwitch._aniIdx = FC_All_ANI_ENUM.idle;
        _owner.ACPlayAnimation(_aniSwitch);
        _inRangerMode = true;
        _owner.ACStop();
        //we need this state at least 0.5 sec
        float timeCount = _waitTime;

        while (_inRangerMode)
        {
            FaceToTarget(_targetAC);
            timeCount -= Time.deltaTime;
            if (timeCount <= 0)
            {
                FC_DANGER_LEVEL edl = GetTargetDangerLevel(_safeDistance, _dangerDistance);
                if (edl == FC_DANGER_LEVEL.DANGER)
                {
                    SetNextRangerMode(RANGER_MODE.AVOID);
                }
                else if (edl == FC_DANGER_LEVEL.VERY_DANGER)
                {
                    SetNextRangerMode(RANGER_MODE.AVOID);
                }
                if (_attackCountAgent.CanUseSkill())
                {
                    SetNextRangerMode(RANGER_MODE.SHOOT);
                }
            }

            yield return(null);
        }
        ChangeToRangerMode();
    }
Ejemplo n.º 2
0
 public override void AvoidAndShootTaskChange(FCCommand.CMD cmd)
 {
     if (cmd == FCCommand.CMD.STATE_ENTER)
     {
         if (_owner.Energy >= 100)
         {
             SetActionSwitchFlag(FC_ACTION_SWITCH_FLAG.GAIN_NO_ENERGY);
             ClearActionSwitchFlag(FC_ACTION_SWITCH_FLAG.GAIN_ENERGY_BY_ATTACK);
         }
         else
         {
             ClearActionSwitchFlag(FC_ACTION_SWITCH_FLAG.GAIN_NO_ENERGY);
             SetActionSwitchFlag(FC_ACTION_SWITCH_FLAG.GAIN_ENERGY_BY_ATTACK);
         }
         _owner.ACSetMoveMode(MoveAgent.MOVE_MODE.BY_MOVE_MANUAL);
         EventIsStopAtPoint = IsStopAtPoint;
         FC_DANGER_LEVEL edl = GetTargetDangerLevel(_safeDistance, _dangerDistance);
         if (edl == FC_DANGER_LEVEL.SAFE)
         {
             if (_attackCountAgent.CanUseSkill())
             {
                 SetNextRangerMode(RANGER_MODE.SHOOT);
             }
             else
             {
                 SetNextRangerMode(RANGER_MODE.WAIT);
             }
         }
         else
         {
             SetNextRangerMode(RANGER_MODE.AVOID);
         }
         ChangeToRangerMode();
     }
     else if (cmd == FCCommand.CMD.STATE_QUIT)
     {
         _owner.SetShipForSpeedAndForward(MoveAgent.ROTATE_FLAG.FOLLOW_SPEED);
         _owner.ACStop();
         StopAllCoroutines();
         EventIsStopAtPoint = null;
         AniEventAniIsOver  = AniIsOver;
         _owner.ACSetMoveMode(MoveAgent.MOVE_MODE.BY_ANIMATION);
     }
 }
Ejemplo n.º 3
0
 public override void HesitateTaskChange(FCCommand.CMD cmd)
 {
     if (cmd == FCCommand.CMD.STATE_ENTER)
     {
         _timeTotalForWander  = 0;
         _dangerousRaduisSqrt = _dangerousRaduis * _dangerousRaduis;
         _wanderSpeed         = _owner.Data.TotalMoveSpeed * _wanderSpeedPercents;
         _hDirection          = HES_DIRECTION.NONE;
         _realSafeDistance    = _safeDistance + _bodyRadius + _targetAC.BodyRadius;
         _safeDistanceSqrt    = _realSafeDistance * _realSafeDistance;
         _owner.ACSetMoveMode(MoveAgent.MOVE_MODE.BY_MOVE_MANUAL);
         _wantToAttack  = false;
         _timeForWander = Random.Range(_timeForWanderMin, _timeForWanderMax);
         //CountTargetToSetWay();
         float ret = Random.Range(0, 1f);
         if (_awayFromTarget == AWAY_MODE.AWAY_AFTER_HURT)
         {
             if (RageIsFull)
             {
                 if (CanAttackOthers)
                 {
                     GoToAttack();
                 }
                 else
                 {
                     if (!_haveActionTicket)
                     {
                         FCTicketManager.Instance.ApplyTicket(_owner);
                     }
                 }
             }
             else if (ret < _chanceToAwayAfterHurt)
             {
                 SetNextSeekMode(SEEK_MODE.RUN_AWAY_AFTER_HURT);
             }
             else
             {
                 SetNextSeekMode(SEEK_MODE.WANDER_TO_PLAYER);
             }
             //have chance,
             //RageFromHurt >50
             //rage max = 100.as
             //hurt run away time min and max
         }
         else if (_awayFromTarget == AWAY_MODE.AWAY_AFTER_ATTACK)
         {
             //have chance to hit again
             //or run away
             if (ret < _chanceToAwayAfterAttack)
             {
                 SetNextSeekMode(SEEK_MODE.RUN_AWAY_AFTER_ATTACK);
             }
             else
             {
                 GoToAttack();
             }
         }
         else
         {
             //
             FC_DANGER_LEVEL dl = GetTargetDangerLevel(3, 8);
             if (dl == FC_DANGER_LEVEL.SAFE)
             {
                 _hesitateJitter = Random.Range(_hesitateJitterMin, _hesitateJitterMax);
                 SetNextSeekMode(SEEK_MODE.WANDER_TO_PLAYER);
             }
             else if (dl == FC_DANGER_LEVEL.DANGER)
             {
                 SetNextSeekMode(SEEK_MODE.RUN_AWAY_AFTER_ATTACK);
                 //SetNextSeekMode(SEEK_MODE.RUN_AWAY_AFTER_ATTACK);
             }
             else
             {
                 SetNextSeekMode(SEEK_MODE.RUN_AWAY_AFTER_HURT);
             }
         }
         if (_usedForFly)
         {
             _owner.MoveFollowForward = true;
             _owner.CurrentAngleSpeed = _angleSpeedForFlyWander;
         }
         ChangeToSeekMode();
     }
     else if (cmd == FCCommand.CMD.STATE_UPDATE)
     {
         UpdateHesitate();
     }
     else if (cmd == FCCommand.CMD.STATE_QUIT)
     {
         StopAllCoroutines();
         _owner.CurrentAngleSpeed = _owner.Data.angleSpeed;
         _owner.ACAniSpeedRecoverToNormal();
         _owner.ACRestoreToDefaultSpeed();
         _owner.SetShipForSpeedAndForward(MoveAgent.ROTATE_FLAG.FOLLOW_SPEED);
         //_owner.MoveFollowForward = false;
     }
 }
Ejemplo n.º 4
0
    IEnumerator AVOID()
    {
        _aniSwitch._aniIdx = FC_All_ANI_ENUM.runCircleB1;
        _owner.ACPlayAnimation(_aniSwitch);
        _owner.SetShipForSpeedAndForward(MoveAgent.ROTATE_FLAG.UNLOCK);
        _inRangerMode = true;
        _inFastAvoid  = false;
        //we need this state at least 0.5 sec
        float   timeCount       = _timeMinForAvoid;
        float   timeMaxForAvoid = _timeMaxForAvoid;
        Vector3 dir             = GetDirectionToTarget();

        _inSlowTime = 0;
        float angleOffset = Random.Range(-10, 10);

        while (_inRangerMode)
        {
            FaceToTarget(_targetAC);
            if (timeCount >= 0)
            {
                timeCount -= Time.deltaTime;
            }
            dir += GetDirectionToTarget();
            dir.Normalize();
            timeMaxForAvoid -= Time.deltaTime;
            if (_inSlowTime > 0.1f)
            {
                if (angleOffset <= 0)
                {
                    angleOffset = -45;
                }
                else
                {
                    angleOffset = 45;
                }
            }
            else if (_inFastAvoid)
            {
                if (angleOffset <= 0)
                {
                    angleOffset = -5;
                }
                else
                {
                    angleOffset = 5;
                }
                Quaternion qt = Quaternion.Euler(0, angleOffset, 0);
                dir = qt * dir;
            }

            MoveByDirection(-dir, _avoidSpeed, 0.1f);

            if (timeCount <= 0 && timeMaxForAvoid > 0)
            {
                FC_DANGER_LEVEL edl = GetTargetDangerLevel(_safeDistance, _dangerDistance);
                if (edl != FC_DANGER_LEVEL.VERY_DANGER && _attackCountAgent.CanUseSkill())
                {
                    SetNextRangerMode(RANGER_MODE.SHOOT);
                }
            }
            else if (timeMaxForAvoid <= 0)
            {
                SetNextRangerMode(RANGER_MODE.SHOOT);
            }
            else if (_inSlowTime > 0.5f)
            {
                SetNextRangerMode(RANGER_MODE.SHOOT);
            }
            yield return(null);
        }
        _owner.SetShipForSpeedAndForward(MoveAgent.ROTATE_FLAG.FOLLOW_SPEED);
        ChangeToRangerMode();
    }