예제 #1
0
    private void Update()
    {
        //set animation states
        animator.SetBool(IsAttacking, _isAttacking);
        animator.SetBool(IsAgro, _isAgro);

        if (_isAgro)
        {
            if (!_vision.CanSeeObject())
            {
                return;
            }

            // Move towards players
            var position = _vision.GetVisibleObjects()[0].transform.position;
            var path     = _pathFinding.GetPath(position);
            _movement.SetPath(path);

            // Look at player
            _rotation.RotateTowards(position);

            if (!_isAttacking && Vector3.Distance(transform.position, position) <= attackDistance &&
                !_isAttackCoolingDown)
            {
                _isAttacking = true;
            }
        }
        else
        {
            // Wander
            _movement.SetPath(null);
            //TODO: wander around
            _isAgro = _vision.CanSeeObject();
        }

        if (_health.GetHealth() <= 0)
        {
            gameObject.SetActive(false);
        }
    }
예제 #2
0
    private void Update()
    {
        //set animation states
        animator.SetBool(IsAttacking, _isAttacking);
        animator.SetBool(IsAgro, _isAgro);

        if (_isAgro)
        {
            if (!_isStrafing && !_movingCloser && !_movingAway)
            {
                _movingCloser = true;
            }

            if (_vision.CanSeeObject())
            {
                if (_isStrafing)
                {
                    var path = _pathFinding.GetPath(transform.position);
                    _movement.SetPath(path);

                    if (!_isAttacking && !_isAttackCoolingDown)
                    {
                        _isAttacking = true;
                    }

                    var distance = Vector3.Distance(transform.position, _vision.GetVisibleObjects()[0].transform.position);

                    if (distance < minStrafeDistance)
                    {
                        _movingCloser = false;
                        _movingAway   = true;
                        _isStrafing   = false;
                    }
                    else if (distance > maxStrafeDistance)
                    {
                        _movingCloser = true;
                        _movingAway   = false;
                        _isStrafing   = false;
                    }
                    else if (Mathf.Abs(maxStrafeDistance - distance) < 0.3)
                    {
                        _movingCloser = false;
                        _movingAway   = false;
                        _isStrafing   = true;
                    }
                    else if (distance > minStrafeDistance && distance < maxStrafeDistance)
                    {
                        float ran = Random.Range(0, 1);
                        if (ran < 0.6)
                        {
                            _movingCloser = false;
                            _movingAway   = false;
                            _isStrafing   = true;
                        }
                    }

                    _rotation.RotateTowards(_vision.GetVisibleObjects()[0].transform.position);
                }
                else if (_movingCloser)
                {
                    _lastSeenPlayerPos = _vision.GetVisibleObjects()[0].transform.position;
                    _lastSawPlayerTime = Time.time;
                    _hasLastPlayerPos  = true;
                    var position = transform.position;
                    var path     = _pathFinding.GetPath(position);
                    _movement.SetPath(path);

                    var distance = Vector3.Distance(position, _vision.GetVisibleObjects()[0].transform.transform.position);

                    if (distance < minStrafeDistance)
                    {
                        _movingCloser = false;
                        _movingAway   = true;
                        _isStrafing   = false;
                    }
                    else if (distance > maxStrafeDistance)
                    {
                        _movingCloser = true;
                        _movingAway   = false;
                        _isStrafing   = false;
                    }
                    else if (Mathf.Abs(maxStrafeDistance - distance) < 0.3)
                    {
                        _movingCloser = false;
                        _movingAway   = false;
                        _isStrafing   = true;
                    }
                    else if (distance > minStrafeDistance && distance < maxStrafeDistance)
                    {
                        float ran = Random.Range(0, 1);
                        if (ran < 0.6)
                        {
                            _movingCloser = false;
                            _movingAway   = false;
                            _isStrafing   = true;
                        }
                    }

                    var lookPos = _vision.GetVisibleObjects()[0].transform.position - transform.position;
                    lookPos.y = 0;
                    var rotation = Quaternion.LookRotation(lookPos);

                    _rotation.RotateTowards(_vision.GetVisibleObjects()[0].transform.position);
                }
                else if (_movingAway)
                {
                    if (!_isAttacking && !_isAttackCoolingDown)
                    {
                        _isAttacking = true;
                    }

                    _lastSeenPlayerPos = _vision.GetVisibleObjects()[0].transform.position;
                    _lastSawPlayerTime = Time.time;
                    _hasLastPlayerPos  = true;


                    var backwardTarget = transform.position - transform.forward;
                    var path           = _pathFinding.GetPath(backwardTarget);
                    _movement.SetPath(path);
                    _rotation.RotateTowards(_vision.GetVisibleObjects()[0].transform.position);

                    var distance = Vector3.Distance(transform.position, _vision.GetVisibleObjects()[0].transform.transform.position);

                    if (distance < minStrafeDistance)
                    {
                        _movingCloser = false;
                        _movingAway   = true;
                        _isStrafing   = false;
                    }
                    else if (distance > maxStrafeDistance)
                    {
                        _movingCloser = true;
                        _movingAway   = false;
                        _isStrafing   = false;
                    }
                    else if (Mathf.Abs(maxStrafeDistance - distance) < 0.3)
                    {
                        _movingCloser = false;
                        _movingAway   = false;
                        _isStrafing   = true;
                    }
                    else if (distance > minStrafeDistance && distance < maxStrafeDistance)
                    {
                        float ran = Random.Range(0, 1);
                        if (ran < 0.6)
                        {
                            _movingCloser = false;
                            _movingAway   = false;
                            _isStrafing   = true;
                        }
                    }
                }
            }
            else
            {
                var path = _pathFinding.GetPath(_hasLastPlayerPos ? _lastSeenPlayerPos : transform.position);
                _movement.SetPath(path);

                if (!(Time.time - _lastSawPlayerTime >= lookForLostPlayerMs))
                {
                    return;
                }
                _isAgro           = false;
                _hasLastPlayerPos = false;
            }
        }
        else
        {
            var path = _pathFinding.GetPath(transform.position);
            _movement.SetPath(path);

            //TODO: wander around
            _hasLastPlayerPos = false;
            _isAgro           = _vision.CanSeeObject();
        }

        if (_health.GetHealth() <= 0)
        {
            gameObject.SetActive(false);
        }
    }