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); } }
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); }