public void OnUpdate(ShipController controller) { if (_closestSatellite == null || !_closestSatellite.IsAlive() || !controller.IsTargetInSight(_closestSatellite)) { Satellite closestSatellite = _target.GetNearestSatellite(controller.transform.position); if (closestSatellite == null) { Planet nextPlanetToAttack = _levelManager.GetPlanetToAttack(); if (nextPlanetToAttack != null) { controller.SetState(new GoToPlanet(nextPlanetToAttack, new AttackPlanet(nextPlanetToAttack))); } else { controller.SetState(null); } return; } _closestSatellite = closestSatellite; } Vector3 targetForward = (_closestSatellite.transform.position - controller.transform.position); targetForward.y = 0.0f; controller.RotateTowards(targetForward.normalized); if (_attackState == AttackState.TRY_SHOOT) { UpdateRotateTowardsEnemy(controller, _closestSatellite); } else if (_attackState == AttackState.WAIT_AFTER_ATTACK) { UpdateWaitAfterAttack(controller); } }