public FCSkillConfig GetSkillNear(Vector3 position) { FCSkillConfig ret = _attackAgent._skillMaps[_attackLevel]._skillConfigs[0]; if (position.y <= 2) { foreach (FCSkillConfig esc in _attackAgent._skillMaps[_attackLevel]._skillConfigs) { if (position.sqrMagnitude > esc._distanceMinSqrt) { ret = esc; break; } } } return(ret); }
private IEnumerator FEINT_ATTACK() { _inSeek = true; int frameCount = 0; _owner.ACStop(); _owner.SetShipForSpeedAndForward(MoveAgent.ROTATE_FLAG.FOLLOW_SPEED); _owner.ACSetMoveMode(MoveAgent.MOVE_MODE.BY_ANIMATION); //play fake attack _hDirection = HES_DIRECTION.NONE; _aniSwitch._aniIdx = FC_All_ANI_ENUM.fakeAttack0; _owner.ACPlayAnimation(_aniSwitch); while (_inSeek) { UpdateFaceTarget(); frameCount++; if (frameCount > 10 && _owner.AniGetAnimationNormalizedTime() > 0.35f) { Vector3 v3 = _targetAC.ThisTransform.localPosition - _owner.ThisTransform.localPosition; FCSkillConfig ews = _attackCountAgent.GetSkillAt(v3); if (ews != null) { SetNextSeekMode(SEEK_MODE.COPY_PLAYER); } else { GoToAttack(); } } UpdateAnimation(); yield return(null); } _owner.ACSetMoveMode(MoveAgent.MOVE_MODE.BY_MOVE_MANUAL); ChangeToSeekMode(); }
private IEnumerator COPY_PLAYER() { _inSeek = true; // if true , means monster will find a way to attack player _wantToAttack = false; bool awayFromPlayer = false; //show to GD ,min and max _seekTime = Random.Range(_copyPlayerTimeMin, _copyPlayerTimeMax); if (_usedForFly) { _owner.SetShipForSpeedAndForward(MoveAgent.ROTATE_FLAG.FOLLOW_SPEED); } else { _owner.SetShipForSpeedAndForward(MoveAgent.ROTATE_FLAG.UNLOCK); } while (_inSeek) { UpdateFaceTarget(); _seekTime -= Time.deltaTime; if (awayFromPlayer) { if ((_owner.ThisTransform.localPosition - _targetPosition).sqrMagnitude < 1f) { GoToAttack(); } } else { if (!_wantToAttack) { if (_seekTime >= 0) { //direction to player Vector3 v3 = _targetAC.ThisTransform.localPosition - _owner.ThisTransform.localPosition; //get player motion last frame Vector3 v31 = _targetAC._currPosition - _targetAC._lastPosition; //means player is attack if (_targetAC.ACGetCurrentAttack() == null) { //show attack chance to GD float ret = Random.Range(0, 1f); if (ret < _copyPlayerAttackChanceT * Time.deltaTime) { _wantToAttack = true; } else { //will copy player move way if (v31 != Vector3.zero) { v31.Normalize(); //if mosnter is near player enough .the main direction of player is try to copy player motion if (v3.sqrMagnitude < _safeDistanceSqrt) { v3 = v31 * 0.9f + v3.normalized * 0.1f; v3.Normalize(); //when copy player motion ,will need monster move faster MoveByDirection(v3, _wanderSpeed * 1.5f, 0.2f); _owner.AniSetAnimationSpeed(1.5f); } else { //otherwise far from player, will try to close and copy player move way at the same time ret = v3.sqrMagnitude / _safeDistanceSqrt; ret -= 1; ret = Mathf.Clamp(ret, 0, 1f); v3 = v31 * (1 - ret) + v3.normalized * ret; v3.Normalize(); MoveByDirection(v3, _wanderSpeed * 1.5f, 0.2f); _owner.AniSetAnimationSpeed(1.5f); } } } } else { //if player is in attack, monster will have more chance to attack player if (Random.Range(0, 1f) < _copyPlayerAttackChanceAttackT * Time.deltaTime) { _wantToAttack = true; } } } else { _wantToAttack = true; } } else { Vector3 v3 = _targetAC.ThisTransform.localPosition - _owner.ThisTransform.localPosition; //get a suitable skill to attack player FCSkillConfig ews = _attackCountAgent.GetSkillNear(v3); if (ews._distanceMinSqrt > v3.sqrMagnitude) { //means enemy should away from player to find a right position to attack player v3 = -v3; v3.y = 0; v3.Normalize(); v3.x = v3.x + Random.Range(-0.1f, 0.1f); v3.y = v3.y + Random.Range(-0.1f, 0.1f); v3.Normalize(); _targetPosition = _targetAC.ThisTransform.localPosition + v3 * ews.GetSkillActiveDistanceMin(); MoveTo(ref _targetPosition); _seekTime = 0.5f; _wantToAttack = false; awayFromPlayer = true; } else { GoToAttack(); } } } UpdateAnimation(); yield return(null); } ChangeToSeekMode(); }