public override void Setup(
            IGameEntity attacker,
            CharacterItem weapon,
            Dictionary <DamageElement, MinMaxFloat> damageAmounts,
            BaseSkill skill,
            short skillLevel,
            float missileDistance,
            float missileSpeed,
            IDamageableEntity lockingTarget)
        {
            base.Setup(attacker, weapon, damageAmounts, skill, skillLevel, missileDistance, missileSpeed, lockingTarget);

            //Initial configuration
            inipos   = this.transform.position;
            collided = false;

            //Configuration bullet and effects
            if (ProjectileObject)
            {
                ProjectileObject.SetActive(true);
            }
            if (ImpactEffect && !instantiateImpact)
            {
                ImpactEffect.SetActive(false);
                iniImpactEffectPos = ImpactEffect.transform.localPosition;
            }
            if (disappearEffect && !instantiateDisappear)
            {
                disappearEffect.SetActive(false);
            }

            //Movement
            Vector3 targetPos = inipos + (this.transform.forward * missileDistance);

            if (lockingTarget != null && lockingTarget.CurrentHp > 0)
            {
                targetPos = lockingTarget.GetTransform().position;
            }

            float dist    = Vector3.Distance(inipos, targetPos);
            float yOffset = -transform.forward.y;

            if (recalculateSpeed)
            {
                missileSpeed = LaunchSpeed(dist, yOffset, Physics.gravity.magnitude, angle * Mathf.Deg2Rad);
            }

            if (useAngle)
            {
                this.transform.eulerAngles = new Vector3(-angle, this.transform.eulerAngles.y, this.transform.eulerAngles.z);
            }

            bulletVelocity = this.transform.forward * missileSpeed;
        }