/// <summary> /// Go to the target and shoot at them. /// </summary> private void HandleFightingState() { // Iterate the time since we've attacked timeSinceAttack += Time.deltaTime; // Stand within attacking distance and attack the target if (target == null) { SwapState(AI_State.idle); } else { // Try to attack if (timeSinceAttack > attackFrequency) { // Check if we can even see the target var targetVisable = CanSeeObject(target); if (targetVisable) { // If the target is visable we should attack them inputManager.Fire1_performed(); // Wait at least one frame between attacks timeSinceAttack = -Time.deltaTime; } else { // If the target is not visable we should move var point = target.position; // Clamp the position to our range point.x = Mathf.Clamp(_transform.position.x, point.x - visabilityRange, point.x + visabilityRange); point.z = Mathf.Clamp(_transform.position.z, point.z - visabilityRange, point.z + visabilityRange); // Create a point that we can move to on the nav mesh var moveTo = GetNavMeshPosition(point); // If the position we picked is null, find a wander position instead if (moveTo == Vector3.zero) { FindWanderPosition(); } else { // Generate a path to the point CalculatePath(moveTo); } } } } }