I've searched through internet a lot for a simple recoil system but haven't found anything smooth, so I'd rather share it even though it took me so long to fix it
void CalculateShakeAndDoRecoil()
{
if (Recoil > 0.0f)
{
Quaternion MaxRecoil = new Quaternion(
Random.Range(GameCamera.transform.localRotation.x, GameCamera.transform.localRotation.x + MaxRecoil_X),
Random.Range(GameCamera.transform.localRotation.y - MaxRecoil_Y, GameCamera.transform.localRotation.y + MaxRecoil_Y),
GameCamera.transform.localRotation.z, GameCamera.transform.localRotation.w);
//Rotating GameCamera to the Punchangle rotation
GameCamera.transform.localRotation = Quaternion.Slerp(GameCamera.transform.localRotation, MaxRecoil, Time.deltaTime * RecoilSpeed);
Vector3 maxTranslation = new Vector3(
Random.Range(GameCamera.transform.localPosition.x, MaxTrans_X),
GameCamera.transform.localPosition.y,
Random.Range(GameCamera.transform.localPosition.z, MaxTrans_Z));
Debug.Log(Recoil);
Recoil -= Time.deltaTime;
}
else
{
Recoil = 0.0f;
Quaternion MinRecoil = Quaternion.Euler(Random.Range(0,
GameCamera.transform.localRotation.x),
Random.Range(0, GameCamera.transform.localRotation.y),
GameCamera.transform.localRotation.z);
//Rotating GameCamera back to its solid rotation (the rotation without the punchangle)
GameCamera.transform.localRotation = Quaternion.Slerp(GameCamera.transform.localRotation,
OriginalCameraTransform.transform.localRotation,
Time.deltaTime * RecoilRecoverySpeed / 2.0f);
}
}