Code: Select all
→ WeaponHolder (child of Main Camera, stores all my guns and has a script to manage them)
→ Gun #1, Gun #2, etc (all child objects of the WeaponHolder)
Code: Select all
using UnityEngine;
public class CameraFunctionality : MonoBehaviour
{
public float defaultMouseSensX = 2f;
public float defaultMouseSensY = 2f;
public Transform headBone;
public Vector3 cameraOffset = new Vector3(0f, 0.1f, 0f);
private Transform cam;
private Quaternion targetRotation;
public float rotationX = 0f;
public float rotationY = 0f;
public WeaponManager weaponManager;
[HideInInspector] public bool isClimbing = false;
public Recoil recoil;
public float mouseX;
public float mouseY;
public Aiming aim;
public float cameraRecoilY = 0f;
[SerializeField] public Transform weaponHolder;
[SerializeField] private Vector3 weaponHolderOffset = Vector3.zero;
void Start()
{
cam = Camera.main.transform;
Cursor.lockState = CursorLockMode.Locked;
}
void Update()
{
Weapon currentWeapon = weaponManager.GetCurrentWeapon();
float baseSensX = currentWeapon ? currentWeapon.baseMouseSensX : defaultMouseSensX;
float baseSensY = currentWeapon ? currentWeapon.baseMouseSensY : defaultMouseSensY;
float aimMultiplier = currentWeapon ? currentWeapon.aimSensitivityMultiplier : 1f;
float currentSensX = aim.isAiming ? baseSensX * aimMultiplier : baseSensX;
float currentSensY = aim.isAiming ? baseSensY * aimMultiplier : baseSensY;
mouseX = Input.GetAxisRaw("Mouse X") * currentSensX;
mouseY = Input.GetAxisRaw("Mouse Y") * currentSensY;
rotationY += mouseX;
rotationX -= mouseY;
rotationX = Mathf.Clamp(rotationX, -85f, 85f);
cam.position = headBone.position + cameraOffset;
if (!isClimbing)
{
targetRotation = Quaternion.AngleAxis(rotationY, Vector3.up);
transform.rotation = targetRotation;
}
cam.rotation = Quaternion.Euler(rotationX, rotationY + cameraRecoilY, 0f);
if (weaponHolder != null)
{
weaponHolder.position = cam.position + weaponHolderOffset;
weaponHolder.rotation = cam.rotation;
}
}
}