- Home /
spraying bullets
ive been working on an fps game in unity for some time now but i dont know how to spray my bullets instead of the bullets going straight forward which isnt very realistic.
can anyone help me with?
Answer by Rennat · Dec 05, 2010 at 05:58 PM
You'll need to use Random. I write code better than I write sentences:
public var maxDivergence : float = 5; // The amount in degrees the bullet can be "off" center
function Shoot() {
// start with a perfect shot
var divergence : Vector3 = Vector3.zero;
// then we want to randomize the rotation around the X axis
divergence.x = (1 - 2 * Random.value) * maxDivergence;
// and the rotation around the Y axis
divergence.y = (1 - 2 * Random.value) * maxDivergence;
/* Random.value only gives you a positive float between 0 and 1
* (1 - 2 * Random.value) makes that between -1 and 1
*/
// instantiate the bullet
var bullet : Transform = (Transform) Instantiate(bulletPrefab, transform.position, transform.rotation);
// now we'll apply the divergence
bullet.Rotate(divergence);
}
It would be more efficient to make the Quaternion rotation before instantiating the prefab but Quaternions scare me. I'm making this a Wiki maybe someone will add it in.
Also check out the answers on this question http://answers.unity3d.com/questions/5602/fps-gun-accuracy-bullet-tracers
Thanks, I've tried this, but it gives me a rectangular spread, ins$$anonymous$$d of the expected circular one. That is, if I were too shoot 10,000 bullets with this, the damage would look like a square, not a circle.
Answer by TackCo · Jan 24, 2017 at 08:07 AM
@Rennat, Since I can't add a reply for some reason, I will post it as a separate answer. I enjoy that there is a script that uses angles instead of vector movement. This way, the gun will be less accurate at distance. A simple vector movement means that while the gun will be inaccurate, it will be just as inaccurate at infinity distance than at point blank distance. Thanks!
Answer by FPSworrior · Dec 07, 2018 at 11:46 PM
Heres the script that I use for my weapons. It may not be efficient but it does get great results.
public float accuracy;
public float aimAccuracy;
public float hipAccuracy;
private Quaternion shotAcc;
public Transform shotPoint;
if(Input.GetKey(KeyCode.Mouse1))
{
accuracy = aimAccuracy;
camObj.fieldOfView = 40;
}
else
{
camObj.fieldOfView = 50;
accuracy = hipAccuracy;
}
if (semiauto == true && !isReloading)
{
if (Input.GetKeyDown(KeyCode.Mouse0) && !Input.GetKey(KeyCode.LeftShift) && Time.time > nextFire)
{
if (magAmmo > 0)
{
shotAcc = Quaternion.Euler(Random.Range(-accuracy, accuracy), Random.Range(-accuracy, accuracy), 0);
shotPoint.localRotation = shotAcc;
Shot();
shotSound.Play();
magAmmo--;
shotsFired++;
muzzleFlash.Play();
}
}
}