Hi. There are certainly many ways to go about this. I dont think I would use an array for this, as it makes more work.
I would maybe
Step 1:
Tag all places you can hookshot onto with a gameobject tag called "hookshot"
State 1 (wait button state)
1. wait for button down (to start the shot).
State 2 (check target state)
2. ray cast forwards and get returned game object
3. Use raycast filter tag option for "hookshot"
4. Check for null gameobject (because wasent hookshot). If null, go to state 3, play fail sound and go back to start state.
5. If not null, then that gameobject is your target area.
6. Play hookshot animation.
State 3 (fail state)
7. play fail sound.
State 4 (success state)
8. Move your character to the gameobject (this depends on what method you are using for movement). I would probably use an itween (or better use the hotween package because of much much better performance).
I think the more tricky part might be getting the hookshot animation to work with your character, so you might think how you want to do that. A line renderer could be good. You can draw a line between your characters position and the target. Update everyframe, so as your character moves, the line will stay at the characters body (instead of the place where the character started), and thereby "shortening" as the character moves to the position.