Exemplo n.º 1
0
    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);
    }
Exemplo n.º 2
0
    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();
    }
Exemplo n.º 3
0
    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();
    }