Null reference and GetComponent

Working on a grenade area damage script and am getting null reference error.

Its organized as follows:

  1. -Grenade prefab has a script called ExploGren.cs attached(this is the

    problem script).

  2. -Health.cs is attached to enemy

  3. -When g is pressed, grenadeThrow.cs instantiates grenade prefab, after 5 seconds, ExploGren.cs is called. ExploGren.cs calls Health.cs and applies damage.

A null reference error is displayed when the ExploGren.cs happens. I initialized the Health.cs right, but im sure i used the wrong way to call the Damage() method. So how do i fix this?

using UnityEngine;
using System.Collections;

public class ExploGren : MonoBehaviour 
{
	public GameObject explosivo;//the explosive particle
	private GameObject insta;// instatntiation of variables for explosion

	private float timer = 0.0f;//zero time
	private float timeTD = 5.0f;//time ot detonate

	private int exploDamage = 50;//grenade damage
	private float explosiveRadius = 5.0f;//radious of the explosive damage

	Collider[] collidersInRange;
	Vector3 grenadeOrigin;

	Health damageByGrenadeExplosion;//declare health 

	// Use this for initialization
	void Start () 
	{
		damageByGrenadeExplosion = GetComponent<Health>();
		grenadeOrigin = transform.position;
		collidersInRange = Physics.OverlapSphere(grenadeOrigin, explosiveRadius);

	}
	
	// Update is called once per frame
	void Update () 
	{
		timer +=1 * Time.deltaTime;//start counting

			if(timer >= timeTD)//if timer is equal to detonation, detonate
			{
				insta = (GameObject)Instantiate(explosivo, transform.position, transform.rotation);//create the explosion at the grenades position

				foreach(Collider col in collidersInRange)
			        {
				damageByGrenadeExplosion.Damage(exploDamage);//<--problem is here.
					}
				//Destroy(insta, .70f);
			}


	}
}

Your code is trying to get the Health script attached to the same game object as ExploGren. But according to your question, the Health script is attached to all the enemies. To fix:

  • Delete line 23
  • Insert between line 39 and 40:

damageByGrenadeExplosion = col.GetComponent<Health>();
if (damageByGrenadeExplosion != null)

A couple of other notes.

  • damageByGrenadeExplosion can be declared inside the Update() function rather than at the class level.
  • I don’t know your game mechanic, but line 25 (where you call OverlapSphere) should probably be moved to between line 35 and 36 so that it has fresh data at the time of the explosion.