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(); }
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); } }
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; } }
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(); }