Beispiel #1
0
    void Update()
    {
        Debug.DrawLine(transform.position, _destination, Color.magenta);

        if (IsPlayerVisibile())
        {
            _agent.speed             = normalSpeed;
            _lastKnownPlayerPosition = _player.position;

            if (_playerInfo.IsIdle && _state != BuddyState.Lost)
            {
                if (_agent.remainingDistance < 0.1f && _lastWanderTimer <= 0)
                {
                    var target = GetWanderDestination();
                    if (IsValidWanderDestination(target))
                    {
                        _destination = target;
                        _agent.SetDestination(_destination);
                        _lastWanderTimer = Random.Range(wanderMinIntervalTime, wanderMaxIntervalTime);

                        if (_state != BuddyState.Wander)
                        {
                            _state = BuddyState.Wander;
                            OnStateChangeListener?.Invoke(_state);
                        }
                    }
                }
                _lastWanderTimer -= Time.deltaTime;
            }
            else //if (_playerInfo.IsMoving)
            {
                _lastWanderTimer = 0;
                var target = GetFollowDestination();
                if (IsValidFollowDestination(target))
                {
                    _destination = target;
                    _agent.SetDestination(_destination);

                    if (_state != BuddyState.Follow)
                    {
                        _state = BuddyState.Follow;
                        OnStateChangeListener?.Invoke(_state);
                    }
                }
            }
        }
        else
        {
            _agent.speed = lostSpeed;

            if (_state != BuddyState.Lost)
            {
                _destination = _lastKnownPlayerPosition;
                _agent.SetDestination(_destination);
                _state = BuddyState.Lost;
                OnStateChangeListener?.Invoke(_state);
            }
            else if (_agent.remainingDistance < followingDistance * 0.5f)
            {
                _destination = _player.position;
                _agent.SetDestination(_destination);
            }
        }
    }
    private void Update()
    {
        Debug.DrawLine(transform.position, _agent.destination, Color.magenta);

        if (_state == BuddyState.Healing)
        {
            if (!_playerInfo.IsCriticalHealth)
            {
                _state = BuddyState.Hiding;
                OnStateChangeListener?.Invoke(_state);
            }
            else
            {
                if ((_player.position - _lastTargetPlayerPosition).sqrMagnitude > 0.1f)
                {
                    _lastTargetPlayerPosition = _player.position;
                    _agent.SetDestination(_lastTargetPlayerPosition);
                }

                var distSq = (_player.position - transform.position).sqrMagnitude;
                if (distSq < minDistanceToPlayer * minDistanceToPlayer)
                {
                    var playerHealth = _player.GetComponent <HealthBehavior>();
                    playerHealth.health += healAmount;

                    FindNewPosition();
                }
            }
        }
        else if (_state == BuddyState.Attacking)
        {
            if (_playerInfo.IsCriticalHealth)
            {
                _state = BuddyState.Healing;
                OnStateChangeListener?.Invoke(_state);
                _lastTargetPlayerPosition = _player.position;
                _agent.SetDestination(_lastTargetPlayerPosition);
                _agent.updateRotation = true;
            }
            else if (_targetEnemy != null && IsVisibile(_targetEnemy.position))
            {
                var desiredRot = Quaternion.LookRotation(_targetEnemy.position - transform.position);
                var angle      = Quaternion.Angle(transform.rotation, desiredRot);
                transform.rotation = Quaternion.RotateTowards(transform.rotation, desiredRot, _agent.angularSpeed * Time.deltaTime);

                if (angle < 5.0f)
                {
                    _gun.Fire();
                }

                if (_agent.remainingDistance < 0.2f)
                {
                    FindNewPosition(false);
                }
            }
            else
            {
                _state = BuddyState.Hiding;
                OnStateChangeListener?.Invoke(_state);
                _agent.updateRotation = true;
            }
        }
        else if (_state == BuddyState.Hiding)
        {
            if (_playerInfo.IsCriticalHealth)
            {
                _state = BuddyState.Healing;
                OnStateChangeListener?.Invoke(_state);
                _lastTargetPlayerPosition = _player.position;
                _agent.SetDestination(_lastTargetPlayerPosition);
            }
            else
            {
                var visibleEnemies = GetVisibileEnemies();
                if (visibleEnemies.Count > 0)
                {
                    _state = BuddyState.Attacking;
                    OnStateChangeListener?.Invoke(_state);
                    _targetEnemy          = FindEnemyToAttack(visibleEnemies).transform;
                    _agent.updateRotation = false;
                }

                if (!IsWithinProximityOfPlayer(transform.position))
                {
                    _lastTargetPlayerPosition = _player.position;
                    FindNewPosition();
                }
            }
        }
    }