How to make my gun do damge and destroy a object?
Hi I'm having trouble with my gun script again. The problem is My damage script wont work with my gun script. I Tried adjusting stuff in the script but to no avail. If anyone can help please comment down below.
Gun Script
using UnityEngine;
using System.Collections;
public class GunNo : MonoBehaviour
{
private const int V = 3;
//Decal
public GameObject decalHit;
public float projectileDestroyTimer = 5f;
//Ámmo
public int maxAmmoTotal = 30; // Max ammo to carry Example: 30
public int maxAmmoInClipTotal = 5; // Max ammo total to be able to reload Example: 5
public int curAmmo = 30; // Current reloadable ammo Example: 30
public int ammoInClip = 8; // Current ammo in clip Example: 5
private bool isReloading = false;
//Animation
public string fireAnimation; //Shoot animation
public string clipEmptyAnim; //Clip empty animation
public string reloadAnimation; //Reload animation
public float reloadTime = 1f; // How long it takes to reload
public Animator reloadAnimations;
public Animator ClipEmptyAnimations;
//GameObjects
public GameObject weapon; //Needed for aiming
public ParticleSystem muzzleflash;
public Animator FireAnimation;
public AudioSource GunSounds;
//Raycast
private RaycastHit rayHit;
public float shootDistance = 200f;
//Recoil
private float defaultRecoil = 50f;
public float recoil = 50f;
public float recoilAiming = 10f;
//Aim
public Vector3 aimPos = Vector3.zero;
private Vector3 defaultPos = Vector3.zero;
public float smoothTime; //How long it takes to get to the aiming position
private Vector3 dampVelocity;
private bool aiming = false;
//Audio
private AudioSource audioSource; //Audio source
public AudioClip fireSound; //Sound when shooting
public AudioSource clipEmptySound; //Sound when clip is empty
public AudioSource reloadSound; //Sound when reloading
//Weapon
public int hitDamage = 13;
float LastTimeShot;
public float TimeBetweenShots = 1;
public float fireRate = 20f;
private float nextTimeToFire = 0f;
//Only for testing
int removedAmmoRecently; //Only for testing
void Start()
{
defaultPos = weapon.transform.localPosition;
defaultRecoil = recoil;
audioSource = GetComponent<AudioSource>();
}
void Update()
{
AimDownSight();
if (Input.GetButton("Fire1") && Time.time >=nextTimeToFire)
{
nextTimeToFire = Time.time + 1f / fireRate;
Shoot();
}
if(Input.GetButtonDown("Fire2") && !isReloading)
{
aiming = !aiming;
}
if (Input.GetKeyDown(KeyCode.R) && !isReloading)
{
StartCoroutine("Reload");
}
}
void Shoot()
{
if(ammoInClip != 0)
{
PlaySound(fireSound);
GunSounds.Play();
muzzleflash.Play();
PlayAnimation(fireAnimation);
GetComponent<Animator>().Play("FireAnimation");
ammoInClip--;
Ray ray = Camera.main.ScreenPointToRay(new Vector3(Screen.width/2f + Random.Range(-recoil, recoil), Screen.height/2f + Random.Range(-recoil, recoil), 0f));
if (Physics.Raycast(ray, out rayHit, shootDistance))
{
GameObject decalClone = (GameObject)Instantiate(decalHit, rayHit.point, Quaternion.LookRotation(rayHit.normal, Vector3.forward));
Destroy(decalClone, projectileDestroyTimer);
DoDamage(rayHit);
}
}
else{
clipEmptySound.Play();
GetComponent<Animator>().Play("ClipEmptyAnimation");
}
Debug.Log("Ammo: " + ammoInClip + "/" + curAmmo);
}
void DoDamage(RaycastHit hit)
{
if(hit.transform.tag == "Enemy")
{
if(hit.transform.GetComponent<EnemyHealth>()) //You can change EnemyHealth, to the name of the script that contains the health of the enemy
{
hit.transform.SendMessage("ApplyDamage", hitDamage, SendMessageOptions.DontRequireReceiver);
}
Debug.Log(hit.transform.name + " has been hit");
}
}
IEnumerator Reload()
{
//If ammoInClip example 5 is equal or greater than 0 and ammoInClip(5) is lower than maxAmmoInClipTotal(The max amount of ammo that can be in a clip) and curAmmo(how much ammo you have like 5/30) is greater than 0
if (ammoInClip >= 0 && ammoInClip < maxAmmoInClipTotal && curAmmo > 0)
{
isReloading = true;
reloadSound.Play();
GetComponent<Animator>().Play("reloadAnimations");
yield return new WaitForSeconds(reloadTime);
removedAmmoRecently = 0; //You can remove this line, it's only for testing.
for (int i = 0; i < maxAmmoInClipTotal; i++)
{
if (ammoInClip == maxAmmoInClipTotal || curAmmo <= 0)
{
break;
}
else
{
ammoInClip++;
curAmmo--;
removedAmmoRecently++; //You can remove this line, it's only for testing. | To check how much ammo has been removed
}
}
isReloading = false;
Debug.Log("Removed " + removedAmmoRecently + " " + "ammo from pocket ammo. Ammo: " + ammoInClip + "/" + curAmmo); //You can remove this line, it's only for testing. | Prints out how much ammo that has been removed, ammo you have in clip, and how much ammo that is left
}
else
{
yield break;
}
}
void PlayAnimation(string anim)
{
if (anim != "")
{
weapon.GetComponent<Animation>().Play(anim);
}
}
void PlaySound(AudioClip clip)
{
if (clip != null)
{
audioSource.PlayOneShot(clip);
}
}
void AimDownSight()
{
if(aiming && weapon.transform.localPosition.normalized != aimPos.normalized)
{
weapon.transform.localPosition = Vector3.SmoothDamp (weapon.transform.localPosition, aimPos, ref dampVelocity, smoothTime);
Debug.Log ("Aiming");
recoil = recoilAiming;
}
if(!aiming && weapon.transform.localPosition.normalized != defaultPos.normalized)
{
weapon.transform.localPosition = Vector3.SmoothDamp (weapon.transform.localPosition, defaultPos, ref dampVelocity, smoothTime);
Debug.Log ("UnAiming");
recoil = defaultRecoil;
}
}
void OnGUI()
{
GUILayout.Label("Ammo: " + ammoInClip + "/" + curAmmo);
}
}
Here Is the health script
using UnityEngine;
using System.Collections;
public class EnemyHealth : MonoBehaviour
{
public int health = 100;
void Update()
{
if (health <= 0)
{
Debug.Log ("Enemy Health is working");
Dead ();
}
}
public void ApplyDamage(int damageToTake)
{
damageToTake = 50;
health -= damageToTake;
}
void Dead()
{
Destroy (gameObject);
}
}
That's an awful lot of script for us to digest/debug for you. Can you be a bit more specific? When you say it doesn't work, what do you mean? Do you get errors? Does it behave in an unexpected way? For People that know code, if you describe the problem and errors, it's sometimes really quick and easy to spot the error without having to read all the code.
It doesn't have errors when I place it on the object I want it to destroy and shoot it say 15 time it still wont destroy or de spawn the object I've tried changing stuff in both the gun and health script but nothing works I hope this is a little bit more specific.
Answer by KevRev · Apr 28, 2019 at 03:09 PM
Try changing the hit logic in your player script to this:
hit.transform.GetComponent<EnemyHealth>().ApplyDamage(50);
Debug.Log(hit.transform.name + " has been hit");