- Home /
CS:GO-like recoil
Hi, I am trying to make gun spray pattern recoil like CS:GO.
I was thinking maybe I can cycle through a Vector3 Array. But I Don't know how to lerp from one Vector3 to another to another
I was thinking doing something like
public class Recoil : MonoBehaviour {
public Vector3[] sprayPattern;
public float speed = 5f;
public void Recoiling()
{
Vector3.Lerp (sprayPattern [0], sprayPattern [1], speed);
Vector3.Lerp (sprayPattern [1], sprayPattern [2], speed);
Vector3.Lerp (sprayPattern [2], sprayPattern [3], speed);
}
}
And I would call the Recoiling() Function in my weapon Script.
But Then I was thinking, what if I have more than 4 Vector3s in my array.
Essentially, I need help getting a spray pattern like CS:GO
Oh and, animations won't work for this.
Answer by TheSOULDev · Sep 10, 2017 at 07:13 PM
From what I understand, you need something like this:
for(int i = 0; i < sprayPattern.Length - 1; i++)
Vector3.Lerp(SprayPattern[i], SprayPattern[i + 1], speed);
However, I'm fairly sure that CS:GO doesn't handle recoil like that. In fact, your code doesn't even do anything.
What would make more sense to me would be
Vector3 offset;
for(int i = 0; i < sprayPattern.Length - 1; i++)
offset += Vector3.Lerp(SprayPattern[i], SprayPattern[i + 1], speed * (isRunning ? coefficient : 1));
public class Recoil : $$anonymous$$onoBehaviour {
public Vector3[] sprayPattern;
public float speed = 5f;
public Transform cam;
public void Recoiling()
{
for (int i = 0; i < sprayPattern.Length; i++)
{
cam.localPosition = Vector3.Lerp (sprayPattern [i], sprayPattern [i + 1], speed);
}
}
}
Weapon:
if (shootInput)
{
if (currentBullets > 0)
{
Fire ();
recoilScript.Recoiling ();
}
else if(bulletsLeft > 0 && !info.IsName("Reload"))
DoReload ();
}
And what is the isRunning and coefficient variables from?
In CS:GO, your recoil is much much higher, on top of having worse accuracy when you're moving (especially running). Coefficient variables are something you implement yourself. However, you're trying to implement recoil with no variables whatsoever. You should first create a gun system that has variables like accuracy, recoil, firing rate etc. Then, first your system should deter$$anonymous$$e how your gun shoots depending on accuracy. Let's say you have 0-100 accuracy. 0 Accuracy means your gun shoots wherever. 100 accuracy means that your gun shoots perfectly straight. So your shooting script would first calculate the offset at which your gun shoots without any recoil. This would look something like this:
public class GunStats()
{
ushort AmmoCapacity;
byte Accuracy;
byte Recoil; //You can add many more.
public GunStats(ushort capacity, byte accuracy, byte recoil)
{
AmmoCapacity = capacity:
Accuracy = accuracy;
Recoil = recoil;
}
}
Then you should create a straight shot offset script. Something like this:
Vector2 AccuracyOffset(GunStats UsingGun)
{
return Random.Range(0, (100 - Gunstats.Accuracy) * 1000) / 100000) * (new Vector2(Random.Range(-1000, 1000), Random.Range(-1000, 1000)).normalized);
}
Of course the above is just a very crude way of describing such behaviour, but you probably get what I'm saying.
And only then would you go on to create a recoil system. The said recoil system should probably not use spray patterns as you would still need to create them, but be calculated on run time, based on aim movement and such (if you're spraying and your aim derivation is Vector2.up, then you should get higher recoil up than down etc.). Even if you want to blatantly copy CS:GO, you would still need to use the aforementioned accuracy system as no two spray patterns will be the same even if it truly is the same spray pattern on the same weapon.
Overall you're trying to tackle a big problem with inadequate code while not researching the matter by yourself (such as Vector3.Lerp). You should first try to learn exactly how recoil works and how games calculate the vector to send rays at, and then try to devise something. $$anonymous$$y code, of course, won't work if you just copy paste it because I neither create code which exists to be plagiarized, nor should you $$anonymous$$dlessly copy code without adjusting it to meet your needs. I was simply providing an example based on what I understood what your needs were from what you've initially said to describe your problem.
Your answer
Follow this Question
Related Questions
shooting laser to screen middle doesnt work... 1 Answer
Dart/Bullet comes out pointing up 1 Answer
Camera Recoil,Please help me. 2 Answers
FPS Run Animation Gun - Rotation Issue 0 Answers
Gun not rotating with the camera? 1 Answer