Next time you should look through the forum better, this has already been asked:
Using :WorldToViewportPoint() or :WorldToScreenPoint() is the only way. The answer to the above post also uses :GetPartsObscuringTarget() to see if there are any parts in the way.
The limit of this is that large parts might result in false negatives (because then you can see the edges but not the center which is used in :WorldToViewportPoint()) and false positives with transparent parts like described in the solution.