- Home /
Enemy Will not die
It may even be a raycast error, although it doe not say anything within my script. But what happens is I have a Zombie Death Script and a gun script; but no matter how I try to shoot the enemy, they will not die or take damage.
ZombieDeath Script: {
public int EnemyHealth = 20;
public GameObject TheEnemy;
public int StatusCheck;
void DamageZombie(int DamageAmount)
{
EnemyHealth -= DamageAmount;
}
void Update()
{
if (EnemyHealth <= 0 && StatusCheck == 0)
{
this.GetComponent<ZombieAI>().enabled = false;
this.GetComponent<BoxCollider>().enabled = false;
StatusCheck = 2;
TheEnemy.GetComponent<Animation>().Stop("walk");
TheEnemy.GetComponent<Animation>().Play("fallingback");
}
}
}
Shooting Script:
{
public GameObject TheGun;
public GameObject MuzzleFlash;
public AudioSource GunFire;
public bool IsFiring = false;
public float TargetDistance;
public int DamageAmount = 5;
void Update()
{
TargetDistance = PlayerCasting.DistanceFromTarget;
if (Input.GetButtonDown("Fire1"))
{
if (IsFiring == false)
{
StartCoroutine(FiringPistol());
}
}
}
IEnumerator FiringPistol()
{
RaycastHit Shot;
IsFiring = true;
if (Physics.Raycast(transform.position, transform.TransformDirection (Vector3.forward), out Shot))
{
Shot.transform.SendMessage("DamageZombie", DamageAmount, SendMessageOptions.DontRequireReceiver);
}
TheGun.GetComponent<Animation>().Play("GunRecoil");
MuzzleFlash.SetActive(true);
MuzzleFlash.GetComponent<Animation>().Play("MuzzleAnim");
GunFire.Play();
yield return new WaitForSeconds(0.5f);
IsFiring = false;
}
}
Answer by Hellium · Feb 03, 2019 at 06:29 PM
Never, Never, NEVER use SendMessage
. There is no good reason to use it.
if ( Physics.Raycast(transform.position, transform.forward, out Shot) )
{
ZombieDeath zombieDeath = Shot.collider.GetComponentInChildren<ZombieDeath>();
if( zombieDeath != null )
zombieDeath.DamageZombie( DamageAmount );
else
Debug.Log("You missed the zombie, but you hit " + Shot.transform.name, Shot.transform ) ;
}
This script could be improved by using layers. Put the zombies into a layer, and use LayerMask mask = LayerMask.GetMask("Zombie");
in the Physics.Raycast
Could you cite exactly where, please? I'm still relatively new to this.
Simply replace your code inside the if (Physics.Raycast...)
by the code inside the code I've provided inside the same if (Physics.Raycast...)
....
Your answer
Follow this Question
Related Questions
Make an enemy only rotate with navmesh agent 1 Answer
Advanced FPS shooting 1 Answer
FPS shooting 1 Answer
FPS recoil 1 Answer
Shooter FPS problem with Raycast 1 Answer