Gun recoil with mouse look script help
I have added my mouselookscript to the spine of my model, and have made the camera a child of the spine. so when I look around my character looks up and down.
I would like to add recoil to my spine when i shoot a gun but my mouseLookscript won't let me change the rotation of my character model's spine and applying it to a child will mess with my clamp.
Is there anyway I could apply recoil to the spine of my model?
here is my mouse look script
using UnityEngine;
// Very simple smooth mouselook modifier for the MainCamera in Unity
// by Francis R. Griffiths-Keam - www.runningdimensions.com
[AddComponentMenu("Camera/Simple Smooth Mouse Look ")]
public class SimpleSmoothMouseLook : MonoBehaviour
{
Vector2 _mouseAbsolute;
Vector2 _smoothMouse;
public Vector2 clampInDegrees = new Vector2(360, 180);
public bool lockCursor;
public Vector2 sensitivity = new Vector2(2, 2);
public Vector2 smoothing = new Vector2(3, 3);
public Vector2 targetDirection;
public Vector2 targetCharacterDirection;
// Assign this if there's a parent object controlling motion, such as a Character Controller.
// Yaw rotation will affect this object instead of the camera if set.
public GameObject characterBody;
void Start()
{
// Set target direction to the camera's initial orientation.
targetDirection = transform.localRotation.eulerAngles;
// Set target direction for the character body to its inital state.
if (characterBody)
{
targetCharacterDirection = characterBody.transform.localRotation.eulerAngles;
}
}
void Update()
{
// Ensure the cursor is always locked when set
Cursor.lockState = CursorLockMode.Locked;
// Allow the script to clamp based on a desired target value.
var targetOrientation = Quaternion.Euler(targetDirection);
var targetCharacterOrientation = Quaternion.Euler(targetCharacterDirection);
// Get raw mouse input for a cleaner reading on more sensitive mice.
var mouseDelta = new Vector2(Input.GetAxisRaw("Mouse X"), Input.GetAxisRaw("Mouse Y"));
// Scale input against the sensitivity setting and multiply that against the smoothing value.
mouseDelta = Vector2.Scale(mouseDelta, new Vector2(sensitivity.x * smoothing.x, sensitivity.y * smoothing.y));
// Interpolate mouse movement over time to apply smoothing delta.
_smoothMouse.x = Mathf.Lerp(_smoothMouse.x, mouseDelta.x, 1f / smoothing.x);
_smoothMouse.y = Mathf.Lerp(_smoothMouse.y, mouseDelta.y, 1f / smoothing.y);
// Find the absolute mouse movement value from point zero.
_mouseAbsolute += _smoothMouse;
// Clamp and apply the local x value first, so as not to be affected by world transforms.
if (clampInDegrees.x < 360)
_mouseAbsolute.x = Mathf.Clamp(_mouseAbsolute.x, -clampInDegrees.x * 0.5f, clampInDegrees.x * 0.5f);
// Then clamp and apply the global y value.
if (clampInDegrees.y < 360)
_mouseAbsolute.y = Mathf.Clamp(_mouseAbsolute.y, -clampInDegrees.y * 0.5f, clampInDegrees.y * 0.5f);
var xRotation = Quaternion.AngleAxis(-_mouseAbsolute.y, targetOrientation * Vector3.right);
transform.localRotation = xRotation;
transform.localRotation *= targetOrientation;
// If there's a character body that acts as a parent to the camera
if (characterBody)
{
var yRotation = Quaternion.AngleAxis(_mouseAbsolute.x, characterBody.transform.up);
characterBody.transform.localRotation = yRotation;
characterBody.transform.localRotation *= targetCharacterOrientation;
}
else
{
var yRotation = Quaternion.AngleAxis(_mouseAbsolute.x, transform.InverseTransformDirection(Vector3.up));
transform.localRotation *= yRotation;
}
}
}
and here is my gun script
using UnityEngine;
using System.Collections;
public class Weapon : MonoBehaviour
{
SimpleSmoothMouseLook mouseLook;
public Camera mainCamera;
//Aim down sights variables
public Vector3 aimDownSightsPos;
public Vector3 aimDownSightsRot;
public float aimSpeed;
public Vector2 aimSensitivity;
public float aimfieldOfView;
//Gun variables
public float fireRate;
float coolDown;
public int damage;
//Effects
public GameObject blood;
public ParticleSystem muzzleFlash;
public float xRecoil;
public Transform objectToApplyRecoil;
// Use this for initialization
void Start()
{
mainCamera = Camera.main;
}
// Update is called once per frame
void Update()
{
coolDown -= Time.deltaTime;
if (Input.GetKey(KeyCode.Mouse1))
{
transform.localPosition = Vector3.Lerp(transform.localPosition, aimDownSightsPos, aimSpeed * Time.deltaTime);
transform.localRotation = Quaternion.Lerp(transform.localRotation,Quaternion.Euler(aimDownSightsRot.x,aimDownSightsRot.y,aimDownSightsRot.z),aimSpeed * Time.deltaTime);
mainCamera.fieldOfView = 60;
//mouseLook.sensitivity = aimSensitivity;
}
if (!Input.GetKey(KeyCode.Mouse1))
{
transform.localPosition = Vector3.Lerp(transform.localPosition, Vector3.zero, aimSpeed * Time.deltaTime);
transform.localRotation = Quaternion.Lerp(transform.localRotation, Quaternion.identity, aimSpeed * Time.deltaTime);
mainCamera.fieldOfView = 60;
//mouseLook.sensitivity = aimSensitivity;
}
if (Input.GetKey(KeyCode.Mouse0))
{
if(coolDown <= 0)
{
RaycastHit hit;
if (Physics.Raycast(Camera.main.transform.position,Camera.main.transform.forward,out hit))
{
objectToApplyRecoil.eulerAngles -= new Vector3(xRecoil, 0, 0);
muzzleFlash.Play();
if (hit.collider.tag == "Zombie")
{
hit.collider.gameObject.GetComponent<HealthPoints>().TakeDamage(damage);
Instantiate(blood, hit.point, Quaternion.LookRotation(hit.normal));
muzzleFlash.Play();
}
}
else
{
objectToApplyRecoil.eulerAngles -= new Vector3(xRecoil, 0, 0);
muzzleFlash.Play();
}
coolDown = fireRate;
}
}
}
}
Comment
Your answer
Follow this Question
Related Questions
Changing character X axis rotation so that gun points at target issue 0 Answers
How to add recoil to this script? 0 Answers
Gun recoil? 0 Answers
How do i just rotate the gun while it should follow the camera? 0 Answers
How To Keep My Weapon With My Camera? 2 Answers