Ejemplo n.º 1
0
 void Update()
 {
     if (projectile != null)
     {
         var vel = projectile.GetComponent <Rigidbody>().velocity;
         if (vel == Vector3.zero)
         {
             return;
         }
         var pos = projectile.transform.position;
         position = Mechanics.FinalProjectilePosition(pos, vel, yIntersect);
         OnPredict.Invoke(position);
     }
 }
Ejemplo n.º 2
0
        public override void Invoke()
        {
            var targetRb   = target.GetComponent <Rigidbody>();
            var horizDist  = Vector3.Magnitude(target.position.XZ() - transform.position.XZ());
            var outOfRange = horizDist > settings.range;

            if (outOfRange && !settings.launchWhenOutOfRange)
            {
                return;
            }

            var rangeDist = Mathf.Clamp(horizDist, 0, settings.range);
            var horizVel  = (targetRb == null || !settings.scaleVelocity)
                        ? settings.horizontalVelocity
                        : settings.horizontalVelocity * rangeDist + settings.horizontalVelocity * targetRb.velocity.XZ().magnitude;

            var desiredTarget = (targetRb == null)
                        ? target.position
                        : Mechanics.ProjectileTargetNextPosition(transform.position, target.position, targetRb.velocity, horizVel);


            var clampedTarget = transform.position + Vector3.ClampMagnitude(desiredTarget - transform.position, settings.range);

            projectileTarget = clampedTarget;

            var randomPos = projectileTarget + Random.insideUnitSphere * settings.randomRadius;
            var vel       = Mechanics.ProjectileVelocity(transform.position, randomPos, horizVel);

            transform.rotation = Quaternion.LookRotation(vel.normalized, Vector3.up);

            var go        = GameObject.Instantiate(settings.projectilePrefab, cannon.position, Quaternion.identity);
            var rigidBody = go.GetComponent <Rigidbody>();

            rigidBody.AddForce(vel, ForceMode.Impulse);
            onLaunch.Invoke(go);
        }