using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class gun : MonoBehaviour
{
/*[Header("Weapon prefab")]
public GameObject wepaonInHand;
public GameObject pickUpWeapon;*/
[Header("Weapon Damage Info")]
// this is what does damage to objects that have the "Target" script on them
public float damage = 10f;
public float range = 100f;
public float impactForce = 30f;
public float fireRate = 15f;
public enum Mode { Mode1, Mode2, Mode3 }
[Header("Weapon Ammo & Info")]
// this is the ammo information for the gun this script is attacted to.
public int maxAmmo = 15;
public int currentAmmo;
public int maxNumberOfClips = 1;
public int currentClips = 0;
[Header("Weapon Recoil Info")]
// this is the recoil information you can play around with this to setup the recoil for your gun
public float recoil;
public float maxRecoilX = 10;//Play Around with these Variables
public float maxRecoilY = 10;
public float recoilSpeed = 5;
[Header("Weapon Ejector Info")]
// the ejector for the bullet prefab, make sure that you orientate it so that it pops out the ejector correctly.
public float myforce;
public Transform bulletEject;
public GameObject shellCasing;
[Header("Weapon Sway Info 1")]
// this is the weapon sway that you have. play around with these numbers
public float mouseX;
public float mouseY;
public float speed;
Quaternion rotationSpeed;
[Header("Weapon Sway Info 2")]
// this is the weapon sway that you have. play around with these numbers
public float tiltAngle = 4.0f;
public float tiltAmount = 0.001f;
public float smoothComplexity = 3.0f;
[Header("Weapon Aim Info")]
//aiming with your weapon is done via script by using its vector 3 position.
public float scopedFOV = 15f;
public float normalFOV;
public Vector3 aimDownSight;
public Vector3 hipFire;
[Header("Weapon Camera Info")]
// just need both of your cameras here , if your new to unity please look at how my player prefab in the demo folders. is setup to make your own.
public Camera mainCamera;
public Camera fpsCam;
[Header("Weapon Particle Systems Info")]
// gotta make those particle systems for your weapons
public ParticleSystem muzzleFlash;
public GameObject impactPrefab;
public GameObject impactPrefabmetal;
public GameObject impactPrefabwood;
public GameObject impactPrefabwater;
public GameObject impactPrefabstone;
public GameObject impactPrefabflesh;
public GameObject impactPrefabsand;
private GameObject impactGO;
[Header("Weapon Audio Info")]
// this is what makes some noise when your gun does somthing.
public AudioSource audioSource;
public AudioClip gunShotFire;
public AudioClip gunShotEmpty;
[Header("Weapon Reloading Info")]
//your wepaon reloading informations , play around with it to make different reloading times.
public float nextTimeToFire = 0f;
public float reloadTime = 1f;
public bool isReloading = false;
[Header("Weapon Animator Info")]
//animator for some animations on your weapon.
public Animator animator;
[Header("UI Manager")]
//UI information thats is not being used at the momment.
// public uiManager uimanager;
public GameObject crossHair;
///
/// all of my public variables used in this script
///
///
private void Start()
{
// uimanager.refreshAmmo(currentAmmo);
audioSource = GetComponent();
// Start edits //
if (currentAmmo <= 0 && maxNumberOfClips > 0)
{
currentClips = maxNumberOfClips;
currentAmmo = maxAmmo;
// If you want to take a clip away at start (ie. player has just loaded one in)
// uncomment the thing below
currentClips -= 1;
}
// End edits //
}
public void AddRecoil()
{
recoil += 0.01f;
}
void Recoil() // this is the function to add recoil to the weapon " gun "
{
if (recoil > 0)
{
var maxRecoil = Quaternion.Euler(maxRecoilX + Random.Range(-10, 10), maxRecoilY + Random.Range(-10, 10), 0);
transform.localRotation = Quaternion.Slerp(transform.localRotation, maxRecoil, Time.deltaTime * recoilSpeed); // This controls the actual recoil
transform.localEulerAngles = new Vector3(transform.localEulerAngles.x, transform.localEulerAngles.y, transform.localEulerAngles.z); // This one also
recoil -= Time.deltaTime;
}
else
{
recoil = 0;
var minRecoil = Quaternion.Euler(0, 0, 0);
transform.localRotation = Quaternion.Slerp(transform.localRotation, Quaternion.identity, Time.deltaTime * recoilSpeed / 2);
transform.localEulerAngles = new Vector3(transform.localEulerAngles.x, transform.localEulerAngles.y, transform.localEulerAngles.z);
}
}
private void OnEnable() // private function for calling the reloading
{
isReloading = false;
animator.SetBool("Reloading", false);
}
// Update is called once per frame
void Update()
{
/*if (Input.GetKeyDown("e"))
{
wepaonInHand.SetActive(false);
Instantiate(pickUpWeapon, transform.position, transform.rotation);
}*/
Recoil();
// uimanager.refreshAmmo(maxNumberOfClips);
if (isReloading)
return;
if (currentAmmo <= 0)
{
StartCoroutine(Reload());
return;
}
// Start edits //
if (currentAmmo > 0 && Input.GetButton("Fire1") && Time.time >= nextTimeToFire)
{
nextTimeToFire = Time.time + 1f / fireRate;
Shoot();
Recoil();
}
{
float tiltX = Input.GetAxis("Mouse X") * tiltAngle;
float tiltY = Input.GetAxis("Mouse Y") * tiltAngle;
Quaternion target = Quaternion.Euler(tiltY, tiltX, 0);
transform.localRotation = Quaternion.Slerp(transform.localRotation, target, Time.deltaTime * smoothComplexity);
}
//
// mouseX = Input.GetAxis("Mouse X");
//mouseY = Input.GetAxis("Mouse Y");
//rotationSpeed = Quaternion.Euler(-mouseY, mouseX, 0);
//transform.localRotation = Quaternion.Slerp(transform.localRotation, rotationSpeed, speed * Time.deltaTime);
// End edits //
if (Input.GetButtonDown("Fire2"))
{
transform.localPosition = aimDownSight;
crossHair.SetActive(false);
normalFOV = mainCamera.fieldOfView;
mainCamera.fieldOfView = scopedFOV;
}
if (Input.GetButtonUp("Fire2"))
{
transform.localPosition = hipFire;
crossHair.SetActive(true);
mainCamera.fieldOfView = normalFOV;
}
}
IEnumerator Reload()
{
Debug.Log("Reloading....");
// Start edits //
if (currentClips == 0)
{
// No clips? Then no reload for you.
noMoreBullets();
Debug.Log("Reload failed; no clips!");
}
else
{
isReloading = true;
currentClips -= 1; // Take a clip away
yield return new WaitForSeconds(reloadTime);
animator.SetBool("Reloading", false);
currentAmmo = maxAmmo;
isReloading = false;
}
// End edits //
}
// Why is this public? //
void noMoreBullets()
{
if (Input.GetButtonDown("Fire1"))
{
audioSource.PlayOneShot(gunShotEmpty, 0.7F);
}
return;
}
void impactParticleSystems(GameObject particlesystem)
{
}
void Shoot()
{
muzzleFlash.Play();
AddRecoil();
RaycastHit hit;
currentAmmo--;
// UI refresh
// uimanager.refreshAmmo(currentAmmo);
GameObject shellCasings = Instantiate(shellCasing, bulletEject.position, bulletEject.rotation);
shellCasings.GetComponent().AddForce(bulletEject.right * myforce);
Destroy(shellCasings, 2f);
audioSource.PlayOneShot(gunShotFire, 0.7F);
if (Physics.Raycast(fpsCam.transform.position, fpsCam.transform.forward, out hit, range))
{
Debug.Log(hit.transform.name);
switch (hit.collider.tag)
{
case "flesh":
impactGO = impactPrefabflesh;
break;
case "sand":
impactGO = impactPrefabsand;
break;
case "wood":
impactGO = impactPrefabwood;
break;
case "metal":
impactGO = impactPrefabmetal;
break;
case "stone":
impactGO = impactPrefabstone;
break;
case "water":
impactGO = impactPrefabwater;
break;
default:
impactGO = impactPrefab;
break;
}
Destructiable target = hit.transform.GetComponent();
if (target != null)
{
target.TakeDamage(damage);
}
if (hit.rigidbody != null)
{
hit.rigidbody.AddForce(hit.normal * impactForce);
}
GameObject impactgo = Instantiate(impactGO, hit.point, Quaternion.LookRotation(hit.normal));
Destroy(impactgo, 2f);
}
}
}