// called when we want to shoot a bullet public void Shoot() { lastShootTime = Time.time; //audioSource.PlayOneShot(shootSfx); if (isPlayer) { // https://docs.unity3d.com/ScriptReference/RaycastHit-point.html var ray = cam.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out RaycastHit hitInfo)) { if (hitInfo.point.z < muzzle.position.z) // if the hit was closer to the camera than the muzzle { return; // do not fire } SpawnableObject bullet = bulletSpawner.Get(bulletIndex); bullet.transform.position = muzzle.position; Vector3 dir = (hitInfo.point - muzzle.position).normalized; bullet.GetComponent <Rigidbody>().velocity = dir * bulletSpeed; } else // if the raycast misses any object { Vector3 aimed = cam.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 40)); SpawnableObject bullet = bulletSpawner.Get(bulletIndex); bullet.transform.position = muzzle.position; Vector3 dir = (aimed - muzzle.position).normalized; bullet.GetComponent <Rigidbody>().velocity = dir * bulletSpeed; } } else // if an enemy { SpawnableObject bullet = bulletSpawner.Get(bulletIndex); bullet.transform.position = muzzle.position; Vector3 dir = (target.transform.position - muzzle.position).normalized; bullet.GetComponent <Rigidbody>().velocity = dir * bulletSpeed; } }