Search code examples
c#debugginginheritanceunity-game-enginegameobject

Unity; Variable affects general Class rather then specific gameObject with Class attached, and gameObject variable stores value permanently


When the Player shoots the Zombie with Raycast it is supposed to damage the Zombie(clone) until it is destroyed. However, the damage from the Player damages a general Zombie class on variable currentHealth rather than the currentHealth on each Zombie GameObject. Also, the currentHealth value remains even after the game has restarted from start.

console debug errors

public class Zombie : MonoBehaviour
{
    public int currentHealth = 2;

    public void Damage(int damageAmount)
    {
        //subtract damage amount when Damage function is called
        currentHealth -= damageAmount;

        //Check if health has fallen below zero
        if (currentHealth <= 0) 
        {
            //if health has fallen below zero, deactivate it 
            gameObject.SetActive (false);

            //Destroy(gameObject);
        }
        Debug.Log(name + currentHealth);
    }    
}

--

 public class Player : MonoBehaviour
    {
        public RaycastHit hit;
        public int gunDamage = 1;
        public Zombie zombie;
        public Camera fpsCamera;
        public int weaponRange = 50;
        private int layerMask = 1 << 9;

        void Start()
        {
            spawnPoints = playerSpawnPoint.GetComponentsInChildren<Transform>();
           // bullet = GetComponent<GameObject>();
        }

        void LazerBeam()
        {
            Vector3 rayOrigin = fpsCamera.ViewportToWorldPoint(new Vector3(0.5f, 0.5f, 0f));
            Debug.DrawRay(rayOrigin, Vector3.forward * weaponRange, Color.green);

            if (Physics.Raycast(rayOrigin, fpsCamera.transform.forward, out hit, weaponRange, layerMask))
            {
                zombie.Damage(gunDamage); //kills zombie
                Debug.Log(name + " " + zombie);
            }
            Debug.Log(hit.collider);
        }

        void Update() 
        {
            if (Input.GetKeyDown(KeyCode.Z))
            {
                LazerBeam();
            }
        }

Solution

  • You are currently applying damage to the Zombie attached to the player instead of the one attached to the object that was hit. You can get a reference to that from RaycastHit hit.

    if (Physics.Raycast(rayOrigin, fpsCamera.transform.forward, out hit, weaponRange, layerMask))
    {
        Zombie zombieHit = hit.transform.gameObject.GetComponent<Zombie>();
        zombieHit.Damage(gunDamage); //kills zombie
        Debug.Log(name + " " + zombieHit);
    }