Answer to question:
Both options are good, but in your case I'd use Area2D. If you're using an arrow, than you'll probably have to update the global_position of it, because otherwise, if you move the parent node, it moves too. You'll need to make your own collisions, but I think, that haveing a RigidBody2D would be unnecessary, because you won't really use physics for it's movement.
I think you should use a State Machine, because you can set states, so when you shoot the arrow, it's in a moving state, if it hits something it's in a stopped state.
You can obviously make the script (and the state machine) really simple, but I recon' spending some time with it because you can reuse it, and it makes you code be nicer.
I only know this tutorial, but you can totally apply it to kinda everything:
this is a part of the tutorial:
but if you don't want to have complexity to your arrow, then I made a simple state machine inside this little code section:
# Varaiables for moveing
var move_direction = Vector2(0,0)
export(int) var speed = 10
var states = ["fly", "stop"]
export(int) var dmg = 10
# When I spawn the bullets I give them a direction to go,
# In the parent node. Obviously you can change tha direction around if you want to.
if move_direction != Vector2(0,0):
current_state = states.fly
global_position += move_direction * speed
global_rotation = move_direction.angle()
pos = global_position
global_position = pos
# if area.is_in_group("PlayerHitbox"):
current_state = states.stop