- Home /
Spray Shot Script
I'm trying to make a bullet spray script but for some reason it only fires in a single direction, no matter how the character turns around. Any reason for this?
/// Add spread shot
var rotation : Quaternion = Quaternion.identity;
rotation.eulerAngles = Random.insideUnitSphere * 10;
transform.rotation = rotation;
var BulletShot = Instantiate(Bullet, transform.position, transform.rotation);
BulletShot.rigidbody.AddForce(transform.forward * 1000);
Does the shot always shoot in the same direction in the worldspace or is it always shooting "forward" dependant on the character rotation?
Answer by 3dDude · Feb 15, 2011 at 08:44 PM
Ok, if I get what your talking about... Then this should work:
var gunRecoil : float;
var BulletShot = Instantiate(Bullet, transform.position, transform.rotation);
var randomX = Random.Range(-gunRecoil,gunRecoil); var randomY = Random.Range(-gunRecoil,gunRecoil);
var dir = transform.TransformDirection(randomX,randomY,1000); BulletShot.rigidbody.AddForce(dir);
move the gunRecoil variable to the first line of the script.
Hope this helps!
Also, I would instead of setting force, set the velocity manually:
BulletShot.rigidbody.velocity = dir;
Also there might be some errors... I have not tried it in unity yet.
Hope this helps!
Ok, well ins$$anonymous$$d of trying to rotate the point where the bullets a created... Why not just move there velocity to a random x y? So what the code does is ins$$anonymous$$d of moving forward it creates a direction that sets the x and y component to be a random value some where between -gunRecoil and +gunRecoil. I have never used rigidbody force to move bullets so I don't know what it should be... But I am guessing something like 100. Please trying setting it to a wide range of numbers to test it.
Hope this helps!
Answer by Bunny83 · Feb 16, 2011 at 04:12 AM
I guess this script is attached to your weapon?
By setting Transform.rotation the object will be rotated in world space. To rotate it relative to the parent use Transform.localRotation.
And second: you can assign eulerAngles but they don't wrap around automatically. You will get an error/warning when you try to set them to values outside [0..360]. Use the built in function Quaternion.Euler instead.
var rotation : Quaternion = Quaternion.Euler(Random.insideUnitSphere * 10);
transform.localRotation = rotation;
var BulletShot = Instantiate(Bullet, transform.position, transform.rotation);
BulletShot.rigidbody.AddForce(transform.forward * 1000);
ps. I like your way to calculate the spreading ;)
The z rotation is not really useful but a bullet don't have a top-side you have to keep up.
If this script is on your weapon, the weapon gets also rotated. if you don't want the z rotation, just set the z value to 0.
var rotation : Quaternion = Quaternion.Euler(Random.insideUnitSphere * 10);
rotation.eulerAngles.z = 0;
transform.localRotation = rotation;
[...]
$$anonymous$$ake sure that your instantiated objects don't spawn inside of another collider. Otherwise the objects will spread randomly. And to clear things up: forward have to be z-axis (blue), up is y-axis (green) and x-axis is right (red). When you test in the editor you can select the objects during the game. Switch to the scene view or tile the windows so you see both (game view and scene view).
I made sure. It looks like the firepoint is off by about 45 degrees
Answer by Sebas · Feb 16, 2011 at 10:53 AM
A similar question has been answered before. Try this.
The answer you gave on that question was similar to $$anonymous$$e.
I'm aware of that. But for the sake of keeping things tidy, I prefer to use existing questions/answers as a reference. It should re$$anonymous$$d the person asking the question to do a thorough search first.
Your answer
Follow this Question
Related Questions
Firing flame balls with animation and particles 2 Answers
Audio when I shoot 3 Answers
Tap Where To Shoot 2D 1 Answer
Enemy Instantiating one bullet 3 Answers