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); } }