void Shoot()
    {
        // Find target position
        Vector3 targetPosition = ComputeTargetPosition();

        // Shoot
        GameObject instance         = Instantiate(bullet, transform.position + bulletOffset, Quaternion.identity);
        float      distanceToTarget = (targetPosition - instance.transform.position).magnitude;
        float      time             = distanceToTarget / bulletSpeed;
        Vector3    gravityOffset    = Vector3.zero;
        Vector3    velocity         = Vector3.zero;

        for (float i = 0; i < time; i += Time.fixedDeltaTime)
        {
            velocity      += -Physics.gravity * Time.fixedDeltaTime;
            gravityOffset += velocity * Time.fixedDeltaTime;
        }
        Vector3 direction = (targetPosition + gravityOffset - instance.transform.position).normalized;

        instance.GetComponent <ChaserBullet>().velocity = direction * bulletSpeed;

        // Fire delay
        nextFire = Time.time + fireDelay;
        reticle.Charge(fireDelay);
    }
 // Start is called before the first frame update
 void Start()
 {
     rb               = GetComponent <Rigidbody>();
     reticle          = canvas.transform.GetChild(0).GetComponent <Reticle>();
     animator         = GetComponent <Animator>();
     gManager         = FindObjectOfType <GManager>();
     reticleTransform = reticle.GetComponent <RectTransform>();
     reticleHeight    = reticleTransform.anchoredPosition.y;
     audioSource      = GetComponent <AudioSource>();
     reticle.Charge(fireDelay * 3);
     nextFire = Time.time + fireDelay * 3;
 }