示例#1
0
        private void Update()
        {
            if (_isDead)
            {
                return;
            }

            if (Math.Abs(_currentAttackRadius - attackRadius.GetValue()) > 0)
            {
                _currentAttackRadius = attackRadius.GetValue();
                UpdateAttackRange();
            }

            if (_currentState == UnitState.Moving && _agent.remainingDistance <= 0)
            {
                _currentState = UnitState.Idle;
                _animator.SetInteger("unitState", 0);
            }

            if (_currentState == UnitState.Moving || _currentState == UnitState.Idle)
            {
                if (_detectedEnemyUnits.Count > 0)
                {
                    _enemyUnit    = _detectedEnemyUnits[0];
                    _currentState = UnitState.Combat;
                }
                else if (_detectecEnemyBuildings.Count > 0)
                {
                    _enemyBuilding = _detectecEnemyBuildings[0];
                    _currentState  = UnitState.Combat;
                }
            }

            if (_currentState == UnitState.Combat)
            {
                if (_agent.remainingDistance >= attackRadius.GetValue())
                {
                    _animator.SetInteger("unitState", 1);
                }
                if (_enemyUnit)
                {
                    if (_enemyUnit._isDead)
                    {
                        _detectedEnemyUnits.Remove(_enemyUnit);
                        _enemyUnit   = null;
                        _isAttacking = false;
                        return;
                    }

                    var dist = Vector3.Distance(_enemyUnit.transform.position, transform.position);
                    if (dist <= attackRadius.GetValue())
                    {
                        FaceTransform(_enemyUnit.transform);
                        if (!_isAttacking)
                        {
                            _isAttacking = true;
                            StartCoroutine(AttackTarget());
                        }
                    }
                    else
                    {
                        GoToTarget(dist);
                    }
                }
                else if (_enemyBuilding)
                {
                    if (_enemyBuilding.IsDead)
                    {
                        _detectecEnemyBuildings.Remove(_enemyBuilding);
                        _enemyBuilding = null;
                        _isAttacking   = false;
                        return;
                    }

                    var dist = Vector3.Distance(_enemyBuilding.transform.position, transform.position);
                    if (dist <= attackRadius.GetValue())
                    {
                        FaceTransform(_enemyBuilding.transform);
                        if (!_isAttacking)
                        {
                            _isAttacking = true;
                            StartCoroutine(AttackTarget());
                        }
                    }
                    else
                    {
                        GoToTarget(dist);
                    }
                }
                else
                {
                    _currentState = UnitState.Idle;
                    _animator.SetInteger("unitState", 0);
                }
            }

            if (_currentState == UnitState.Gathering)
            {
                if (!GatheringTarget)
                {
                    _isGathering    = false;
                    inResourceRange = false;
                    _currentState   = UnitState.Idle;
                    _animator.SetInteger("unitState", 0);
                }

                // Physics.SphereCast(transform.position, _gatheringTarget.gatherRadius, out var hit, gameObject.layer);
                else if (inResourceRange)
                {
                    if (!_isGathering && _agent.remainingDistance <= GatheringTarget.gatherRadius)
                    {
                        _animator.SetInteger("unitState", 2);
                        GatheringTarget.AddGatherer(teamId);
                        _isGathering = true;
                    }

                    FaceTransform(GatheringTarget.transform);
                }
            }

            if (_currentState == UnitState.Building)
            {
                if (!BuildingTarget)
                {
                    _isBuilding     = false;
                    inBuildingRange = false;
                    _currentState   = UnitState.Idle;
                    _animator.SetInteger("unitState", 0);
                }

                else if (inBuildingRange)
                {
                    if (!_isBuilding && _agent.remainingDistance <= BuildingTarget.buildingRadius)
                    {
                        _animator.SetInteger("unitState", 2);
                        BuildingTarget.AddBuilder();
                        _isBuilding = true;
                    }

                    FaceTransform(BuildingTarget.transform);
                }
            }

            if (_currentHitPoints < maxHitPoints)
            {
                if (!_unitHealthBar.gameObject.activeInHierarchy)
                {
                    _unitHealthBar.gameObject.SetActive(true);
                }
            }
            else if (_currentState == UnitState.Idle && !_isSelected)
            {
                _unitHealthBar.gameObject.SetActive(false);
            }
        }