GunController
unknown
csharp
3 years ago
4.5 kB
10
Indexable
using System.Collections; using UnityEngine; using UnityEngine.UI; public class GunController : MonoBehaviour { [Header("Gun Settings")] public float fireRate = 0.1f; public int clipSize = 30; public int reservedAmmoCapacity = 270; public float damage = 10f; public float range = 500f; public Camera fpsCam; public ParticleSystem muzzleFlash; //Variables that change throughout code private bool _canShoot; private int _currentAmmoInClip; private int _ammoInReserve; //Muzzleflash public Image muzzleFlashImage; public Sprite[] flashes; //Aiming public Vector3 normalLocalPosition; public Vector3 aimingLocalPosition; public float aimSmoothing = 10; [Header("Mouse Settings")] public float mouseSensitivity = 1; private Vector2 _currentRotation; public float weaponSwayAmount = 10; //Weapon Recoil public bool randomizeRecoil; public Vector2 randomRecoilConstraints; //You only need to assign this if randomize recoil is off public Vector2[] recoilPattern; private void Start() { _currentAmmoInClip = clipSize; _ammoInReserve = reservedAmmoCapacity; _canShoot = true; } private void Update() { DetermineAim(); DetermineRotation(); if (Input.GetMouseButton(0) && _canShoot && _currentAmmoInClip > 0) { _canShoot = false; _currentAmmoInClip--; StartCoroutine(ShootGun()); } else if (Input.GetKeyDown(KeyCode.R) && _currentAmmoInClip < clipSize && _ammoInReserve > 0) { int amountNeeded = clipSize - _currentAmmoInClip; if (amountNeeded >= _ammoInReserve) { _currentAmmoInClip += _ammoInReserve; if (_ammoInReserve < 0) _ammoInReserve = 0; } else { _currentAmmoInClip = clipSize; _ammoInReserve -= amountNeeded; } } } private void DetermineRotation() { Vector2 mouseAxis = new Vector2(Input.GetAxisRaw("Mouse X"), Input.GetAxisRaw("Mouse Y")); mouseAxis *= mouseSensitivity; _currentRotation += mouseAxis; _currentRotation.y = Mathf.Clamp(_currentRotation.y, -90, 90); transform.localPosition += (Vector3)mouseAxis * weaponSwayAmount / 1000; transform.root.localRotation = Quaternion.AngleAxis(_currentRotation.x, Vector3.up); transform.parent.localRotation = Quaternion.AngleAxis(-_currentRotation.y, Vector3.right); } private void DetermineAim() { Vector3 target = normalLocalPosition; if (Input.GetMouseButton(1)) target = aimingLocalPosition; Vector3 desiredPosition = Vector3.Lerp(transform.localPosition, target, Time.deltaTime * aimSmoothing); transform.localPosition = desiredPosition; } private void DetermineRecoil() { transform.localPosition -= Vector3.forward * 0.1f; if (randomizeRecoil) { float xRecoil = Random.Range(-randomRecoilConstraints.x, randomRecoilConstraints.x); float yRecoil = Random.Range(-randomRecoilConstraints.y, randomRecoilConstraints.y); Vector2 recoil = new Vector2(xRecoil, yRecoil); _currentRotation += recoil; } else { int currentStep = clipSize + 1 - _currentAmmoInClip; currentStep = Mathf.Clamp(currentStep, 0, recoilPattern.Length - 1); _currentRotation += recoilPattern[currentStep]; } } private IEnumerator ShootGun() { DetermineRecoil(); muzzleFlash.Play(); RaycastForEnemy(); yield return new WaitForSeconds(fireRate); _canShoot = true; } private void RaycastForEnemy() { RaycastHit hit; Debug.DrawRay(fpsCam.transform.position, fpsCam.transform.forward, Color.green, 10, false); if (Physics.Raycast(fpsCam.transform.position, fpsCam.transform.forward, out hit, range, LayerMask.GetMask("Enemy"))) { Debug.Log(hit.transform.name); Target target = hit.transform.GetComponent<Target>(); if (target != null) { target.TakeDamage(damage); } } } }
Editor is loading...