I understand what this error means, but not why it is occuring

So i am receiving an error from the compiler that there is a reference to an object that is not set to an instance.

In this project at the moment I have 2 scripts. One that controls the motion of an object and its ‘shield level’. I have set an instance of a hero as S and set it to this. The second script is where my error occurs and is the shield itself, which takes information from the shield level in the instance. I In Unity itself, I have a single hero object with the hero script attached to it as well as a shield object that is child to the hero and a script attached to that.
Please help

using UnityEngine;
using System.Collections;

public class Hero : MonoBehaviour {

// Use this for initialization

static public Hero S;

public float speed = 30;
public float rollMult= -60;
public float pitchMult = 25;

public float shieldLevel = 1;

public bool  ______;

void awake()
{
	S = this;
}
void Start () {

}

// Update is called once per frame
void Update () {
//pull info from imported input class

	float xAxis = Input.GetAxis ("Horizontal");
	float yAxis = Input.GetAxis ("Vertical");

	//change transformation based on axis

	Vector3 pos = transform.position;

	pos.x += xAxis * speed * Time.deltaTime;
	pos.y += yAxis * speed * Time.deltaTime;
	transform.position = pos; 

	//rotate ship
	transform.rotation = Quaternion.Euler (yAxis * pitchMult, xAxis * rollMult, 0);
}

}

****End of hero class

using UnityEngine;
using System.Collections;

public class Shield : MonoBehaviour {

public float rotationsPerSecond = .1f;
public bool ___ ;
public int levelShown = 0;
// Use this for initialization


// Update is called once per frame
void Update () {
	//read current shield level from singleton

ERROR IS LINE BELOW HERE****

	int currLevel = Mathf.FloorToInt (Hero.S.shieldLevel);
	//if this is different than lvl shown

	if (levelShown != currLevel) {
		levelShown = currLevel;
		Material mat = this.GetComponent<Renderer>().material;
		//adjust the texture offset to show different shield lvl

		mat.mainTextureOffset = new Vector2(0.2f*levelShown, 0); 

	}

	//rotate dat shield cause its fancy

	float rZ = (rotationsPerSecond * Time.time * 360) % 360f;
	transform.rotation = Quaternion.Euler(0,0,rZ); 
}

}

@unitoi

try this

public static Hero S;

void Awake
{
if(S == null)
S = this;
}

Wondering if you found a solution to this? @unitoi