using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
public class Weapon : MonoBehaviour
{
public bool isActiveWeapon;
public int weaponDamage;
[Header("Shooting")]
//Shooting
public bool isShooting, readyToShoot;
bool allowReset = true;
public float shootingDelay = 2f;
[Header("Burst")]
//Burst
public int bulletsPerBurst = 3;
public int burstBulletsLeft;
[Header("Spread")]
//Spread
public float spreadIntensity;
public float hipSpreadIntensity;
public float adsSpreadIntensity;
[Header("Bullet")]
//Bullet
public GameObject bulletPrefab;
public Transform bulletSpawn;
public float bulletVelocity = 30;
public float bulletPrefabLifeTime = 3f;
public GameObject muzzleEffect;
internal Animator animator;
[Header("Loading")]
//Loading
public float reloadTime;
public int magazineSize, bulletsLeft;
public bool isReloading;
bool isADS;
[Header("In hand position and model/shooting mode")]
//In hand position
public Vector3 spawnPosition;
public Vector3 spawnRotation;
public enum WeaponModel
{
SVA_545,
FF_Magnum,
Glock,
Mosburger
}
public WeaponModel thisWeaponModel;
public enum ShootingMode
{
Single,
Burst,
Auto
}
public ShootingMode currentShootingMode;
private void Awake()
{
readyToShoot = true;
burstBulletsLeft = bulletsPerBurst;
bulletsLeft = magazineSize;
spreadIntensity = hipSpreadIntensity;
}
void Update()
{
if (isActiveWeapon)
{
foreach (Transform child in transform)
{
child.gameObject.layer = LayerMask.NameToLayer("WeaponRender");
}
if (Input.GetMouseButtonDown(1))
{
enterADS();
}
if (Input.GetMouseButtonUp(1))
{
exitADS();
}
GetComponent<Sway>().enabled = true;
GetComponent<Outline>().enabled = false;
if(bulletsLeft == 0 && isShooting)
{
SoundManager.Instance.emptyMagazine.Play();
}
if (currentShootingMode == ShootingMode.Auto)
{
//Holding Down Left Mouse Button
isShooting = Input.GetKey(KeyCode.Mouse0);
}
else if (currentShootingMode == ShootingMode.Single ||
currentShootingMode == ShootingMode.Burst)
{
//Clicking Left Mouse Button Once
isShooting = Input.GetKeyDown(KeyCode.Mouse0);
}
if(Input.GetKeyDown(KeyCode.R) && bulletsLeft < magazineSize && isReloading == false && WeaponManager.Instance.CheckAmmoLeftFor(thisWeaponModel) > 0)
{
Reload();
}
if (readyToShoot && isShooting && bulletsLeft > 0l)
{
burstBulletsLeft = bulletsPerBurst;
FireWeapon();
}
}
else
{
foreach (Transform child in transform)
{
child.gameObject.layer = LayerMask.NameToLayer("Default");
}
}
}
private void enterADS()
{
animator = GetComponent<Animator>();
animator.SetTrigger("enterADS");
isADS = true;
HUDmanager.Instance.middleDot.SetActive(false);
spreadIntensity = adsSpreadIntensity;
}
private void exitADS()
{
animator.SetTrigger("exitADS");
isADS = false;
HUDmanager.Instance.middleDot.SetActive(true);
spreadIntensity = hipSpreadIntensity;
}
private void FireWeapon()
{
animator = GetComponent<Animator>();
bulletsLeft--;
muzzleEffect.GetComponent<ParticleSystem>().Play();
if (isADS)
{
animator.SetTrigger("Recoil_ADS");
}
else
{
animator.SetTrigger("Recoil");
}
SoundManager.Instance.PlayShootingSound(thisWeaponModel);
readyToShoot = false;
Vector3 shootingDirection = CalculateDirectionAndSpread().normalized;
//Instantiate the bullet
GameObject bullet = Instantiate(bulletPrefab, bulletSpawn.position, Quaternion.identity);
//Applying damage to the bullet
Bullet bul = bullet.GetComponent<Bullet>();
bul.bulletDamage = weaponDamage;
//Pointing the bullet
bullet.transform.forward = shootingDirection;
//Shoot the bullet
bullet.GetComponent<Rigidbody>().AddForce(shootingDirection * bulletVelocity, ForceMode.Impulse);
//Destroy the bullet after some time
StartCoroutine(DestroyBulletAfterTime(bullet, bulletPrefabLifeTime));
//Checking if we are done shooting
if (allowReset)
{
Invoke("ResetShot", shootingDelay);
allowReset = false;
}
//Burst Mode
if (currentShootingMode == ShootingMode.Burst && burstBulletsLeft > 1)//we already shot once before this check
{
burstBulletsLeft--;
Invoke("FireWeapon", shootingDelay);
}
}
private void Reload()
{
animator = GetComponent<Animator>();
SoundManager.Instance.PlayReloadSound(thisWeaponModel);
animator.SetTrigger("Reload");
isReloading = true;
Invoke("reloadCompleted", reloadTime);
}
private void reloadCompleted()
{
if (WeaponManager.Instance.CheckAmmoLeftFor(thisWeaponModel) > magazineSize)
{
bulletsLeft = magazineSize;
WeaponManager.Instance.DecreaseTotalAmmo(bulletsLeft, thisWeaponModel);
}
else
{
bulletsLeft = WeaponManager.Instance.CheckAmmoLeftFor(thisWeaponModel);
WeaponManager.Instance.DecreaseTotalAmmo(bulletsLeft, thisWeaponModel);
}
isReloading = false;
}
private void ResetShot()
{
readyToShoot = true;
allowReset = true;
}
public Vector3 CalculateDirectionAndSpread()
{
//Shooting fron the middle of the screen to check where we are pointing at
Ray ray = Camera.main.ViewportPointToRay(new Vector3(0.5f, 0.5f, 0));
RaycastHit hit;
Vector3 targetPoint;
if (Physics.Raycast(ray, out hit))
{
//Hitting something
targetPoint = hit.point;
}
else
{
//Shooting at the air
targetPoint = ray.GetPoint(100);
}
Vector3 direction = targetPoint - bulletSpawn.position;
float z = UnityEngine.Random.Range(-spreadIntensity, spreadIntensity);
float y = UnityEngine.Random.Range(-spreadIntensity, spreadIntensity);
//Returning the shooting direction and spread
return direction + new Vector3(0, y, z);
}
private IEnumerator DestroyBulletAfterTime(GameObject bullet, float delay)
{
yield return new WaitForSeconds(delay);
Destroy(bullet);
}
}
So i have this script that calls to get the sway script and it seemed to take dominance over the animator. How could i make it so that both can happen at the same time?
Here is the sway script.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Sway : MonoBehaviour
{
#region Variables
public float intensity;
public float smooth;
public bool isMine;
private Quaternion origin_rotation;
#endregion
#region MonoBehaviour Callbacks
private void Start()
{
origin_rotation = transform.localRotation;
}
private void Update()
{
UpdateSway();
}
#endregion
#region Private Methods
private void UpdateSway ()
{
//controls
float t_x_mouse = Input.GetAxis("Mouse X");
float t_y_mouse = Input.GetAxis("Mouse Y");
if(!isMine)
{
t_x_mouse = 0;
t_y_mouse = 0;
}
//calculate target rotation
Quaternion t_x_adj = Quaternion.AngleAxis(-intensity * t_x_mouse, Vector3.up);
Quaternion t_y_adj = Quaternion.AngleAxis(intensity * t_y_mouse, Vector3.right);
Quaternion target_rotation = origin_rotation * t_x_adj * t_y_adj;
//rotate towards target rotation
transform.localRotation = Quaternion.Lerp(transform.localRotation, target_rotation, Time.deltaTime * smooth);
}
#endregion
}