using UnityEngine; public class BallShooter : MonoBehaviour { public GameObject ballPrefab; public Transform shootPoint; [Header("Flick Sensitivity")] [Tooltip("How much the swipe affects forward speed.")] public float forwardSensitivity = 0.05f; [Tooltip("How much the swipe affects upward loft.")] public float upwardSensitivity = 0.02f; [Tooltip("How much side-to-side swipe affects lateral direction.")] public float lateralSensitivity = 0.03f; [Header("Physics Tuning")] [Tooltip("Minimum swipe velocity required to trigger a shot.")] public float swipeThreshold = 100f; [Tooltip("Maximum velocity allowed (prevents physics glitches).")] public float maxVelocity = 1500f; [Tooltip("Constant upward force added to every shot for a better arc.")] public float baseUpwardBias = 2f; public void FlickShoot(Vector2 swipeDelta, float swipeTime) { // Calculate velocity (pixels per second) Vector2 swipeVelocity = swipeDelta / swipeTime; float speed = swipeVelocity.magnitude; // 1. Deadzone check: Ignore tiny accidental flicks if (speed < swipeThreshold) return; // 2. Clamp: Prevent extreme speeds if (speed > maxVelocity) { swipeVelocity = swipeVelocity.normalized * maxVelocity; } GameObject newBall = Instantiate(ballPrefab, shootPoint.position, shootPoint.rotation); Rigidbody rb = newBall.GetComponent(); // 3. Translate 2D swipe to 3D force // swipeVelocity.y is vertical (up is positive) // swipeVelocity.x is horizontal (right is positive) float forwardForce = swipeVelocity.y * forwardSensitivity; float upwardForce = (swipeVelocity.y * upwardSensitivity) + baseUpwardBias; float lateralForce = swipeVelocity.x * lateralSensitivity; Vector3 force = (shootPoint.forward * forwardForce) + (Vector3.up * upwardForce) + (shootPoint.right * lateralForce); // Apply as Impulse for immediate movement rb.AddForce(force, ForceMode.Impulse); Destroy(newBall, 5f); } }