void Update() { if (GameManager.manager.balls == 0 || GameManager.manager.state != State.Playing) { return; } int shooterMask = LayerMask.GetMask("Shooter"); var cam = Camera.main; var origin = cam.transform.position; var p = Input.mousePosition; p.z = cam.transform.position.x; var mousePos = cam.ScreenToWorldPoint(p); var direction = mousePos - cam.transform.position; direction.Normalize(); hover = Physics.Raycast(new Ray(origin, direction), 20000, shooterMask); if (Input.GetMouseButtonDown(0) && hover) { curProjectile = CreateProjectile(); sling.SlingProjectile(curProjectile); brush.target = curProjectile.transform; } else if (Input.GetMouseButtonUp(0)) { if (curProjectile) { var projectileToSpawn = spawnPoint.transform.position - curProjectile.transform.position; if (projectileToSpawn.magnitude > minStretchDist) { curProjectile.GetComponent <Die>().enabled = true; var projectileRigidbody = curProjectile.GetComponent <Rigidbody>(); projectileRigidbody.isKinematic = false; projectileRigidbody.AddForce(projectileToSpawn * launchForce); curProjectile = null; sling.FireProjectile(); brush.target = null; brush.Jiggle(); GameManager.manager.FiredBall(); if (Random.value >= 0.8f) { var clip = rossoQuotes[Random.Range(0, rossoQuotes.Length)]; Camera.main.GetComponent <AudioSource>().PlayOneShot(clip); } } else { Destroy(curProjectile); curProjectile = null; sling.SlingProjectile(null); brush.target = null; } } } if (curProjectile) { var projectilePos = mousePos; projectilePos.z = Mathf.Min(mousePos.z, spawnPoint.transform.position.z); var spawnToProjectile = projectilePos - spawnPoint.transform.position; if (spawnToProjectile.magnitude > maxStretchDist) { spawnToProjectile.Normalize(); spawnToProjectile *= maxStretchDist; } float angle = Vector3.SignedAngle(spawnToProjectile, Vector3.forward, Vector3.right); float clampedAngle = angle; if (angle < 0 && Mathf.Abs(angle) < 180.0f - maxBotttomStretchAngle) { clampedAngle = -(180.0f - maxBotttomStretchAngle); } if (angle > 0 && Mathf.Abs(angle) < 180.0f - maxTopStretchAngle) { clampedAngle = (180.0f - maxTopStretchAngle); } spawnToProjectile = new Vector3(spawnToProjectile.x, Mathf.Sin(clampedAngle * Mathf.Deg2Rad), Mathf.Cos(clampedAngle * Mathf.Deg2Rad)) * spawnToProjectile.magnitude; projectilePos = spawnPoint.transform.position + spawnToProjectile; curProjectile.transform.position = projectilePos; } }