Sure you can do this in Godot.
For example, you can create an initialized function to do that, and runs the function when you instance the bullet scene. Then everytime you
can instance different bullet scene(base on pass different values to the initialized function)
The Following codes just an idea(and you have to let the initialized function work by writedown more codes):
[In bullet.gd]
var bullet_atk:int # bullet's attack power
var bullet_damage_range:int # bullet's damage range
var bullet_speed:int # bullet's shoot speed
var bullet_img:String # bullet's sprite texture path
func initial_bullet(atk:int, drange:int, speed:int, img:String):
bullet_atk = atk
bullet_damage_range = drange
bullet_speed = speed
bullet_img = img
......# do what you want to do
---Update following---
You can use sprite to create CollisionPolygon2D in code. Like the following:
var loadimg = Image.new()
loadimg.load("your_img_path")
var bitmap = BitMap.new()
bitmap.create_from_image_alpha(loadimg)
var polygons = bitmap.opaque_to_polygons(Rect2(Vector2(0,0), bitmap.get_size()))
for polygon in polygons:
var collider = CollisionPolygon2D.new()
collider.polygon = polygon
call_deferred("add_child", collider)
collider.position = $Sprite.position
---New update---
Use function call_deferred
is for safe.
If you really care timer, you can try using multiple threads.