Question by
anhadpreetsingh · Jun 03, 2020 at 09:05 AM ·
scripting problembeginnerframeraterecoil
My recoil isn't framerate independent
I tried making a simple recoil script and it doesn't seem to be frame-rate independent. The gun recoils a lot harder at low frame-rates. Any help is appreciated.
The code i wrote is as follows:
public class Firing : MonoBehaviour
{
void Awake()
{
QualitySettings.vSyncCount = 0; // VSync must be disabled
Application.targetFrameRate = 45;
}
[SerializeField] float timeBetweenBullets = 1f;
[SerializeField] float recoilSpeed = 2f;
[SerializeField] float returnSpeed = 1f;
Vector3 originalPos;
float timeSinceLastFired = Mathf.Infinity;
private void Start()
{
originalPos = transform.localPosition;
}
private void Update()
{
if(Input.GetMouseButton(0))
{
if(timeSinceLastFired >= timeBetweenBullets)
{
// implement firing
print("firing");
StartRecoil();
timeSinceLastFired = 0f;
}
}
timeSinceLastFired += Time.deltaTime;
transform.localPosition = Vector3.MoveTowards(transform.localPosition, originalPos, returnSpeed * Time.deltaTime);
}
private void StartRecoil()
{
float zRecoil = transform.localPosition.z - Random.Range(0.1f, 0.2f);
float yRecoil = transform.localPosition.y + Random.Range(0.1f, 0.2f);
float xRecoil = transform.localPosition.x + Random.Range(-0.03f, 0.03f);
Vector3 recoilPos = new Vector3(xRecoil, yRecoil, zRecoil);
transform.localPosition = Vector3.MoveTowards(transform.localPosition, recoilPos, recoilSpeed * Time.deltaTime);
}
}
Comment
Answer by SteenPetersen · Jun 03, 2020 at 09:05 AM
You can try something like this:
Vector3 originalPos;
float currentRecoilTime = 0;
bool isRecoil;
Vector3 recoilPosition;
[SerializeField] private float amplitude = 1f;
[SerializeField] private float period = 0.3f;
protected void Start()
{
originalPos = transform.localPosition;
}
protected void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
Recoil();
}
if (isRecoil)
{
currentRecoilTime += Time.deltaTime;
float theta = currentRecoilTime / period;
float distance = amplitude * Mathf.Sin(theta);
transform.localPosition = originalPos + recoilPosition * distance;
if (distance <= 0)
{
isRecoil = false;
currentRecoilTime = 0;
}
}
}
private void Recoil()
{
recoilPosition = new Vector3(transform.localPosition.z - Random.Range(0.1f, 0.2f),
transform.localPosition.y + Random.Range(0.1f, 0.2f),
transform.localPosition.x + Random.Range(-0.03f, 0.03f));
isRecoil = true;
}
Result:
recoil.gif
(449.3 kB)
Your answer
Follow this Question
Related Questions
Rigidbody player gets stuck on walls in Unity 3D project. 0 Answers
arrow from text to object - complete beginner 0 Answers
why the Timer isn't working 0 Answers
I can't figure out why this variable is not updating 0 Answers
Activating a gameobject from a script attached to a different gameobject. 1 Answer